1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @file 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Wrap the cso cache & hash mechanisms in a simplified 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pipe-driver-specific interface. 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @author Zack Rusin <zack@tungstengraphics.com> 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @author Keith Whitwell <keith@tungstengraphics.com> 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_draw.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_framebuffer.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_vbuf.h" 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_parse.h" 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "cso_cache/cso_context.h" 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "cso_cache/cso_cache.h" 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "cso_cache/cso_hash.h" 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "cso_context.h" 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Info related to samplers and sampler views. 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We have one of these for fragment samplers and another for vertex samplers. 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct sampler_info 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct { 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *samplers[PIPE_MAX_SAMPLERS]; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr_samplers; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } hw; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *samplers[PIPE_MAX_SAMPLERS]; 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr_samplers; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *samplers_saved[PIPE_MAX_SAMPLERS]; 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr_samplers_saved; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *views[PIPE_MAX_SAMPLERS]; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr_views; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *views_saved[PIPE_MAX_SAMPLERS]; 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr_views_saved; 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct cso_context { 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_cache *cache; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_vbuf *vbuf; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean has_geometry_shader; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean has_streamout; 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct sampler_info samplers[PIPE_SHADER_TYPES]; 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint nr_vertex_buffers; 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_buffer vertex_buffers[PIPE_MAX_ATTRIBS]; 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint nr_vertex_buffers_saved; 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_buffer vertex_buffers_saved[PIPE_MAX_ATTRIBS]; 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr_so_targets; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_stream_output_target *so_targets[PIPE_MAX_SO_BUFFERS]; 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr_so_targets_saved; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_stream_output_target *so_targets_saved[PIPE_MAX_SO_BUFFERS]; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Current and saved state. 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The saved state is used as a 1-deep stack. 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *blend, *blend_saved; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *depth_stencil, *depth_stencil_saved; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *rasterizer, *rasterizer_saved; 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *fragment_shader, *fragment_shader_saved; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *vertex_shader, *vertex_shader_saved; 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *geometry_shader, *geometry_shader_saved; 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *velements, *velements_saved; 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_clip_state clip; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_clip_state clip_saved; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state fb, fb_saved; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_viewport_state vp, vp_saved; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_blend_color blend_color; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned sample_mask, sample_mask_saved; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_stencil_ref stencil_ref, stencil_ref_saved; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean delete_blend_state(struct cso_context *ctx, void *state) 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_blend *cso = (struct cso_blend *)state; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->blend == cso->data) 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->delete_state) 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->delete_state(cso->context, cso->data); 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(state); 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean delete_depth_stencil_state(struct cso_context *ctx, void *state) 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_depth_stencil_alpha *cso = 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (struct cso_depth_stencil_alpha *)state; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->depth_stencil == cso->data) 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->delete_state) 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->delete_state(cso->context, cso->data); 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(state); 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean delete_sampler_state(struct cso_context *ctx, void *state) 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_sampler *cso = (struct cso_sampler *)state; 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->delete_state) 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->delete_state(cso->context, cso->data); 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(state); 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean delete_rasterizer_state(struct cso_context *ctx, void *state) 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_rasterizer *cso = (struct cso_rasterizer *)state; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->rasterizer == cso->data) 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->delete_state) 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->delete_state(cso->context, cso->data); 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(state); 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean delete_vertex_elements(struct cso_context *ctx, 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *state) 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_velements *cso = (struct cso_velements *)state; 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->velements == cso->data) 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->delete_state) 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->delete_state(cso->context, cso->data); 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(state); 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean delete_cso(struct cso_context *ctx, 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *state, enum cso_cache_type type) 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (type) { 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CSO_BLEND: 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return delete_blend_state(ctx, state); 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CSO_SAMPLER: 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return delete_sampler_state(ctx, state); 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CSO_DEPTH_STENCIL_ALPHA: 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return delete_depth_stencil_state(ctx, state); 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CSO_RASTERIZER: 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return delete_rasterizer_state(ctx, state); 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CSO_VELEMENTS: 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return delete_vertex_elements(ctx, state); 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(state); 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsanitize_hash(struct cso_hash *hash, enum cso_cache_type type, 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int max_size, void *user_data) 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_context *ctx = (struct cso_context *)user_data; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* if we're approach the maximum size, remove fourth of the entries 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * otherwise every subsequent call will go through the same */ 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int hash_size = cso_hash_size(hash); 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int max_entries = (max_size > hash_size) ? max_size : hash_size; 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int to_remove = (max_size < max_entries) * max_entries/4; 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_hash_iter iter = cso_hash_first_node(hash); 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (hash_size > max_size) 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org to_remove += hash_size - max_size; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (to_remove) { 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*remove elements until we're good */ 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*fixme: currently we pick the nodes to remove at random*/ 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *cso = cso_hash_iter_data(iter); 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (delete_cso(ctx, cso, type)) { 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iter = cso_hash_erase(hash, iter); 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org --to_remove; 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iter = cso_hash_iter_next(iter); 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void cso_init_vbuf(struct cso_context *cso) 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_vbuf_caps caps; 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_vbuf_get_caps(cso->pipe->screen, &caps); 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Install u_vbuf if there is anything unsupported. */ 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!caps.buffer_offset_unaligned || 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !caps.buffer_stride_unaligned || 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !caps.velem_src_offset_unaligned || 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !caps.format_fixed32 || 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !caps.format_float16 || 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !caps.format_float64 || 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !caps.format_norm32 || 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !caps.format_scaled32 || 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !caps.user_vertex_buffers) { 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->vbuf = u_vbuf_create(cso->pipe, &caps); 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct cso_context *cso_create_context( struct pipe_context *pipe ) 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_context *ctx = CALLOC_STRUCT(cso_context); 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx == NULL) 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out; 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cache = cso_cache_create(); 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->cache == NULL) 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out; 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_cache_set_sanitize_callback(ctx->cache, 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sanitize_hash, 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx); 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe = pipe; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->sample_mask_saved = ~0; 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_init_vbuf(ctx); 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Enable for testing: */ 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (0) cso_set_maximum_cache_size( ctx->cache, 4 ); 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pipe->screen->get_shader_param(pipe->screen, PIPE_SHADER_GEOMETRY, 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0) { 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->has_geometry_shader = TRUE; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pipe->screen->get_param(pipe->screen, 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS) != 0) { 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->has_streamout = TRUE; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx; 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgout: 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_destroy_context( ctx ); 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Prior to context destruction, this function unbinds all state objects. 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_release_all( struct cso_context *ctx ) 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, shader; 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->pipe) { 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_blend_state( ctx->pipe, NULL ); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_rasterizer_state( ctx->pipe, NULL ); 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_fragment_sampler_states( ctx->pipe, 0, NULL ); 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->pipe->bind_vertex_sampler_states) 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_vertex_sampler_states(ctx->pipe, 0, NULL); 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_depth_stencil_alpha_state( ctx->pipe, NULL ); 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_fs_state( ctx->pipe, NULL ); 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_vs_state( ctx->pipe, NULL ); 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_vertex_elements_state( ctx->pipe, NULL ); 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->set_fragment_sampler_views(ctx->pipe, 0, NULL); 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->pipe->set_vertex_sampler_views) 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->set_vertex_sampler_views(ctx->pipe, 0, NULL); 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->pipe->set_stream_output_targets) 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->set_stream_output_targets(ctx->pipe, 0, NULL, 0); 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* free fragment samplers, views */ 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (shader = 0; shader < Elements(ctx->samplers); shader++) { 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct sampler_info *info = &ctx->samplers[shader]; 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < PIPE_MAX_SAMPLERS; i++) { 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&info->views[i], NULL); 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&info->views_saved[i], NULL); 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_unreference_framebuffer_state(&ctx->fb); 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_unreference_framebuffer_state(&ctx->fb_saved); 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_copy_vertex_buffers(ctx->vertex_buffers, 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &ctx->nr_vertex_buffers, 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, 0); 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_copy_vertex_buffers(ctx->vertex_buffers_saved, 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &ctx->nr_vertex_buffers_saved, 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, 0); 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < PIPE_MAX_SO_BUFFERS; i++) { 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_so_target_reference(&ctx->so_targets[i], NULL); 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_so_target_reference(&ctx->so_targets_saved[i], NULL); 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->cache) { 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_cache_delete( ctx->cache ); 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cache = NULL; 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Free the CSO context. NOTE: the state tracker should have previously called 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * cso_release_all(). 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_destroy_context( struct cso_context *ctx ) 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx) { 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->vbuf) 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_vbuf_destroy(ctx->vbuf); 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE( ctx ); 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Those function will either find the state of the given template 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in the cache or they will create a new state from the given 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * template, insert it in the cache and return it. 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If the driver returns 0 from the create method then they will assign 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the data member of the cso to be the template itself. 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum pipe_error cso_set_blend(struct cso_context *ctx, 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_blend_state *templ) 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned key_size, hash_key; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_hash_iter iter; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *handle; 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key_size = templ->independent_blend_enable ? 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(struct pipe_blend_state) : 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (char *)&(templ->rt[1]) - (char *)templ; 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hash_key = cso_construct_key((void*)templ, key_size); 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iter = cso_find_state_template(ctx->cache, hash_key, CSO_BLEND, 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void*)templ, key_size); 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso_hash_iter_is_null(iter)) { 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_blend *cso = MALLOC(sizeof(struct cso_blend)); 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!cso) 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_ERROR_OUT_OF_MEMORY; 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&cso->state, 0, sizeof cso->state); 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(&cso->state, templ, key_size); 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->data = ctx->pipe->create_blend_state(ctx->pipe, &cso->state); 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->delete_state = (cso_state_callback)ctx->pipe->delete_blend_state; 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->context = ctx->pipe; 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iter = cso_insert_state(ctx->cache, hash_key, CSO_BLEND, cso); 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso_hash_iter_is_null(iter)) { 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(cso); 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_ERROR_OUT_OF_MEMORY; 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handle = cso->data; 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handle = ((struct cso_blend *)cso_hash_iter_data(iter))->data; 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->blend != handle) { 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->blend = handle; 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_blend_state(ctx->pipe, handle); 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_OK; 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_save_blend(struct cso_context *ctx) 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!ctx->blend_saved); 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->blend_saved = ctx->blend; 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_restore_blend(struct cso_context *ctx) 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->blend != ctx->blend_saved) { 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->blend = ctx->blend_saved; 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_blend_state(ctx->pipe, ctx->blend_saved); 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->blend_saved = NULL; 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum pipe_error 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcso_set_depth_stencil_alpha(struct cso_context *ctx, 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_depth_stencil_alpha_state *templ) 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned key_size = sizeof(struct pipe_depth_stencil_alpha_state); 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned hash_key = cso_construct_key((void*)templ, key_size); 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_hash_iter iter = cso_find_state_template(ctx->cache, 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hash_key, 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CSO_DEPTH_STENCIL_ALPHA, 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void*)templ, key_size); 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *handle; 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso_hash_iter_is_null(iter)) { 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_depth_stencil_alpha *cso = 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MALLOC(sizeof(struct cso_depth_stencil_alpha)); 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!cso) 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_ERROR_OUT_OF_MEMORY; 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(&cso->state, templ, sizeof(*templ)); 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->data = ctx->pipe->create_depth_stencil_alpha_state(ctx->pipe, 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &cso->state); 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->delete_state = 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (cso_state_callback)ctx->pipe->delete_depth_stencil_alpha_state; 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->context = ctx->pipe; 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iter = cso_insert_state(ctx->cache, hash_key, 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CSO_DEPTH_STENCIL_ALPHA, cso); 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso_hash_iter_is_null(iter)) { 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(cso); 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_ERROR_OUT_OF_MEMORY; 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handle = cso->data; 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handle = ((struct cso_depth_stencil_alpha *) 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_hash_iter_data(iter))->data; 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->depth_stencil != handle) { 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->depth_stencil = handle; 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_depth_stencil_alpha_state(ctx->pipe, handle); 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_OK; 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_save_depth_stencil_alpha(struct cso_context *ctx) 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!ctx->depth_stencil_saved); 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->depth_stencil_saved = ctx->depth_stencil; 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_restore_depth_stencil_alpha(struct cso_context *ctx) 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->depth_stencil != ctx->depth_stencil_saved) { 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->depth_stencil = ctx->depth_stencil_saved; 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_depth_stencil_alpha_state(ctx->pipe, 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->depth_stencil_saved); 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->depth_stencil_saved = NULL; 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum pipe_error cso_set_rasterizer(struct cso_context *ctx, 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_rasterizer_state *templ) 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned key_size = sizeof(struct pipe_rasterizer_state); 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned hash_key = cso_construct_key((void*)templ, key_size); 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_hash_iter iter = cso_find_state_template(ctx->cache, 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hash_key, 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CSO_RASTERIZER, 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void*)templ, key_size); 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *handle = NULL; 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso_hash_iter_is_null(iter)) { 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_rasterizer *cso = MALLOC(sizeof(struct cso_rasterizer)); 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!cso) 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_ERROR_OUT_OF_MEMORY; 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(&cso->state, templ, sizeof(*templ)); 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->data = ctx->pipe->create_rasterizer_state(ctx->pipe, &cso->state); 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->delete_state = 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (cso_state_callback)ctx->pipe->delete_rasterizer_state; 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->context = ctx->pipe; 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iter = cso_insert_state(ctx->cache, hash_key, CSO_RASTERIZER, cso); 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso_hash_iter_is_null(iter)) { 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(cso); 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_ERROR_OUT_OF_MEMORY; 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handle = cso->data; 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handle = ((struct cso_rasterizer *)cso_hash_iter_data(iter))->data; 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->rasterizer != handle) { 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->rasterizer = handle; 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_rasterizer_state(ctx->pipe, handle); 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_OK; 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_save_rasterizer(struct cso_context *ctx) 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!ctx->rasterizer_saved); 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->rasterizer_saved = ctx->rasterizer; 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_restore_rasterizer(struct cso_context *ctx) 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->rasterizer != ctx->rasterizer_saved) { 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->rasterizer = ctx->rasterizer_saved; 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_rasterizer_state(ctx->pipe, ctx->rasterizer_saved); 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->rasterizer_saved = NULL; 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum pipe_error cso_set_fragment_shader_handle(struct cso_context *ctx, 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *handle ) 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->fragment_shader != handle) { 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->fragment_shader = handle; 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_fs_state(ctx->pipe, handle); 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_OK; 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_delete_fragment_shader(struct cso_context *ctx, void *handle ) 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (handle == ctx->fragment_shader) { 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* unbind before deleting */ 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_fs_state(ctx->pipe, NULL); 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->fragment_shader = NULL; 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->delete_fs_state(ctx->pipe, handle); 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_save_fragment_shader(struct cso_context *ctx) 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!ctx->fragment_shader_saved); 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->fragment_shader_saved = ctx->fragment_shader; 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_restore_fragment_shader(struct cso_context *ctx) 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->fragment_shader_saved != ctx->fragment_shader) { 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_fs_state(ctx->pipe, ctx->fragment_shader_saved); 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->fragment_shader = ctx->fragment_shader_saved; 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->fragment_shader_saved = NULL; 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum pipe_error cso_set_vertex_shader_handle(struct cso_context *ctx, 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *handle ) 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->vertex_shader != handle) { 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertex_shader = handle; 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_vs_state(ctx->pipe, handle); 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_OK; 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_delete_vertex_shader(struct cso_context *ctx, void *handle ) 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (handle == ctx->vertex_shader) { 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* unbind before deleting */ 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_vs_state(ctx->pipe, NULL); 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertex_shader = NULL; 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->delete_vs_state(ctx->pipe, handle); 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_save_vertex_shader(struct cso_context *ctx) 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!ctx->vertex_shader_saved); 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertex_shader_saved = ctx->vertex_shader; 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_restore_vertex_shader(struct cso_context *ctx) 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->vertex_shader_saved != ctx->vertex_shader) { 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_vs_state(ctx->pipe, ctx->vertex_shader_saved); 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertex_shader = ctx->vertex_shader_saved; 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertex_shader_saved = NULL; 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum pipe_error cso_set_framebuffer(struct cso_context *ctx, 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_framebuffer_state *fb) 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (memcmp(&ctx->fb, fb, sizeof(*fb)) != 0) { 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_copy_framebuffer_state(&ctx->fb, fb); 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->set_framebuffer_state(ctx->pipe, fb); 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_OK; 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_save_framebuffer(struct cso_context *ctx) 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_copy_framebuffer_state(&ctx->fb_saved, &ctx->fb); 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_restore_framebuffer(struct cso_context *ctx) 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (memcmp(&ctx->fb, &ctx->fb_saved, sizeof(ctx->fb))) { 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_copy_framebuffer_state(&ctx->fb, &ctx->fb_saved); 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->set_framebuffer_state(ctx->pipe, &ctx->fb); 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_unreference_framebuffer_state(&ctx->fb_saved); 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum pipe_error cso_set_viewport(struct cso_context *ctx, 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_viewport_state *vp) 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (memcmp(&ctx->vp, vp, sizeof(*vp))) { 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vp = *vp; 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->set_viewport_state(ctx->pipe, vp); 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_OK; 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_save_viewport(struct cso_context *ctx) 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vp_saved = ctx->vp; 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_restore_viewport(struct cso_context *ctx) 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (memcmp(&ctx->vp, &ctx->vp_saved, sizeof(ctx->vp))) { 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vp = ctx->vp_saved; 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->set_viewport_state(ctx->pipe, &ctx->vp); 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum pipe_error cso_set_blend_color(struct cso_context *ctx, 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_blend_color *bc) 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (memcmp(&ctx->blend_color, bc, sizeof(ctx->blend_color))) { 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->blend_color = *bc; 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->set_blend_color(ctx->pipe, bc); 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_OK; 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum pipe_error cso_set_sample_mask(struct cso_context *ctx, 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned sample_mask) 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->sample_mask != sample_mask) { 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->sample_mask = sample_mask; 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->set_sample_mask(ctx->pipe, sample_mask); 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_OK; 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_save_sample_mask(struct cso_context *ctx) 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->sample_mask_saved = ctx->sample_mask; 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_restore_sample_mask(struct cso_context *ctx) 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_sample_mask(ctx, ctx->sample_mask_saved); 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum pipe_error cso_set_stencil_ref(struct cso_context *ctx, 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_stencil_ref *sr) 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (memcmp(&ctx->stencil_ref, sr, sizeof(ctx->stencil_ref))) { 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->stencil_ref = *sr; 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->set_stencil_ref(ctx->pipe, sr); 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_OK; 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_save_stencil_ref(struct cso_context *ctx) 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->stencil_ref_saved = ctx->stencil_ref; 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_restore_stencil_ref(struct cso_context *ctx) 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (memcmp(&ctx->stencil_ref, &ctx->stencil_ref_saved, 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(ctx->stencil_ref))) { 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->stencil_ref = ctx->stencil_ref_saved; 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->set_stencil_ref(ctx->pipe, &ctx->stencil_ref); 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum pipe_error cso_set_geometry_shader_handle(struct cso_context *ctx, 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *handle) 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ctx->has_geometry_shader || !handle); 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->has_geometry_shader && ctx->geometry_shader != handle) { 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->geometry_shader = handle; 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_gs_state(ctx->pipe, handle); 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_OK; 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_delete_geometry_shader(struct cso_context *ctx, void *handle) 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (handle == ctx->geometry_shader) { 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* unbind before deleting */ 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_gs_state(ctx->pipe, NULL); 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->geometry_shader = NULL; 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->delete_gs_state(ctx->pipe, handle); 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_save_geometry_shader(struct cso_context *ctx) 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->has_geometry_shader) { 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!ctx->geometry_shader_saved); 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->geometry_shader_saved = ctx->geometry_shader; 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_restore_geometry_shader(struct cso_context *ctx) 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->has_geometry_shader) { 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->geometry_shader_saved != ctx->geometry_shader) { 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_gs_state(ctx->pipe, ctx->geometry_shader_saved); 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->geometry_shader = ctx->geometry_shader_saved; 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->geometry_shader_saved = NULL; 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* clip state */ 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclip_state_cpy(struct pipe_clip_state *dst, 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_clip_state *src) 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(dst->ucp, src->ucp, sizeof(dst->ucp)); 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE int 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclip_state_cmp(const struct pipe_clip_state *a, 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_clip_state *b) 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return memcmp(a->ucp, b->ucp, sizeof(a->ucp)); 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcso_set_clip(struct cso_context *ctx, 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_clip_state *clip) 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (clip_state_cmp(&ctx->clip, clip)) { 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip_state_cpy(&ctx->clip, clip); 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->set_clip_state(ctx->pipe, clip); 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcso_save_clip(struct cso_context *ctx) 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip_state_cpy(&ctx->clip_saved, &ctx->clip); 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcso_restore_clip(struct cso_context *ctx) 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (clip_state_cmp(&ctx->clip, &ctx->clip_saved)) { 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip_state_cpy(&ctx->clip, &ctx->clip_saved); 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->set_clip_state(ctx->pipe, &ctx->clip_saved); 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum pipe_error 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcso_set_vertex_elements(struct cso_context *ctx, 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count, 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_vertex_element *states) 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_vbuf *vbuf = ctx->vbuf; 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned key_size, hash_key; 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_hash_iter iter; 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *handle; 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_velems_state velems_state; 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vbuf) { 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_vbuf_set_vertex_elements(vbuf, count, states); 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_OK; 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Need to include the count into the stored state data too. 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Otherwise first few count pipe_vertex_elements could be identical 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * even if count is different, and there's no guarantee the hash would 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * be different in that case neither. 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key_size = sizeof(struct pipe_vertex_element) * count + sizeof(unsigned); 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org velems_state.count = count; 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(velems_state.velems, states, 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(struct pipe_vertex_element) * count); 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hash_key = cso_construct_key((void*)&velems_state, key_size); 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iter = cso_find_state_template(ctx->cache, hash_key, CSO_VELEMENTS, 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void*)&velems_state, key_size); 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso_hash_iter_is_null(iter)) { 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_velements *cso = MALLOC(sizeof(struct cso_velements)); 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!cso) 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_ERROR_OUT_OF_MEMORY; 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(&cso->state, &velems_state, key_size); 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->data = ctx->pipe->create_vertex_elements_state(ctx->pipe, count, 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &cso->state.velems[0]); 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->delete_state = 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (cso_state_callback) ctx->pipe->delete_vertex_elements_state; 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->context = ctx->pipe; 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iter = cso_insert_state(ctx->cache, hash_key, CSO_VELEMENTS, cso); 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso_hash_iter_is_null(iter)) { 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(cso); 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_ERROR_OUT_OF_MEMORY; 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handle = cso->data; 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handle = ((struct cso_velements *)cso_hash_iter_data(iter))->data; 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->velements != handle) { 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->velements = handle; 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_vertex_elements_state(ctx->pipe, handle); 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_OK; 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_save_vertex_elements(struct cso_context *ctx) 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_vbuf *vbuf = ctx->vbuf; 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vbuf) { 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_vbuf_save_vertex_elements(vbuf); 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!ctx->velements_saved); 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->velements_saved = ctx->velements; 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_restore_vertex_elements(struct cso_context *ctx) 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_vbuf *vbuf = ctx->vbuf; 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vbuf) { 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_vbuf_restore_vertex_elements(vbuf); 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->velements != ctx->velements_saved) { 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->velements = ctx->velements_saved; 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_vertex_elements_state(ctx->pipe, ctx->velements_saved); 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->velements_saved = NULL; 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* vertex buffers */ 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_set_vertex_buffers(struct cso_context *ctx, 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count, 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_vertex_buffer *buffers) 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_vbuf *vbuf = ctx->vbuf; 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vbuf) { 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_vbuf_set_vertex_buffers(vbuf, count, buffers); 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (count != ctx->nr_vertex_buffers || 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcmp(buffers, ctx->vertex_buffers, 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(struct pipe_vertex_buffer) * count) != 0) { 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_copy_vertex_buffers(ctx->vertex_buffers, &ctx->nr_vertex_buffers, 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffers, count); 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->set_vertex_buffers(ctx->pipe, count, buffers); 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_save_vertex_buffers(struct cso_context *ctx) 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_vbuf *vbuf = ctx->vbuf; 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vbuf) { 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_vbuf_save_vertex_buffers(vbuf); 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_copy_vertex_buffers(ctx->vertex_buffers_saved, 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &ctx->nr_vertex_buffers_saved, 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertex_buffers, 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->nr_vertex_buffers); 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid cso_restore_vertex_buffers(struct cso_context *ctx) 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_vbuf *vbuf = ctx->vbuf; 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vbuf) { 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_vbuf_restore_vertex_buffers(vbuf); 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_copy_vertex_buffers(ctx->vertex_buffers, 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &ctx->nr_vertex_buffers, 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertex_buffers_saved, 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->nr_vertex_buffers_saved); 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ctx->nr_vertex_buffers_saved; i++) { 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&ctx->vertex_buffers_saved[i].buffer, NULL); 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->nr_vertex_buffers_saved = 0; 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->set_vertex_buffers(ctx->pipe, ctx->nr_vertex_buffers, 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertex_buffers); 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************** fragment/vertex sampler view state *************************/ 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic enum pipe_error 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsingle_sampler(struct cso_context *ctx, 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct sampler_info *info, 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned idx, 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_sampler_state *templ) 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *handle = NULL; 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (templ != NULL) { 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned key_size = sizeof(struct pipe_sampler_state); 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned hash_key = cso_construct_key((void*)templ, key_size); 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_hash_iter iter = 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_find_state_template(ctx->cache, 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hash_key, CSO_SAMPLER, 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void *) templ, key_size); 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso_hash_iter_is_null(iter)) { 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_sampler *cso = MALLOC(sizeof(struct cso_sampler)); 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!cso) 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_ERROR_OUT_OF_MEMORY; 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(&cso->state, templ, sizeof(*templ)); 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->data = ctx->pipe->create_sampler_state(ctx->pipe, &cso->state); 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->delete_state = 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (cso_state_callback) ctx->pipe->delete_sampler_state; 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->context = ctx->pipe; 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iter = cso_insert_state(ctx->cache, hash_key, CSO_SAMPLER, cso); 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso_hash_iter_is_null(iter)) { 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(cso); 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_ERROR_OUT_OF_MEMORY; 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handle = cso->data; 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handle = ((struct cso_sampler *)cso_hash_iter_data(iter))->data; 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->samplers[idx] = handle; 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_OK; 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum pipe_error 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcso_single_sampler(struct cso_context *ctx, 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned shader_stage, 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned idx, 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_sampler_state *templ) 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return single_sampler(ctx, &ctx->samplers[shader_stage], idx, templ); 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsingle_sampler_done(struct cso_context *ctx, unsigned shader_stage) 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct sampler_info *info = &ctx->samplers[shader_stage]; 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* find highest non-null sampler */ 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = PIPE_MAX_SAMPLERS; i > 0; i--) { 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->samplers[i - 1] != NULL) 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->nr_samplers = i; 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->hw.nr_samplers != info->nr_samplers || 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcmp(info->hw.samplers, 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->samplers, 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->nr_samplers * sizeof(void *)) != 0) 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(info->hw.samplers, 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->samplers, 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->nr_samplers * sizeof(void *)); 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->hw.nr_samplers = info->nr_samplers; 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (shader_stage) { 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_FRAGMENT: 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_fragment_sampler_states(ctx->pipe, 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->nr_samplers, 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->samplers); 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_VERTEX: 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_vertex_sampler_states(ctx->pipe, 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->nr_samplers, 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->samplers); 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_GEOMETRY: 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->bind_geometry_sampler_states(ctx->pipe, 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->nr_samplers, 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->samplers); 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"bad shader type in single_sampler_done()"); 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcso_single_sampler_done(struct cso_context *ctx, unsigned shader_stage) 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org single_sampler_done(ctx, shader_stage); 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If the function encouters any errors it will return the 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * last one. Done to always try to set as many samplers 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * as possible. 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum pipe_error 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcso_set_samplers(struct cso_context *ctx, 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned shader_stage, 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr, 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_sampler_state **templates) 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct sampler_info *info = &ctx->samplers[shader_stage]; 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_error temp, error = PIPE_OK; 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TODO: fastpath 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < nr; i++) { 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org temp = single_sampler(ctx, info, i, templates[i]); 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (temp != PIPE_OK) 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error = temp; 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for ( ; i < info->nr_samplers; i++) { 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org temp = single_sampler(ctx, info, i, NULL); 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (temp != PIPE_OK) 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error = temp; 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org single_sampler_done(ctx, shader_stage); 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return error; 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcso_save_samplers(struct cso_context *ctx, unsigned shader_stage) 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct sampler_info *info = &ctx->samplers[shader_stage]; 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->nr_samplers_saved = info->nr_samplers; 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(info->samplers_saved, info->samplers, sizeof(info->samplers)); 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcso_restore_samplers(struct cso_context *ctx, unsigned shader_stage) 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct sampler_info *info = &ctx->samplers[shader_stage]; 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->nr_samplers = info->nr_samplers_saved; 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(info->samplers, info->samplers_saved, sizeof(info->samplers)); 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org single_sampler_done(ctx, shader_stage); 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcso_set_sampler_views(struct cso_context *ctx, 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned shader_stage, 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count, 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view **views) 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct sampler_info *info = &ctx->samplers[shader_stage]; 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* reference new views */ 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; i++) { 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&info->views[i], views[i]); 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* unref extra old views, if any */ 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (; i < info->nr_views; i++) { 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&info->views[i], NULL); 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->nr_views = count; 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* bind the new sampler views */ 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (shader_stage) { 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_FRAGMENT: 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->set_fragment_sampler_views(ctx->pipe, count, info->views); 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_VERTEX: 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->set_vertex_sampler_views(ctx->pipe, count, info->views); 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_GEOMETRY: 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->set_geometry_sampler_views(ctx->pipe, count, info->views); 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"bad shader type in cso_set_sampler_views()"); 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcso_save_sampler_views(struct cso_context *ctx, unsigned shader_stage) 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct sampler_info *info = &ctx->samplers[shader_stage]; 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->nr_views_saved = info->nr_views; 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < info->nr_views; i++) { 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!info->views_saved[i]); 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&info->views_saved[i], info->views[i]); 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcso_restore_sampler_views(struct cso_context *ctx, unsigned shader_stage) 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct sampler_info *info = &ctx->samplers[shader_stage]; 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, nr_saved = info->nr_views_saved; 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < nr_saved; i++) { 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&info->views[i], NULL); 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* move the reference from one pointer to another */ 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->views[i] = info->views_saved[i]; 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->views_saved[i] = NULL; 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (; i < info->nr_views; i++) { 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&info->views[i], NULL); 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* bind the old/saved sampler views */ 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (shader_stage) { 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_FRAGMENT: 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->set_fragment_sampler_views(ctx->pipe, nr_saved, info->views); 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_VERTEX: 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->set_vertex_sampler_views(ctx->pipe, nr_saved, info->views); 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_GEOMETRY: 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->set_geometry_sampler_views(ctx->pipe, nr_saved, info->views); 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"bad shader type in cso_restore_sampler_views()"); 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->nr_views = nr_saved; 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->nr_views_saved = 0; 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcso_set_stream_outputs(struct cso_context *ctx, 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_targets, 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_stream_output_target **targets, 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned append_bitmask) 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->pipe; 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i; 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->has_streamout) { 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(num_targets == 0); 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->nr_so_targets == 0 && num_targets == 0) { 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Nothing to do. */ 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* reference new targets */ 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < num_targets; i++) { 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_so_target_reference(&ctx->so_targets[i], targets[i]); 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* unref extra old targets, if any */ 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (; i < ctx->nr_so_targets; i++) { 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_so_target_reference(&ctx->so_targets[i], NULL); 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_stream_output_targets(pipe, num_targets, targets, 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append_bitmask); 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->nr_so_targets = num_targets; 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcso_save_stream_outputs(struct cso_context *ctx) 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i; 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->has_streamout) { 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->nr_so_targets_saved = ctx->nr_so_targets; 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ctx->nr_so_targets; i++) { 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!ctx->so_targets_saved[i]); 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_so_target_reference(&ctx->so_targets_saved[i], ctx->so_targets[i]); 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcso_restore_stream_outputs(struct cso_context *ctx) 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->pipe; 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i; 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->has_streamout) { 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->nr_so_targets == 0 && ctx->nr_so_targets_saved == 0) { 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Nothing to do. */ 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ctx->nr_so_targets_saved; i++) { 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_so_target_reference(&ctx->so_targets[i], NULL); 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* move the reference from one pointer to another */ 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->so_targets[i] = ctx->so_targets_saved[i]; 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->so_targets_saved[i] = NULL; 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (; i < ctx->nr_so_targets; i++) { 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_so_target_reference(&ctx->so_targets[i], NULL); 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* ~0 means append */ 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_stream_output_targets(pipe, ctx->nr_so_targets_saved, 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->so_targets, ~0); 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->nr_so_targets = ctx->nr_so_targets_saved; 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->nr_so_targets_saved = 0; 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* drawing */ 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcso_set_index_buffer(struct cso_context *cso, 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_index_buffer *ib) 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_vbuf *vbuf = cso->vbuf; 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vbuf) { 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_vbuf_set_index_buffer(vbuf, ib); 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = cso->pipe; 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_index_buffer(pipe, ib); 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcso_draw_vbo(struct cso_context *cso, 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_draw_info *info) 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_vbuf *vbuf = cso->vbuf; 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vbuf) { 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_vbuf_draw_vbo(vbuf, info); 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = cso->pipe; 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->draw_vbo(pipe, info); 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcso_draw_arrays(struct cso_context *cso, uint mode, uint start, uint count) 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_draw_info info; 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_draw_init_info(&info); 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.mode = mode; 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.start = start; 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.count = count; 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.min_index = start; 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.max_index = start + count - 1; 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_draw_vbo(cso, &info); 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1347