1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2003 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#include "util/u_math.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_shader_tokens.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_context.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_vertex.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_private.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_context.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_screen.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_setup.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_state.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The vertex info describes how to convert the post-transformed vertices 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (simple float[][4]) used by the 'draw' module into vertices for 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * rasterization. 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function validates the vertex layout. 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompute_vertex_info(struct llvmpipe_context *llvmpipe) 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_fragment_shader *lpfs = llvmpipe->fs; 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex_info *vinfo = &llvmpipe->vertex_info; 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned vs_index; 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->color_slot[0] = -1; 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->color_slot[1] = -1; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->bcolor_slot[0] = -1; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->bcolor_slot[1] = -1; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Match FS inputs against VS outputs, emitting the necessary 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * attributes. Could cache these structs and look them up with a 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * combination of fragment shader, vertex shader ids. 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vinfo->num_attribs = 0; 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vs_index = draw_find_shader_output(llvmpipe->draw, 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_SEMANTIC_POSITION, 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0); 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_emit_vertex_attr(vinfo, EMIT_4F, INTERP_PERSPECTIVE, vs_index); 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < lpfs->info.base.num_inputs; i++) { 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Search for each input in current vs output: 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vs_index = draw_find_shader_output(llvmpipe->draw, 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpfs->info.base.input_semantic_name[i], 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpfs->info.base.input_semantic_index[i]); 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (lpfs->info.base.input_semantic_name[i] == TGSI_SEMANTIC_COLOR && 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpfs->info.base.input_semantic_index[i] < 2) { 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int idx = lpfs->info.base.input_semantic_index[i]; 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->color_slot[idx] = (int)vinfo->num_attribs; 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Emit the requested fs attribute for all but position. 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_emit_vertex_attr(vinfo, EMIT_4F, INTERP_PERSPECTIVE, vs_index); 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Figure out if we need bcolor as well. 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 2; i++) { 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vs_index = draw_find_shader_output(llvmpipe->draw, 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_SEMANTIC_BCOLOR, i); 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vs_index > 0) { 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->bcolor_slot[i] = (int)vinfo->num_attribs; 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_emit_vertex_attr(vinfo, EMIT_4F, INTERP_PERSPECTIVE, vs_index); 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Figure out if we need pointsize as well. 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vs_index = draw_find_shader_output(llvmpipe->draw, 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_SEMANTIC_PSIZE, 0); 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vs_index > 0) { 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->psize_slot = vinfo->num_attribs; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_emit_vertex_attr(vinfo, EMIT_4F, INTERP_CONSTANT, vs_index); 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_compute_vertex_size(vinfo); 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_setup_set_vertex_info(llvmpipe->setup, vinfo); 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Handle state changes. 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called just prior to drawing anything (pipe::draw_arrays(), etc). 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Hopefully this will remain quite simple, otherwise need to pull in 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * something like the state tracker mechanism. 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid llvmpipe_update_derived( struct llvmpipe_context *llvmpipe ) 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct llvmpipe_screen *lp_screen = llvmpipe_screen(llvmpipe->pipe.screen); 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Check for updated textures. 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (llvmpipe->tex_timestamp != lp_screen->timestamp) { 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->tex_timestamp = lp_screen->timestamp; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->dirty |= LP_NEW_SAMPLER_VIEW; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (llvmpipe->dirty & (LP_NEW_RASTERIZER | 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_NEW_FS | 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_NEW_VS)) 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compute_vertex_info( llvmpipe ); 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (llvmpipe->dirty & (LP_NEW_FS | 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_NEW_BLEND | 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_NEW_SCISSOR | 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_NEW_DEPTH_STENCIL_ALPHA | 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_NEW_RASTERIZER | 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_NEW_SAMPLER | 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_NEW_SAMPLER_VIEW | 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_NEW_QUERY)) 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe_update_fs( llvmpipe ); 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (llvmpipe->dirty & (LP_NEW_FS | 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_NEW_RASTERIZER)) 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe_update_setup( llvmpipe ); 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (llvmpipe->dirty & LP_NEW_BLEND_COLOR) 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_setup_set_blend_color(llvmpipe->setup, 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &llvmpipe->blend_color); 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (llvmpipe->dirty & LP_NEW_SCISSOR) 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_setup_set_scissor(llvmpipe->setup, &llvmpipe->scissor); 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (llvmpipe->dirty & LP_NEW_DEPTH_STENCIL_ALPHA) { 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_setup_set_alpha_ref_value(llvmpipe->setup, 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->depth_stencil->alpha.ref_value); 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_setup_set_stencil_ref_values(llvmpipe->setup, 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->stencil_ref.ref_value); 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (llvmpipe->dirty & LP_NEW_CONSTANTS) 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_setup_set_fs_constants(llvmpipe->setup, 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->constants[PIPE_SHADER_FRAGMENT][0]); 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (llvmpipe->dirty & (LP_NEW_SAMPLER_VIEW)) 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_setup_set_fragment_sampler_views(llvmpipe->setup, 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->num_sampler_views[PIPE_SHADER_FRAGMENT], 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->sampler_views[PIPE_SHADER_FRAGMENT]); 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (llvmpipe->dirty & (LP_NEW_SAMPLER)) 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_setup_set_fragment_sampler_state(llvmpipe->setup, 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->num_samplers[PIPE_SHADER_FRAGMENT], 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->samplers[PIPE_SHADER_FRAGMENT]); 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe->dirty = 0; 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 192