1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009 Marek Olšák <maraeo@gmail.com> 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @file 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Blitter utility to facilitate acceleration of the clear, clear_render_target, 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * clear_depth_stencil, and resource_copy_region functions. 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @author Marek Olšák 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_shader_tokens.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_blitter.h" 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_draw_quad.h" 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_sampler.h" 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_simple_shaders.h" 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_surface.h" 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_texture.h" 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_upload_mgr.h" 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INVALID_PTR ((void*)~0) 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct blitter_context_priv 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct blitter_context base; 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_upload_mgr *upload; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float vertices[4][2][4]; /**< {pos, color} or {pos, texcoord} */ 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Templates for various state objects. */ 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Constant state objects. */ 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Vertex shaders. */ 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *vs; /**< Vertex shader which passes {pos, generic} to the output.*/ 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *vs_pos_only; /**< Vertex shader which passes pos to the output.*/ 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Fragment shaders. */ 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The shader at index i outputs color to color buffers 0,1,...,i-1. */ 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *fs_col[PIPE_MAX_COLOR_BUFS+1]; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *fs_col_int[PIPE_MAX_COLOR_BUFS+1]; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* FS which outputs a color from a texture, 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org where the index is PIPE_TEXTURE_* to be sampled. */ 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *fs_texfetch_col[PIPE_MAX_TEXTURE_TYPES]; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* FS which outputs a depth from a texture, 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org where the index is PIPE_TEXTURE_* to be sampled. */ 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *fs_texfetch_depth[PIPE_MAX_TEXTURE_TYPES]; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *fs_texfetch_depthstencil[PIPE_MAX_TEXTURE_TYPES]; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *fs_texfetch_stencil[PIPE_MAX_TEXTURE_TYPES]; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* FS which outputs one sample from a multisample texture. */ 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *fs_texfetch_col_msaa[PIPE_MAX_TEXTURE_TYPES]; 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *fs_texfetch_depth_msaa[PIPE_MAX_TEXTURE_TYPES]; 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *fs_texfetch_depthstencil_msaa[PIPE_MAX_TEXTURE_TYPES]; 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *fs_texfetch_stencil_msaa[PIPE_MAX_TEXTURE_TYPES]; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Blend state. */ 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *blend_write_color; /**< blend state with writemask of RGBA */ 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *blend_keep_color; /**< blend state with writemask of 0 */ 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Depth stencil alpha state. */ 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *dsa_write_depth_stencil; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *dsa_write_depth_keep_stencil; 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *dsa_keep_depth_stencil; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *dsa_keep_depth_write_stencil; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Vertex elements states. */ 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *velem_state; 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *velem_uint_state; 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *velem_sint_state; 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *velem_state_readbuf; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Sampler state. */ 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *sampler_state; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Rasterizer state. */ 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *rs_state; 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *rs_discard_state; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Viewport state. */ 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_viewport_state viewport; 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Destination surface dimensions. */ 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dst_width; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dst_height; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean has_geometry_shader; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean vertex_has_integers; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean has_stream_out; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean has_stencil_export; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct blitter_context *util_blitter_create(struct pipe_context *pipe) 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct blitter_context_priv *ctx; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_blend_state blend; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_depth_stencil_alpha_state dsa; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_rasterizer_state rs_state; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_state sampler_state; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_element velem[2]; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx = CALLOC_STRUCT(blitter_context_priv); 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx) 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.pipe = pipe; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.draw_rectangle = util_blitter_draw_rectangle; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* init state objects for them to be considered invalid */ 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_blend_state = INVALID_PTR; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_dsa_state = INVALID_PTR; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_rs_state = INVALID_PTR; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_fs = INVALID_PTR; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_vs = INVALID_PTR; 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_gs = INVALID_PTR; 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_velem_state = INVALID_PTR; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_fb_state.nr_cbufs = ~0; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_num_sampler_views = ~0; 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_num_sampler_states = ~0; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_num_vertex_buffers = ~0; 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_num_so_targets = ~0; 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->has_geometry_shader = 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->screen->get_shader_param(pipe->screen, PIPE_SHADER_GEOMETRY, 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertex_has_integers = 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->screen->get_shader_param(pipe->screen, PIPE_SHADER_VERTEX, 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_SHADER_CAP_INTEGERS); 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->has_stream_out = 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->screen->get_param(pipe->screen, 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS) != 0; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->has_stencil_export = 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->screen->get_param(pipe->screen, 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_CAP_SHADER_STENCIL_EXPORT); 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* blend state objects */ 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&blend, 0, sizeof(blend)); 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->blend_keep_color = pipe->create_blend_state(pipe, &blend); 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].colormask = PIPE_MASK_RGBA; 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->blend_write_color = pipe->create_blend_state(pipe, &blend); 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* depth stencil alpha state objects */ 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&dsa, 0, sizeof(dsa)); 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->dsa_keep_depth_stencil = 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->create_depth_stencil_alpha_state(pipe, &dsa); 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.depth.enabled = 1; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.depth.writemask = 1; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.depth.func = PIPE_FUNC_ALWAYS; 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->dsa_write_depth_keep_stencil = 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->create_depth_stencil_alpha_state(pipe, &dsa); 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[0].enabled = 1; 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[0].func = PIPE_FUNC_ALWAYS; 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE; 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE; 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[0].valuemask = 0xff; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[0].writemask = 0xff; 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->dsa_write_depth_stencil = 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->create_depth_stencil_alpha_state(pipe, &dsa); 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.depth.enabled = 0; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.depth.writemask = 0; 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->dsa_keep_depth_write_stencil = 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->create_depth_stencil_alpha_state(pipe, &dsa); 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* sampler state */ 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&sampler_state, 0, sizeof(sampler_state)); 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler_state.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler_state.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler_state.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler_state.normalized_coords = 1; 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->sampler_state = pipe->create_sampler_state(pipe, &sampler_state); 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* rasterizer state */ 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&rs_state, 0, sizeof(rs_state)); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs_state.cull_face = PIPE_FACE_NONE; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs_state.gl_rasterization_rules = 1; 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs_state.flatshade = 1; 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs_state.depth_clip = 1; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->rs_state = pipe->create_rasterizer_state(pipe, &rs_state); 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->has_stream_out) { 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs_state.rasterizer_discard = 1; 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->rs_discard_state = pipe->create_rasterizer_state(pipe, &rs_state); 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* vertex elements states */ 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&velem[0], 0, sizeof(velem[0]) * 2); 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 2; i++) { 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org velem[i].src_offset = i * 4 * sizeof(float); 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]); 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->vertex_has_integers) { 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&velem[0], 0, sizeof(velem[0]) * 2); 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org velem[0].src_offset = 0; 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org velem[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org velem[1].src_offset = 4 * sizeof(float); 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org velem[1].src_format = PIPE_FORMAT_R32G32B32A32_SINT; 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->velem_sint_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]); 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&velem[0], 0, sizeof(velem[0]) * 2); 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org velem[0].src_offset = 0; 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org velem[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org velem[1].src_offset = 4 * sizeof(float); 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org velem[1].src_format = PIPE_FORMAT_R32G32B32A32_UINT; 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->velem_uint_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]); 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->has_stream_out) { 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org velem[0].src_format = PIPE_FORMAT_R32_UINT; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->velem_state_readbuf = pipe->create_vertex_elements_state(pipe, 1, &velem[0]); 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fragment shaders are created on-demand */ 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* vertex shaders */ 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint semantic_names[] = { TGSI_SEMANTIC_POSITION, 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_SEMANTIC_GENERIC }; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint semantic_indices[] = { 0, 0 }; 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vs = 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_make_vertex_passthrough_shader(pipe, 2, semantic_names, 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org semantic_indices); 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->has_stream_out) { 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_stream_output_info so; 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint semantic_names[] = { TGSI_SEMANTIC_POSITION }; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint semantic_indices[] = { 0 }; 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&so, 0, sizeof(so)); 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so.num_outputs = 1; 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so.output[0].num_components = 1; 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so.stride[0] = 1; 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vs_pos_only = 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_make_vertex_passthrough_shader_with_so(pipe, 1, semantic_names, 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org semantic_indices, &so); 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set invariant vertex coordinates */ 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertices[i][0][3] = 1; /*v.w*/ 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->upload = u_upload_create(pipe, 65536, 4, PIPE_BIND_VERTEX_BUFFER); 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &ctx->base; 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid util_blitter_destroy(struct blitter_context *blitter) 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = blitter->pipe; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_blend_state(pipe, ctx->blend_write_color); 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_blend_state(pipe, ctx->blend_keep_color); 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_depth_stencil_alpha_state(pipe, 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->dsa_write_depth_keep_stencil); 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_rasterizer_state(pipe, ctx->rs_state); 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->rs_discard_state) 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_rasterizer_state(pipe, ctx->rs_discard_state); 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_vs_state(pipe, ctx->vs); 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->vs_pos_only) 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_vs_state(pipe, ctx->vs_pos_only); 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_vertex_elements_state(pipe, ctx->velem_state); 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->vertex_has_integers) { 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_vertex_elements_state(pipe, ctx->velem_sint_state); 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_vertex_elements_state(pipe, ctx->velem_uint_state); 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->velem_state_readbuf) 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_vertex_elements_state(pipe, ctx->velem_state_readbuf); 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) { 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->fs_texfetch_col[i]) 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_fs_state(pipe, ctx->fs_texfetch_col[i]); 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->fs_texfetch_depth[i]) 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]); 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->fs_texfetch_depthstencil[i]) 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_fs_state(pipe, ctx->fs_texfetch_depthstencil[i]); 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->fs_texfetch_stencil[i]) 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_fs_state(pipe, ctx->fs_texfetch_stencil[i]); 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i <= PIPE_MAX_COLOR_BUFS; i++) { 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->fs_col[i]) 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_fs_state(pipe, ctx->fs_col[i]); 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->fs_col_int[i]) 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_fs_state(pipe, ctx->fs_col_int[i]); 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_sampler_state(pipe, ctx->sampler_state); 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_upload_destroy(ctx->upload); 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(ctx); 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void blitter_set_running_flag(struct blitter_context_priv *ctx) 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->base.running) { 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _debug_printf("u_blitter:%i: Caught recursion. This is a driver bug.\n", 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __LINE__); 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.running = TRUE; 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void blitter_unset_running_flag(struct blitter_context_priv *ctx) 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->base.running) { 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _debug_printf("u_blitter:%i: Caught recursion. This is a driver bug.\n", 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __LINE__); 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.running = FALSE; 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void blitter_check_saved_vertex_states(struct blitter_context_priv *ctx) 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ctx->base.saved_num_vertex_buffers != ~0); 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ctx->base.saved_velem_state != INVALID_PTR); 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ctx->base.saved_vs != INVALID_PTR); 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!ctx->has_geometry_shader || ctx->base.saved_gs != INVALID_PTR); 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!ctx->has_stream_out || ctx->base.saved_num_so_targets != ~0); 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ctx->base.saved_rs_state != INVALID_PTR); 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void blitter_restore_vertex_states(struct blitter_context_priv *ctx) 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->base.pipe; 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Vertex buffers. */ 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_vertex_buffers(pipe, 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_num_vertex_buffers, 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_vertex_buffers); 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ctx->base.saved_num_vertex_buffers; i++) { 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->base.saved_vertex_buffers[i].buffer) { 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&ctx->base.saved_vertex_buffers[i].buffer, 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL); 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_num_vertex_buffers = ~0; 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Vertex elements. */ 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_vertex_elements_state(pipe, ctx->base.saved_velem_state); 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_velem_state = INVALID_PTR; 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Vertex shader. */ 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_vs_state(pipe, ctx->base.saved_vs); 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_vs = INVALID_PTR; 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Geometry shader. */ 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->has_geometry_shader) { 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_gs_state(pipe, ctx->base.saved_gs); 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_gs = INVALID_PTR; 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Stream outputs. */ 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->has_stream_out) { 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_stream_output_targets(pipe, 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_num_so_targets, 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_so_targets, ~0); 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ctx->base.saved_num_so_targets; i++) 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_so_target_reference(&ctx->base.saved_so_targets[i], NULL); 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_num_so_targets = ~0; 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Rasterizer. */ 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_rasterizer_state(pipe, ctx->base.saved_rs_state); 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_rs_state = INVALID_PTR; 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void blitter_check_saved_fragment_states(struct blitter_context_priv *ctx) 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ctx->base.saved_fs != INVALID_PTR); 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ctx->base.saved_dsa_state != INVALID_PTR); 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ctx->base.saved_blend_state != INVALID_PTR); 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void blitter_restore_fragment_states(struct blitter_context_priv *ctx) 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->base.pipe; 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Fragment shader. */ 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_fs_state(pipe, ctx->base.saved_fs); 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_fs = INVALID_PTR; 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Depth, stencil, alpha. */ 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_depth_stencil_alpha_state(pipe, ctx->base.saved_dsa_state); 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_dsa_state = INVALID_PTR; 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Blend state. */ 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_blend_state(pipe, ctx->base.saved_blend_state); 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_blend_state = INVALID_PTR; 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Sample mask. */ 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->base.is_sample_mask_saved) { 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_sample_mask(pipe, ctx->base.saved_sample_mask); 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.is_sample_mask_saved = FALSE; 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Miscellaneous states. */ 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX check whether these are saved and whether they need to be restored 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (depending on the operation) */ 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_stencil_ref(pipe, &ctx->base.saved_stencil_ref); 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_viewport_state(pipe, &ctx->base.saved_viewport); 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void blitter_check_saved_fb_state(struct blitter_context_priv *ctx) 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ctx->base.saved_fb_state.nr_cbufs != ~0); 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void blitter_restore_fb_state(struct blitter_context_priv *ctx) 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->base.pipe; 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_framebuffer_state(pipe, &ctx->base.saved_fb_state); 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_unreference_framebuffer_state(&ctx->base.saved_fb_state); 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void blitter_check_saved_textures(struct blitter_context_priv *ctx) 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ctx->base.saved_num_sampler_states != ~0); 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ctx->base.saved_num_sampler_views != ~0); 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void blitter_restore_textures(struct blitter_context_priv *ctx) 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->base.pipe; 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Fragment sampler states. */ 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_fragment_sampler_states(pipe, 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_num_sampler_states, 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_sampler_states); 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_num_sampler_states = ~0; 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Fragment sampler views. */ 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_fragment_sampler_views(pipe, 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_num_sampler_views, 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_sampler_views); 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ctx->base.saved_num_sampler_views; i++) 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&ctx->base.saved_sampler_views[i], NULL); 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.saved_num_sampler_views = ~0; 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void blitter_set_rectangle(struct blitter_context_priv *ctx, 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x1, unsigned y1, 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x2, unsigned y2, 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float depth) 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set vertex positions */ 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertices[0][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v0.x*/ 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertices[0][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v0.y*/ 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertices[1][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v1.x*/ 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertices[1][0][1] = (float)y1 / ctx->dst_height * 2.0f - 1.0f; /*v1.y*/ 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertices[2][0][0] = (float)x2 / ctx->dst_width * 2.0f - 1.0f; /*v2.x*/ 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertices[2][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v2.y*/ 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertices[3][0][0] = (float)x1 / ctx->dst_width * 2.0f - 1.0f; /*v3.x*/ 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertices[3][0][1] = (float)y2 / ctx->dst_height * 2.0f - 1.0f; /*v3.y*/ 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertices[i][0][2] = depth; /*z*/ 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* viewport */ 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->viewport.scale[0] = 0.5f * ctx->dst_width; 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->viewport.scale[1] = 0.5f * ctx->dst_height; 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->viewport.scale[2] = 1.0f; 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->viewport.scale[3] = 1.0f; 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->viewport.translate[0] = 0.5f * ctx->dst_width; 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->viewport.translate[1] = 0.5f * ctx->dst_height; 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->viewport.translate[2] = 0.0f; 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->viewport.translate[3] = 0.0f; 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->base.pipe->set_viewport_state(ctx->base.pipe, &ctx->viewport); 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void blitter_set_clear_color(struct blitter_context_priv *ctx, 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const union pipe_color_union *color) 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (color) { 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *uiverts = (uint32_t *)ctx->vertices[i][1]; 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uiverts[0] = color->ui[0]; 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uiverts[1] = color->ui[1]; 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uiverts[2] = color->ui[2]; 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uiverts[3] = color->ui[3]; 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertices[i][1][0] = 0; 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertices[i][1][1] = 0; 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertices[i][1][2] = 0; 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertices[i][1][3] = 0; 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void get_texcoords(struct pipe_sampler_view *src, 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned src_width0, unsigned src_height0, 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x1, unsigned y1, 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x2, unsigned y2, 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float out[4]) 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *tex = src->texture; 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned level = src->u.tex.first_level; 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean normalized = tex->target != PIPE_TEXTURE_RECT && 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->nr_samples <= 1; 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (normalized) { 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out[0] = x1 / (float)u_minify(src_width0, level); 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out[1] = y1 / (float)u_minify(src_height0, level); 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out[2] = x2 / (float)u_minify(src_width0, level); 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out[3] = y2 / (float)u_minify(src_height0, level); 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out[0] = x1; 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out[1] = y1; 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out[2] = x2; 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out[3] = y2; 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void set_texcoords_in_vertices(const float coord[4], 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float *out, unsigned stride) 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out[0] = coord[0]; /*t0.s*/ 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out[1] = coord[1]; /*t0.t*/ 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out += stride; 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out[0] = coord[2]; /*t1.s*/ 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out[1] = coord[1]; /*t1.t*/ 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out += stride; 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out[0] = coord[2]; /*t2.s*/ 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out[1] = coord[3]; /*t2.t*/ 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out += stride; 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out[0] = coord[0]; /*t3.s*/ 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out[1] = coord[3]; /*t3.t*/ 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void blitter_set_texcoords(struct blitter_context_priv *ctx, 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *src, 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned src_width0, unsigned src_height0, 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned layer, unsigned sample, 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x1, unsigned y1, 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x2, unsigned y2) 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float coord[4]; 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float face_coord[4][2]; 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_texcoords(src, src_width0, src_height0, x1, y1, x2, y2, coord); 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src->texture->target == PIPE_TEXTURE_CUBE) { 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_texcoords_in_vertices(coord, &face_coord[0][0], 2); 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_map_texcoords2d_onto_cubemap(layer, 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* pointer, stride in floats */ 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &face_coord[0][0], 2, 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &ctx->vertices[0][1][0], 8); 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_texcoords_in_vertices(coord, &ctx->vertices[0][1][0], 8); 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set the layer. */ 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (src->texture->target) { 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_3D: 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float r = layer / (float)u_minify(src->texture->depth0, 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->u.tex.first_level); 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertices[i][1][2] = r; /*r*/ 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_1D_ARRAY: 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertices[i][1][1] = layer; /*t*/ 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_2D_ARRAY: 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertices[i][1][2] = layer; /*r*/ 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertices[i][1][3] = sample; /*q*/ 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_2D: 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertices[i][1][2] = sample; /*r*/ 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default:; 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void blitter_set_dst_dimensions(struct blitter_context_priv *ctx, 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height) 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->dst_width = width; 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->dst_height = height; 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid *blitter_get_fs_col(struct blitter_context_priv *ctx, unsigned num_cbufs, 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean int_format) 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->base.pipe; 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(num_cbufs <= PIPE_MAX_COLOR_BUFS); 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (int_format) { 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->fs_col_int[num_cbufs]) 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->fs_col_int[num_cbufs] = 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_make_fragment_cloneinput_shader(pipe, num_cbufs, 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_SEMANTIC_GENERIC, 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_INTERPOLATE_CONSTANT); 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->fs_col_int[num_cbufs]; 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->fs_col[num_cbufs]) 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->fs_col[num_cbufs] = 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_make_fragment_cloneinput_shader(pipe, num_cbufs, 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_SEMANTIC_GENERIC, 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_INTERPOLATE_LINEAR); 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->fs_col[num_cbufs]; 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid *blitter_get_fs_texfetch_col(struct blitter_context_priv *ctx, 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *tex) 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->base.pipe; 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(tex->target < PIPE_MAX_TEXTURE_TYPES); 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tex->nr_samples > 1) { 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void **shader = &ctx->fs_texfetch_col_msaa[tex->target]; 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Create the fragment shader on-demand. */ 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!*shader) { 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->nr_samples); 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *shader = util_make_fs_blit_msaa_color(pipe, tgsi_tex); 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return *shader; 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void **shader = &ctx->fs_texfetch_col[tex->target]; 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Create the fragment shader on-demand. */ 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!*shader) { 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 0); 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *shader = 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_make_fragment_tex_shader(pipe, tgsi_tex, 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_INTERPOLATE_LINEAR); 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return *shader; 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid *blitter_get_fs_texfetch_depth(struct blitter_context_priv *ctx, 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *tex) 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->base.pipe; 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(tex->target < PIPE_MAX_TEXTURE_TYPES); 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tex->nr_samples > 1) { 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void **shader = &ctx->fs_texfetch_depth_msaa[tex->target]; 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Create the fragment shader on-demand. */ 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!*shader) { 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->nr_samples); 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *shader = 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_make_fs_blit_msaa_depth(pipe, tgsi_tex); 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return *shader; 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void **shader = &ctx->fs_texfetch_depth[tex->target]; 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Create the fragment shader on-demand. */ 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!*shader) { 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 0); 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *shader = 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_make_fragment_tex_shader_writedepth(pipe, tgsi_tex, 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_INTERPOLATE_LINEAR); 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return *shader; 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid *blitter_get_fs_texfetch_depthstencil(struct blitter_context_priv *ctx, 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *tex) 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->base.pipe; 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(tex->target < PIPE_MAX_TEXTURE_TYPES); 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tex->nr_samples > 1) { 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void **shader = &ctx->fs_texfetch_depthstencil_msaa[tex->target]; 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Create the fragment shader on-demand. */ 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!*shader) { 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->nr_samples); 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *shader = 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_make_fs_blit_msaa_depthstencil(pipe, tgsi_tex); 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return *shader; 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void **shader = &ctx->fs_texfetch_depthstencil[tex->target]; 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Create the fragment shader on-demand. */ 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!*shader) { 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 0); 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *shader = 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_make_fragment_tex_shader_writedepthstencil(pipe, tgsi_tex, 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_INTERPOLATE_LINEAR); 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return *shader; 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid *blitter_get_fs_texfetch_stencil(struct blitter_context_priv *ctx, 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *tex) 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->base.pipe; 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(tex->target < PIPE_MAX_TEXTURE_TYPES); 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tex->nr_samples > 1) { 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void **shader = &ctx->fs_texfetch_stencil_msaa[tex->target]; 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Create the fragment shader on-demand. */ 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!*shader) { 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->nr_samples); 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *shader = 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_make_fs_blit_msaa_stencil(pipe, tgsi_tex); 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return *shader; 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void **shader = &ctx->fs_texfetch_stencil[tex->target]; 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Create the fragment shader on-demand. */ 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!*shader) { 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(tex->target, 0); 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *shader = 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_make_fragment_tex_shader_writestencil(pipe, tgsi_tex, 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_INTERPOLATE_LINEAR); 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return *shader; 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void blitter_set_common_draw_rect_state(struct blitter_context_priv *ctx) 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->base.pipe; 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_rasterizer_state(pipe, ctx->rs_state); 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_vs_state(pipe, ctx->vs); 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->has_geometry_shader) 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_gs_state(pipe, NULL); 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->has_stream_out) 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_stream_output_targets(pipe, 0, NULL, 0); 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void blitter_draw(struct blitter_context_priv *ctx, 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x1, unsigned y1, 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x2, unsigned y2, 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float depth) 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *buf = NULL; 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned offset = 0; 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_rectangle(ctx, x1, y1, x2, y2, depth); 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_upload_data(ctx->upload, 0, sizeof(ctx->vertices), ctx->vertices, 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &offset, &buf); 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_upload_unmap(ctx->upload); 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_draw_vertex_buffer(ctx->base.pipe, NULL, buf, offset, 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_PRIM_TRIANGLE_FAN, 4, 2); 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&buf, NULL); 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid util_blitter_draw_rectangle(struct blitter_context *blitter, 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x1, unsigned y1, 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x2, unsigned y2, 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float depth, 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum blitter_attrib_type type, 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const union pipe_color_union *attrib) 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (type) { 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_BLITTER_ATTRIB_COLOR: 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_clear_color(ctx, attrib); 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_BLITTER_ATTRIB_TEXCOORD: 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_texcoords_in_vertices(attrib->f, &ctx->vertices[0][1][0], 8); 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default:; 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_draw(ctx, x1, y1, x2, y2, depth); 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void util_blitter_clear_custom(struct blitter_context *blitter, 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height, 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_cbufs, 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned clear_buffers, 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format cbuf_format, 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const union pipe_color_union *color, 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org double depth, unsigned stencil, 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *custom_blend, void *custom_dsa) 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->base.pipe; 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_stencil_ref sr = { { 0 } }; 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean int_format = util_format_is_pure_integer(cbuf_format); 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(num_cbufs <= PIPE_MAX_COLOR_BUFS); 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_running_flag(ctx); 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_check_saved_vertex_states(ctx); 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_check_saved_fragment_states(ctx); 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* bind states */ 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (custom_blend) { 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_blend_state(pipe, custom_blend); 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (clear_buffers & PIPE_CLEAR_COLOR) { 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_blend_state(pipe, ctx->blend_write_color); 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_blend_state(pipe, ctx->blend_keep_color); 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (custom_dsa) { 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_depth_stencil_alpha_state(pipe, custom_dsa); 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) { 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (clear_buffers & PIPE_CLEAR_DEPTH) { 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil); 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (clear_buffers & PIPE_CLEAR_STENCIL) { 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sr.ref_value[0] = stencil & 0xff; 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_stencil_ref(pipe, &sr); 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (util_format_is_pure_sint(cbuf_format)) { 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_vertex_elements_state(pipe, ctx->velem_sint_state); 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (util_format_is_pure_uint(cbuf_format)) { 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_vertex_elements_state(pipe, ctx->velem_uint_state); 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, num_cbufs, int_format)); 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_sample_mask(pipe, ~0); 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_common_draw_rect_state(ctx); 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_dst_dimensions(ctx, width, height); 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter->draw_rectangle(blitter, 0, 0, width, height, depth, 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_BLITTER_ATTRIB_COLOR, color); 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_vertex_states(ctx); 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_fragment_states(ctx); 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_unset_running_flag(ctx); 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid util_blitter_clear(struct blitter_context *blitter, 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height, 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_cbufs, 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned clear_buffers, 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format cbuf_format, 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const union pipe_color_union *color, 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org double depth, unsigned stencil) 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_blitter_clear_custom(blitter, width, height, num_cbufs, 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clear_buffers, cbuf_format, color, depth, stencil, 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, NULL); 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid util_blitter_custom_clear_depth(struct blitter_context *blitter, 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height, 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org double depth, void *custom_dsa) 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const union pipe_color_union color; 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_blitter_clear_custom(blitter, width, height, 0, 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, PIPE_FORMAT_NONE, &color, depth, 0, NULL, custom_dsa); 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean is_overlap(unsigned dstx, unsigned dsty, unsigned dstz, 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_box *srcbox) 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_box src = *srcbox; 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src.width < 0) { 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src.x += src.width; 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src.width = -src.width; 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src.height < 0) { 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src.y += src.height; 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src.height = -src.height; 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src.depth < 0) { 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src.z += src.depth; 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src.depth = -src.depth; 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return src.x < dstx+src.width && src.x+src.width > dstx && 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src.y < dsty+src.height && src.y+src.height > dsty && 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src.z < dstz+src.depth && src.z+src.depth > dstz; 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid util_blitter_default_dst_texture(struct pipe_surface *dst_templ, 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *dst, 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dstlevel, 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dstz, 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_box *srcbox) 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(dst_templ, 0, sizeof(*dst_templ)); 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_templ->format = dst->format; 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (util_format_is_depth_or_stencil(dst->format)) { 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_templ->usage = PIPE_BIND_DEPTH_STENCIL; 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_templ->usage = PIPE_BIND_RENDER_TARGET; 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_templ->format = util_format_linear(dst->format); 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_templ->u.tex.level = dstlevel; 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_templ->u.tex.first_layer = dstz; 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_templ->u.tex.last_layer = dstz + srcbox->depth - 1; 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid util_blitter_default_src_texture(struct pipe_sampler_view *src_templ, 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *src, 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned srclevel) 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(src_templ, 0, sizeof(*src_templ)); 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_templ->format = util_format_linear(src->format); 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_templ->u.tex.first_level = srclevel; 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_templ->u.tex.last_level = srclevel; 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_templ->u.tex.first_layer = 0; 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_templ->u.tex.last_layer = 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->target == PIPE_TEXTURE_3D ? u_minify(src->depth0, srclevel) - 1 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : src->array_size - 1; 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_templ->swizzle_r = PIPE_SWIZZLE_RED; 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_templ->swizzle_g = PIPE_SWIZZLE_GREEN; 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_templ->swizzle_b = PIPE_SWIZZLE_BLUE; 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_templ->swizzle_a = PIPE_SWIZZLE_ALPHA; 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean util_blitter_is_copy_supported(struct blitter_context *blitter, 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_resource *dst, 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_resource *src, 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned mask) 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_screen *screen = ctx->base.pipe->screen; 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst) { 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned bind; 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean is_stencil; 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc = 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_format_description(dst->format); 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org is_stencil = util_format_has_stencil(desc); 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Stencil export must be supported for stencil copy. */ 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((mask & PIPE_MASK_S) && is_stencil && !ctx->has_stencil_export) { 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_stencil || util_format_has_depth(desc)) 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind = PIPE_BIND_DEPTH_STENCIL; 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind = PIPE_BIND_RENDER_TARGET; 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!screen->is_format_supported(screen, dst->format, dst->target, 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->nr_samples, bind)) { 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src) { 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!screen->is_format_supported(screen, src->format, src->target, 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->nr_samples, PIPE_BIND_SAMPLER_VIEW)) { 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Check stencil sampler support for stencil copy. */ 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (util_format_has_stencil(util_format_description(src->format))) { 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format stencil_format = 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_format_stencil_only(src->format); 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(stencil_format != PIPE_FORMAT_NONE); 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (stencil_format != src->format && 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !screen->is_format_supported(screen, stencil_format, src->target, 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->nr_samples, PIPE_BIND_SAMPLER_VIEW)) { 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid util_blitter_copy_texture(struct blitter_context *blitter, 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *dst, 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dst_level, unsigned dst_sample_mask, 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dstx, unsigned dsty, unsigned dstz, 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *src, 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned src_level, unsigned src_sample, 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_box *srcbox) 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->base.pipe; 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *dst_view, dst_templ; 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view src_templ, *src_view; 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst && src); 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src->target < PIPE_MAX_TEXTURE_TYPES); 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Initialize the surface. */ 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_blitter_default_dst_texture(&dst_templ, dst, dst_level, dstz, srcbox); 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_view = pipe->create_surface(pipe, dst, &dst_templ); 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Initialize the sampler view. */ 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_blitter_default_src_texture(&src_templ, src, src_level); 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_view = pipe->create_sampler_view(pipe, src, &src_templ); 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Copy. */ 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_blitter_copy_texture_view(blitter, dst_view, dst_sample_mask, dstx, 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsty, src_view, src_sample, srcbox, 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->width0, src->height0, PIPE_MASK_RGBAZS); 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_surface_reference(&dst_view, NULL); 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&src_view, NULL); 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid util_blitter_copy_texture_view(struct blitter_context *blitter, 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *dst, 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dst_sample_mask, 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dstx, unsigned dsty, 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *src, 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned src_sample, 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_box *srcbox, 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned src_width0, unsigned src_height0, 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned mask) 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->base.pipe; 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state fb_state; 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_texture_target src_target = src->texture->target; 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int abs_width = abs(srcbox->width); 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int abs_height = abs(srcbox->height); 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean blit_stencil, blit_depth; 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *src_desc = 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_format_description(src->format); 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blit_depth = util_format_has_depth(src_desc) && (mask & PIPE_MASK_Z); 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blit_stencil = util_format_has_stencil(src_desc) && (mask & PIPE_MASK_S); 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If you want a fallback for stencil copies, 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * use util_blitter_copy_texture. */ 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (blit_stencil && !ctx->has_stencil_export) { 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blit_stencil = FALSE; 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!blit_depth) 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Sanity checks. */ 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst->texture == src->texture && 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->u.tex.level == src->u.tex.first_level) { 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!is_overlap(dstx, dsty, 0, srcbox)); 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX should handle 3d regions */ 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(srcbox->depth == 1); 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Check whether the states are properly saved. */ 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_running_flag(ctx); 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_check_saved_vertex_states(ctx); 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_check_saved_fragment_states(ctx); 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_check_saved_textures(ctx); 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_check_saved_fb_state(ctx); 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Initialize framebuffer state. */ 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.width = dst->width; 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.height = dst->height; 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (blit_depth || blit_stencil) { 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_blend_state(pipe, ctx->blend_keep_color); 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (blit_depth && blit_stencil) { 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_depth_stencil_alpha_state(pipe, 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->dsa_write_depth_stencil); 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_fs_state(pipe, 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_get_fs_texfetch_depthstencil(ctx, src->texture)); 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (blit_depth) { 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_depth_stencil_alpha_state(pipe, 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->dsa_write_depth_keep_stencil); 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_fs_state(pipe, 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_get_fs_texfetch_depth(ctx, src->texture)); 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { /* is_stencil */ 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_depth_stencil_alpha_state(pipe, 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->dsa_keep_depth_write_stencil); 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_fs_state(pipe, 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_get_fs_texfetch_stencil(ctx, src->texture)); 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.nr_cbufs = 0; 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.zsbuf = dst; 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_blend_state(pipe, ctx->blend_write_color); 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_fs_state(pipe, 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_get_fs_texfetch_col(ctx, src->texture)); 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.nr_cbufs = 1; 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.cbufs[0] = dst; 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.zsbuf = 0; 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (blit_depth && blit_stencil) { 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Setup two samplers, one for depth and the other one for stencil. */ 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view templ; 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *views[2]; 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *samplers[2] = {ctx->sampler_state, ctx->sampler_state}; 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ = *src; 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.format = util_format_stencil_only(templ.format); 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(templ.format != PIPE_FORMAT_NONE); 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org views[0] = src; 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org views[1] = pipe->create_sampler_view(pipe, src->texture, &templ); 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_fragment_sampler_views(pipe, 2, views); 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_fragment_sampler_states(pipe, 2, samplers); 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&views[1], NULL); 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (blit_stencil) { 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set a stencil-only sampler view for it not to sample depth instead. */ 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view templ; 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *view; 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ = *src; 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.format = util_format_stencil_only(templ.format); 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(templ.format != PIPE_FORMAT_NONE); 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view = pipe->create_sampler_view(pipe, src->texture, &templ); 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_fragment_sampler_views(pipe, 1, &view); 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_fragment_sampler_states(pipe, 1, &ctx->sampler_state); 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&view, NULL); 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_fragment_sampler_views(pipe, 1, &src); 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_fragment_sampler_states(pipe, 1, &ctx->sampler_state); 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_framebuffer_state(pipe, &fb_state); 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_sample_mask(pipe, dst_sample_mask); 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_common_draw_rect_state(ctx); 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_dst_dimensions(ctx, dst->width, dst->height); 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((src_target == PIPE_TEXTURE_1D || 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_target == PIPE_TEXTURE_2D || 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_target == PIPE_TEXTURE_RECT) && 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->texture->nr_samples <= 1) { 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Draw the quad with the draw_rectangle callback. */ 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set texture coordinates. - use a pipe color union 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for interface purposes. 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX pipe_color_union is a wrong name since we use that to set 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texture coordinates too. 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org union pipe_color_union coord; 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_texcoords(src, src_width0, src_height0, srcbox->x, srcbox->y, 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcbox->x+srcbox->width, srcbox->y+srcbox->height, coord.f); 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Draw. */ 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter->draw_rectangle(blitter, dstx, dsty, dstx+abs_width, dsty+abs_height, 0, 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_BLITTER_ATTRIB_TEXCOORD, &coord); 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Draw the quad with the generic codepath. */ 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_texcoords(ctx, src, src_width0, src_height0, srcbox->z, 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_sample, 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcbox->x, srcbox->y, 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcbox->x + srcbox->width, srcbox->y + srcbox->height); 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_draw(ctx, dstx, dsty, dstx+abs_width, dsty+abs_height, 0); 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_vertex_states(ctx); 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_fragment_states(ctx); 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_textures(ctx); 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_fb_state(ctx); 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_unset_running_flag(ctx); 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Clear a region of a color surface to a constant value. */ 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid util_blitter_clear_render_target(struct blitter_context *blitter, 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *dstsurf, 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const union pipe_color_union *color, 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dstx, unsigned dsty, 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height) 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->base.pipe; 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state fb_state; 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dstsurf->texture); 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dstsurf->texture) 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check the saved state */ 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_running_flag(ctx); 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_check_saved_vertex_states(ctx); 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_check_saved_fragment_states(ctx); 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_check_saved_fb_state(ctx); 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* bind states */ 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_blend_state(pipe, ctx->blend_write_color); 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1, FALSE)); 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set a framebuffer state */ 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.width = dstsurf->width; 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.height = dstsurf->height; 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.nr_cbufs = 1; 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.cbufs[0] = dstsurf; 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.zsbuf = 0; 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_framebuffer_state(pipe, &fb_state); 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_sample_mask(pipe, ~0); 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_common_draw_rect_state(ctx); 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, 0, 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_BLITTER_ATTRIB_COLOR, color); 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_vertex_states(ctx); 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_fragment_states(ctx); 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_fb_state(ctx); 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_unset_running_flag(ctx); 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Clear a region of a depth stencil surface. */ 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid util_blitter_clear_depth_stencil(struct blitter_context *blitter, 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *dstsurf, 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned clear_flags, 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org double depth, 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned stencil, 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dstx, unsigned dsty, 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height) 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->base.pipe; 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state fb_state; 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_stencil_ref sr = { { 0 } }; 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dstsurf->texture); 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dstsurf->texture) 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check the saved state */ 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_running_flag(ctx); 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_check_saved_vertex_states(ctx); 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_check_saved_fragment_states(ctx); 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_check_saved_fb_state(ctx); 1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* bind states */ 1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_blend_state(pipe, ctx->blend_keep_color); 1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((clear_flags & PIPE_CLEAR_DEPTHSTENCIL) == PIPE_CLEAR_DEPTHSTENCIL) { 1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sr.ref_value[0] = stencil & 0xff; 1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_stencil); 1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_stencil_ref(pipe, &sr); 1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (clear_flags & PIPE_CLEAR_DEPTH) { 1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_write_depth_keep_stencil); 1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (clear_flags & PIPE_CLEAR_STENCIL) { 1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sr.ref_value[0] = stencil & 0xff; 1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_write_stencil); 1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_stencil_ref(pipe, &sr); 1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* hmm that should be illegal probably, or make it a no-op somewhere */ 1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0, FALSE)); 1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set a framebuffer state */ 1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.width = dstsurf->width; 1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.height = dstsurf->height; 1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.nr_cbufs = 0; 1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.cbufs[0] = 0; 1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.zsbuf = dstsurf; 1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_framebuffer_state(pipe, &fb_state); 1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_sample_mask(pipe, ~0); 1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_common_draw_rect_state(ctx); 1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter->draw_rectangle(blitter, dstx, dsty, dstx+width, dsty+height, depth, 1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_BLITTER_ATTRIB_NONE, NULL); 1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_vertex_states(ctx); 1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_fragment_states(ctx); 1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_fb_state(ctx); 1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_unset_running_flag(ctx); 1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* draw a rectangle across a region using a custom dsa stage - for r600g */ 1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid util_blitter_custom_depth_stencil(struct blitter_context *blitter, 1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *zsurf, 1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *cbsurf, 1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned sample_mask, 1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *dsa_stage, float depth) 1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->base.pipe; 1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state fb_state; 1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(zsurf->texture); 1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!zsurf->texture) 1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check the saved state */ 1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_running_flag(ctx); 1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_check_saved_vertex_states(ctx); 1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_check_saved_fragment_states(ctx); 1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_check_saved_fb_state(ctx); 1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* bind states */ 1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_blend_state(pipe, ctx->blend_write_color); 1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_depth_stencil_alpha_state(pipe, dsa_stage); 1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0, FALSE)); 1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set a framebuffer state */ 1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.width = zsurf->width; 1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.height = zsurf->height; 1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.nr_cbufs = 1; 1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cbsurf) { 1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.cbufs[0] = cbsurf; 1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.nr_cbufs = 1; 1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.cbufs[0] = NULL; 1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.nr_cbufs = 0; 1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.zsbuf = zsurf; 1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_framebuffer_state(pipe, &fb_state); 1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_sample_mask(pipe, sample_mask); 1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_common_draw_rect_state(ctx); 1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_dst_dimensions(ctx, zsurf->width, zsurf->height); 1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter->draw_rectangle(blitter, 0, 0, zsurf->width, zsurf->height, depth, 1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_BLITTER_ATTRIB_NONE, NULL); 1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_vertex_states(ctx); 1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_fragment_states(ctx); 1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_fb_state(ctx); 1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_unset_running_flag(ctx); 1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid util_blitter_copy_buffer(struct blitter_context *blitter, 1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *dst, 1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dstx, 1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *src, 1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned srcx, 1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size) 1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->base.pipe; 1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_buffer vb; 1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_stream_output_target *so_target; 1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcx >= src->width0 || 1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstx >= dst->width0) { 1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcx + size > src->width0) { 1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = src->width0 - srcx; 1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstx + size > dst->width0) { 1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = dst->width0 - dstx; 1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Drivers not capable of Stream Out should not call this function 1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in the first place. */ 1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ctx->has_stream_out); 1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Some alignment is required. */ 1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcx % 4 != 0 || dstx % 4 != 0 || size % 4 != 0 || 1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !ctx->has_stream_out) { 1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_box box; 1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_box_1d(srcx, size, &box); 1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_resource_copy_region(pipe, dst, 0, dstx, 0, 0, src, 0, &box); 1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_running_flag(ctx); 1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_check_saved_vertex_states(ctx); 1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb.buffer = src; 1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb.buffer_offset = srcx; 1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb.stride = 4; 1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_vertex_buffers(pipe, 1, &vb); 1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_vertex_elements_state(pipe, ctx->velem_state_readbuf); 1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_vs_state(pipe, ctx->vs_pos_only); 1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->has_geometry_shader) 1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_gs_state(pipe, NULL); 1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_rasterizer_state(pipe, ctx->rs_discard_state); 1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so_target = pipe->create_stream_output_target(pipe, dst, dstx, size); 1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_stream_output_targets(pipe, 1, &so_target, 0); 1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_draw_arrays(pipe, PIPE_PRIM_POINTS, 0, size / 4); 1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_vertex_states(ctx); 1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_unset_running_flag(ctx); 1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_so_target_reference(&so_target, NULL); 1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* probably radeon specific */ 1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid util_blitter_custom_resolve_color(struct blitter_context *blitter, 1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *dst, 1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dst_level, 1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dst_layer, 1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *src, 1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned src_layer, 1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned sample_mask, 1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *custom_blend) 1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->base.pipe; 1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state fb_state; 1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *srcsurf, *dstsurf, surf_tmpl; 1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_running_flag(ctx); 1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_check_saved_vertex_states(ctx); 1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_check_saved_fragment_states(ctx); 1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* bind states */ 1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_blend_state(pipe, custom_blend); 1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1, FALSE)); 1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_sample_mask(pipe, sample_mask); 1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&surf_tmpl, 0, sizeof(surf_tmpl)); 1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf_tmpl.format = dst->format; 1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf_tmpl.u.tex.level = dst_level; 1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf_tmpl.u.tex.first_layer = dst_layer; 1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf_tmpl.u.tex.last_layer = dst_layer; 1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf_tmpl.usage = PIPE_BIND_RENDER_TARGET; 1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstsurf = pipe->create_surface(pipe, dst, &surf_tmpl); 1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf_tmpl.u.tex.level = 0; 1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf_tmpl.u.tex.first_layer = src_layer; 1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf_tmpl.u.tex.last_layer = src_layer; 1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcsurf = pipe->create_surface(pipe, src, &surf_tmpl); 1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set a framebuffer state */ 1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.width = src->width0; 1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.height = src->height0; 1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.nr_cbufs = 2; 1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.cbufs[0] = srcsurf; 1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.cbufs[1] = dstsurf; 1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.zsbuf = NULL; 1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_framebuffer_state(pipe, &fb_state); 1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_common_draw_rect_state(ctx); 1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_dst_dimensions(ctx, src->width0, src->height0); 1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter->draw_rectangle(blitter, 0, 0, src->width0, src->height0, 1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, NULL); 1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_fb_state(ctx); 1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_vertex_states(ctx); 1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_fragment_states(ctx); 1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_unset_running_flag(ctx); 1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_surface_reference(&srcsurf, NULL); 1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_surface_reference(&dstsurf, NULL); 1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid util_blitter_custom_color(struct blitter_context *blitter, 1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *dstsurf, 1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *custom_blend) 1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; 1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->base.pipe; 1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state fb_state; 1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dstsurf->texture); 1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dstsurf->texture) 1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check the saved state */ 1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_running_flag(ctx); 1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_check_saved_vertex_states(ctx); 1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_check_saved_fragment_states(ctx); 1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_check_saved_fb_state(ctx); 1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* bind states */ 1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_blend_state(pipe, custom_blend); 1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil); 1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1, FALSE)); 1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_vertex_elements_state(pipe, ctx->velem_state); 1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_sample_mask(pipe, (1ull << MAX2(1, dstsurf->texture->nr_samples)) - 1); 1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set a framebuffer state */ 1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.width = dstsurf->width; 1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.height = dstsurf->height; 1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.nr_cbufs = 1; 1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.cbufs[0] = dstsurf; 1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb_state.zsbuf = 0; 1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_framebuffer_state(pipe, &fb_state); 1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_sample_mask(pipe, ~0); 1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_common_draw_rect_state(ctx); 1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); 1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter->draw_rectangle(blitter, 0, 0, dstsurf->width, dstsurf->height, 1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, NULL); 1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_vertex_states(ctx); 1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_fragment_states(ctx); 1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_restore_fb_state(ctx); 1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blitter_unset_running_flag(ctx); 1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1610