st_program.c revision bc139a19b00f8686caa8db7c56af2087f26e369a
1f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/************************************************************************** 2f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * 3f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * All Rights Reserved. 5f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * 6f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Permission is hereby granted, free of charge, to any person obtaining a 7f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * copy of this software and associated documentation files (the 8f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * "Software"), to deal in the Software without restriction, including 9f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * without limitation the rights to use, copy, modify, merge, publish, 10f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * distribute, sub license, and/or sell copies of the Software, and to 11f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * permit persons to whom the Software is furnished to do so, subject to 12f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * the following conditions: 13f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * 14f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * The above copyright notice and this permission notice (including the 15f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * next paragraph) shall be included in all copies or substantial portions 16f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * of the Software. 17f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * 18f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * 26f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian **************************************************************************/ 27f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 28f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Authors: 29f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Keith Whitwell <keith@tungstengraphics.com> 30f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Brian Paul 31f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 32f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 33f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 34b5051bf6bbe54269c78f4dd545791e51bc7ce9e0Brian#include "main/imports.h" 35b5051bf6bbe54269c78f4dd545791e51bc7ce9e0Brian#include "main/mtypes.h" 36f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 37f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_context.h" 38f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_defines.h" 398731e391f5a8bb45adb53242b0a473707c0c024cZack Rusin#include "pipe/draw/draw_context.h" 40f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/tgsi/mesa/mesa_to_tgsi.h" 41f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/tgsi/exec/tgsi_core.h" 42f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 43f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_context.h" 44f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_cache.h" 45f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_atom.h" 46f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_program.h" 47f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 48f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 491201eb852966a64742645a4cd3a2879bed81e29dBrian#define TGSI_DEBUG 0 50f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 51f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 52f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 53f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa vertex shader into a TGSI shader. 54f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param outputMapping to map vertex program output registers to TGSI 55f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * output slots 56f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut destination for TGSI tokens 57f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return pointer to cached pipe_shader object. 58f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 59f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianconst struct cso_vertex_shader * 60f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_vertex_program(struct st_context *st, 61f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian struct st_vertex_program *stvp, 62f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian const GLuint outputMapping[], 63f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian struct tgsi_token *tokensOut, 64f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint maxTokens) 65f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 66f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint defaultOutputMapping[VERT_RESULT_MAX]; 67f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian struct pipe_shader_state vs; 68f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian const struct cso_vertex_shader *cso; 69f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint attr, i; 70f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 71f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian memset(&vs, 0, sizeof(vs)); 72f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 73f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 74f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Determine number of inputs, the mappings between VERT_ATTRIB_x 75f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * and TGSI generic input indexes, plus input attrib semantic info. 76f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 77f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) { 78f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (stvp->Base.Base.InputsRead & (1 << attr)) { 79f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian const GLuint slot = vs.num_inputs; 80f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 81f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.num_inputs++; 82f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 83f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian stvp->input_to_index[attr] = slot; 84f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian stvp->index_to_input[slot] = attr; 85f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 86f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian switch (attr) { 87f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_POS: 88f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 89f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.input_semantic_index[slot] = 0; 90f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 91f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_WEIGHT: 92f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* fall-through */ 93f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_NORMAL: 94f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* just label as a generic */ 95f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 96f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.input_semantic_index[slot] = 0; 97f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 98f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_COLOR0: 99f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 100f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.input_semantic_index[slot] = 0; 101f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 102f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_COLOR1: 103f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 104f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.input_semantic_index[slot] = 1; 105f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 106f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_FOG: 107f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 108f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.input_semantic_index[slot] = 0; 109f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 110f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX0: 111f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX1: 112f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX2: 113f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX3: 114f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX4: 115f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX5: 116f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX6: 117f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX7: 118f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 119f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.input_semantic_index[slot] = attr - VERT_ATTRIB_TEX0; 120f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 121f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC0: 122f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC1: 123f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC2: 124f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC3: 125f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC4: 126f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC5: 127f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC6: 128f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC7: 129f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian assert(attr < VERT_ATTRIB_MAX); 130f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 131f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.input_semantic_index[slot] = attr - VERT_ATTRIB_GENERIC0; 132f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 133f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian default: 134f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian assert(0); 135f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 136f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 137f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 138f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 139f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* initialize output semantics to defaults */ 140f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) { 141f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_name[i] = TGSI_SEMANTIC_GENERIC; 142f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_index[i] = 0; 143f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 144f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 145f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 146f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Determine number of outputs, the (default) output register 147f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * mapping and the semantic information for each output. 148f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 149f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_RESULT_MAX; attr++) { 150f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (stvp->Base.Base.OutputsWritten & (1 << attr)) { 151f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint slot; 152f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 153f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (outputMapping) { 154f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian slot = outputMapping[attr]; 155f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian assert(slot != ~0); 156f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 157f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian else { 158f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian slot = vs.num_outputs; 159f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.num_outputs++; 160f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian defaultOutputMapping[attr] = slot; 161f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 162f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 163f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 164f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian printf("Output %u -> slot %u\n", attr, slot); 165f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 166f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 167f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian switch (attr) { 168f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_HPOS: 169f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 170f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_index[slot] = 0; 171f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 172f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL0: 173f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 174f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_index[slot] = 0; 175f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 176f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL1: 177f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 178f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_index[slot] = 1; 179f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 180f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC0: 181f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 182f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_index[slot] = 0; 183f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 184f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC1: 185f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 186f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_index[slot] = 1; 187f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 188f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_FOGC: 189f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_name[slot] = TGSI_SEMANTIC_FOG; 190f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_index[slot] = 0; 191f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 192f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_PSIZ: 193f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 194f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_index[slot] = 0; 195f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 196f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_EDGE: 197f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian assert(0); 198f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 199f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX0: 200f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX1: 201f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX2: 202f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX3: 203f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX4: 204f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX5: 205f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX6: 206f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX7: 207f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 208f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_index[slot] = attr - VERT_RESULT_TEX0; 209f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 210f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_VAR0: 211f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* fall-through */ 212f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian default: 213f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian assert(attr - VERT_RESULT_VAR0 < MAX_VARYING); 214f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 215f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_index[slot] = attr - VERT_RESULT_VAR0; 216f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 217f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 218f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 219f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 220f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 221f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (outputMapping) { 222f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* find max output slot referenced to compute vs.num_outputs */ 223f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint maxSlot = 0; 224f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_RESULT_MAX; attr++) { 225f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (outputMapping[attr] != ~0 && outputMapping[attr] > maxSlot) 226f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian maxSlot = outputMapping[attr]; 227f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 228f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.num_outputs = maxSlot + 1; 229f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 230f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian else { 231f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian outputMapping = defaultOutputMapping; 232f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 233f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 234f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* XXX: fix static allocation of tokens: 235f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 236f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian tgsi_mesa_compile_vp_program( &stvp->Base, 237f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* inputs */ 238f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.num_inputs, 239f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian stvp->input_to_index, 240f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.input_semantic_name, 241f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.input_semantic_index, 242f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* outputs */ 243f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.num_outputs, 244f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian outputMapping, 245f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_name, 246f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.output_semantic_index, 247f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* tokenized result */ 248f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian tokensOut, maxTokens); 249f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 250f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian vs.tokens = tokensOut; 251f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian cso = st_cached_vs_state(st, &vs); 252f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian stvp->vs = cso; 253f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 254f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (TGSI_DEBUG) 255f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian tgsi_dump( tokensOut, 0 ); 256f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 257f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian return cso; 258f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 259f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 260f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 261f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 262f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 263f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa fragment shader into a TGSI shader. 264f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param inputMapping to map fragment program input registers to TGSI 265f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * input slots 266f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut destination for TGSI tokens 267f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return pointer to cached pipe_shader object. 268f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 269f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianconst struct cso_fragment_shader * 270f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_fragment_program(struct st_context *st, 271f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian struct st_fragment_program *stfp, 272f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian const GLuint inputMapping[], 273f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian struct tgsi_token *tokensOut, 274f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint maxTokens) 275f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 276f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint outputMapping[FRAG_RESULT_MAX]; 277f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint defaultInputMapping[FRAG_ATTRIB_MAX]; 278f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian struct pipe_shader_state fs; 279f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian const struct cso_fragment_shader *cso; 280f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint interpMode[16]; /* XXX size? */ 281f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint attr; 282f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLbitfield inputsRead = stfp->Base.Base.InputsRead; 283f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 284b13618c3167002a823e9bb1e744a0a316fd0e2bfBrian /* For software rendering, we always need the fragment input position 285b13618c3167002a823e9bb1e744a0a316fd0e2bfBrian * in order to calculate interpolated values. 286b13618c3167002a823e9bb1e744a0a316fd0e2bfBrian * For i915, we always want to emit the semantic info for position. 287f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 288b13618c3167002a823e9bb1e744a0a316fd0e2bfBrian inputsRead |= FRAG_BIT_WPOS; 289f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 290f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian memset(&fs, 0, sizeof(fs)); 291f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 292f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 293f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Convert Mesa program inputs to TGSI input register semantics. 294f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 295f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) { 296f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (inputsRead & (1 << attr)) { 297f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian const GLuint slot = fs.num_inputs; 298f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 299f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian fs.num_inputs++; 300f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 301f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian defaultInputMapping[attr] = slot; 302f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 303f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian switch (attr) { 304f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_WPOS: 305f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian fs.input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 306f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian fs.input_semantic_index[slot] = 0; 307f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_CONSTANT; 308f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 309f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_COL0: 310f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian fs.input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 311f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian fs.input_semantic_index[slot] = 0; 312f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 313f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 314f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_COL1: 315f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian fs.input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 316f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian fs.input_semantic_index[slot] = 1; 317f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 318f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 319f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_FOGC: 320f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian fs.input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 321f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian fs.input_semantic_index[slot] = 0; 322f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 323f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 324f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX0: 325f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX1: 326f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX2: 327f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX3: 328f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX4: 329f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX5: 330f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX6: 331f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX7: 332f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian fs.input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 333f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian fs.input_semantic_index[slot] = attr - FRAG_ATTRIB_TEX0; 334f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 335f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 336f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_VAR0: 337f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* fall-through */ 338f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian default: 339f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian fs.input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 340f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian fs.input_semantic_index[slot] = attr - FRAG_ATTRIB_VAR0; 341f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 342f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 343f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 344f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 345f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 346f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 347bc139a19b00f8686caa8db7c56af2087f26e369aBrian * Semantics and mapping for outputs 348f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 349635c4c41bdf111462939da292d65328595d314e8Brian { 350635c4c41bdf111462939da292d65328595d314e8Brian uint numColors = 0; 351635c4c41bdf111462939da292d65328595d314e8Brian GLbitfield outputsWritten = stfp->Base.Base.OutputsWritten; 352635c4c41bdf111462939da292d65328595d314e8Brian 353bc139a19b00f8686caa8db7c56af2087f26e369aBrian /* if z is written, emit that first */ 354635c4c41bdf111462939da292d65328595d314e8Brian if (outputsWritten & (1 << FRAG_RESULT_DEPR)) { 355bc139a19b00f8686caa8db7c56af2087f26e369aBrian fs.output_semantic_name[fs.num_outputs] = TGSI_SEMANTIC_POSITION; 356bc139a19b00f8686caa8db7c56af2087f26e369aBrian fs.output_semantic_index[fs.num_outputs] = 0; 357bc139a19b00f8686caa8db7c56af2087f26e369aBrian outputMapping[FRAG_RESULT_DEPR] = fs.num_outputs; 358bc139a19b00f8686caa8db7c56af2087f26e369aBrian fs.num_outputs++; 359635c4c41bdf111462939da292d65328595d314e8Brian outputsWritten &= ~(1 << FRAG_RESULT_DEPR); 360635c4c41bdf111462939da292d65328595d314e8Brian } 361635c4c41bdf111462939da292d65328595d314e8Brian 362bc139a19b00f8686caa8db7c56af2087f26e369aBrian /* handle remaning outputs (color) */ 363635c4c41bdf111462939da292d65328595d314e8Brian for (attr = 0; attr < FRAG_RESULT_MAX; attr++) { 364635c4c41bdf111462939da292d65328595d314e8Brian if (outputsWritten & (1 << attr)) { 365635c4c41bdf111462939da292d65328595d314e8Brian switch (attr) { 366635c4c41bdf111462939da292d65328595d314e8Brian case FRAG_RESULT_DEPR: 367bc139a19b00f8686caa8db7c56af2087f26e369aBrian /* handled above */ 368635c4c41bdf111462939da292d65328595d314e8Brian assert(0); 369635c4c41bdf111462939da292d65328595d314e8Brian break; 370635c4c41bdf111462939da292d65328595d314e8Brian case FRAG_RESULT_COLR: 371635c4c41bdf111462939da292d65328595d314e8Brian fs.output_semantic_name[fs.num_outputs] = TGSI_SEMANTIC_COLOR; 372635c4c41bdf111462939da292d65328595d314e8Brian fs.output_semantic_index[fs.num_outputs] = numColors; 373635c4c41bdf111462939da292d65328595d314e8Brian outputMapping[attr] = fs.num_outputs; 374635c4c41bdf111462939da292d65328595d314e8Brian numColors++; 375635c4c41bdf111462939da292d65328595d314e8Brian break; 376635c4c41bdf111462939da292d65328595d314e8Brian default: 377635c4c41bdf111462939da292d65328595d314e8Brian assert(0); 378635c4c41bdf111462939da292d65328595d314e8Brian } 379635c4c41bdf111462939da292d65328595d314e8Brian fs.num_outputs++; 380f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 381f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 382f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 383f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 384f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (!inputMapping) 385f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian inputMapping = defaultInputMapping; 386f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 387f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* XXX: fix static allocation of tokens: 388f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 389f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian tgsi_mesa_compile_fp_program( &stfp->Base, 390f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* inputs */ 391f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian fs.num_inputs, 392f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian inputMapping, 393f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian fs.input_semantic_name, 394f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian fs.input_semantic_index, 395f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode, 396f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* outputs */ 397f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian outputMapping, 398f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* tokenized result */ 399f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian tokensOut, maxTokens); 400f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 401f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 402f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian fs.tokens = tokensOut; 403f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 404f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian cso = st_cached_fs_state(st, &fs); 405f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian stfp->fs = cso; 406f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 407f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (TGSI_DEBUG) 408f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian tgsi_dump( tokensOut, 0/*TGSI_DUMP_VERBOSE*/ ); 409f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 410f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian return cso; 411f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 412f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 413