st_program.c revision a54ab4960b86839f73e7c16fdde00670a67ee80e
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" 36ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_print.h" 37ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/programopt.h" 38f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 39f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_context.h" 40f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_defines.h" 41abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "pipe/p_shader_tokens.h" 426acd63a4980951727939c0dd545a0324965b3834José Fonseca#include "draw/draw_context.h" 43c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_dump.h" 441b8aa2176c4fc580cc31c57c7e50e7f39ef2cc04Vinson Lee#include "tgsi/tgsi_ureg.h" 45f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 46b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell#include "st_debug.h" 47f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_context.h" 48f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_program.h" 49ef6940f17220f1149dce6daf548bd0103d91a281Brian#include "st_mesa_to_tgsi.h" 50339e7ec6805e6de8794514c0a935081b5d36d38fBrian#include "cso_cache/cso_context.h" 51f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 528468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul 538468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul 548468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul/** 558468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul * Clean out any old compilations: 568468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul */ 5707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellvoid 5807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_vp_release_varients( struct st_context *st, 5907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp ) 6007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{ 6107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vp_varient *vpv; 6207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 6307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell for (vpv = stvp->varients; vpv; ) { 6407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vp_varient *next = vpv->next; 6507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 6607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell if (vpv->driver_shader) 6707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell cso_delete_vertex_shader(st->cso_context, vpv->driver_shader); 6807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 69d9f38e1a71f94b112b4ab288a7043dd2fc4a701dChia-I Wu#if FEATURE_feedback || FEATURE_rastpos 7007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell if (vpv->draw_shader) 7107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell draw_delete_vertex_shader( st->draw, vpv->draw_shader ); 72d9f38e1a71f94b112b4ab288a7043dd2fc4a701dChia-I Wu#endif 7307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 74b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul if (vpv->tgsi.tokens) 75b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul st_free_tokens(vpv->tgsi.tokens); 7607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 7707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell FREE( vpv ); 7807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 7907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell vpv = next; 8007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell } 8107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 8207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->varients = NULL; 8307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell} 8407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 8507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 8607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 87f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 88f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 89f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa vertex shader into a TGSI shader. 90e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * \param outputMapping to map vertex program output registers (VERT_RESULT_x) 91e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * to TGSI output slots 92f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut destination for TGSI tokens 93f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return pointer to cached pipe_shader object. 94f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 95ac95fee4fffee77bb7bd798d094ed2e3a7c4019bBrianvoid 9607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_prepare_vertex_program(struct st_context *st, 9707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp) 98f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 9907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell GLuint attr; 100c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul 10107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_inputs = 0; 10207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_outputs = 0; 103f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 104f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs if (stvp->Base.IsPositionInvariant) 105f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs _mesa_insert_mvp_code(st->ctx, &stvp->Base); 106f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs 107325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell assert(stvp->Base.Base.NumInstructions > 1); 108325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell 109f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 110f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Determine number of inputs, the mappings between VERT_ATTRIB_x 111f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * and TGSI generic input indexes, plus input attrib semantic info. 112f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 113f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) { 114f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (stvp->Base.Base.InputsRead & (1 << attr)) { 11507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->input_to_index[attr] = stvp->num_inputs; 11607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->index_to_input[stvp->num_inputs] = attr; 11707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_inputs++; 118f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 119f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 12050caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger /* bit of a hack, presetup potentially unused edgeflag input */ 12150caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger stvp->input_to_index[VERT_ATTRIB_EDGEFLAG] = stvp->num_inputs; 12250caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger stvp->index_to_input[stvp->num_inputs] = VERT_ATTRIB_EDGEFLAG; 123f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 12407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell /* Compute mapping of vertex program outputs to slots. 125f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 126f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_RESULT_MAX; attr++) { 127b46750d601655c39ccb967ae525d4edcbb9fb9d2Ben Skeggs if ((stvp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr)) == 0) { 12807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->result_to_output[attr] = ~0; 12907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell } 13007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell else { 13107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell unsigned slot = stvp->num_outputs++; 13207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 13307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->result_to_output[attr] = slot; 134f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 135f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian switch (attr) { 136f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_HPOS: 13707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 13807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 139f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 140f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL0: 14107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 14207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 143f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 144f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL1: 14507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 14607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 1; 147f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 148f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC0: 14907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 15007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 151f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 152f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC1: 15307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 15407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 1; 155f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 156f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_FOGC: 15707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_FOG; 15807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 159f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 160f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_PSIZ: 16107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 16207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 163f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 164f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_EDGE: 165f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian assert(0); 166f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 16707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 168f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX0: 169f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX1: 170f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX2: 171f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX3: 172f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX4: 173f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX5: 174f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX6: 175f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX7: 17607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 17707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = attr - VERT_RESULT_TEX0; 17807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell break; 17907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 180f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_VAR0: 181f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian default: 18207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell assert(attr < VERT_RESULT_MAX); 18307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 18407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = (FRAG_ATTRIB_VAR0 - 18507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell FRAG_ATTRIB_TEX0 + 18607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell attr - 18707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell VERT_RESULT_VAR0); 18807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell break; 189f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 190f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 191f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 192890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger /* similar hack to above, presetup potentially unused edgeflag output */ 193890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->result_to_output[VERT_RESULT_EDGE] = stvp->num_outputs; 194890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->output_semantic_name[stvp->num_outputs] = TGSI_SEMANTIC_EDGEFLAG; 195890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->output_semantic_index[stvp->num_outputs] = 0; 19607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell} 197f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 198509d9eb686411254b24139012b7594e10a760b6cBrian Paul 19907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellstruct st_vp_varient * 20007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_translate_vertex_program(struct st_context *st, 20107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp, 20207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell const struct st_vp_varient_key *key) 20307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{ 20407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vp_varient *vpv = CALLOC_STRUCT(st_vp_varient); 20507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct pipe_context *pipe = st->pipe; 206a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell struct ureg_program *ureg; 207a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger enum pipe_error error; 208890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger unsigned num_outputs; 209a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian 21083baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_OUTPUT); 21183baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_VARYING); 21283baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák 213a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg = ureg_create( TGSI_PROCESSOR_VERTEX ); 214b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee if (ureg == NULL) { 215b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee FREE(vpv); 216a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell return NULL; 217b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee } 218a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 21950caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger vpv->num_inputs = stvp->num_inputs; 220890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger num_outputs = stvp->num_outputs; 221890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger if (key->passthrough_edgeflags) { 222890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger vpv->num_inputs++; 223890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger num_outputs++; 224890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger } 225a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian 226ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul if (ST_DEBUG & DEBUG_MESA) { 227ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul _mesa_print_program(&stvp->Base.Base); 228ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul _mesa_print_program_parameters(st->ctx, &stvp->Base.Base); 229ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul debug_printf("\n"); 230ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul } 231ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul 232a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell error = 2334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell st_translate_mesa_program(st->ctx, 2344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell TGSI_PROCESSOR_VERTEX, 235a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg, 2364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell &stvp->Base.Base, 2374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* inputs */ 238890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger vpv->num_inputs, 2394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell stvp->input_to_index, 240b44b70dc114ddcfb4d359759928df4d7b9efaafbKeith Whitwell NULL, /* input semantic name */ 241b44b70dc114ddcfb4d359759928df4d7b9efaafbKeith Whitwell NULL, /* input semantic index */ 2424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell NULL, 2434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* outputs */ 244890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger num_outputs, 24507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->result_to_output, 24607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name, 247890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->output_semantic_index, 248890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger key->passthrough_edgeflags ); 24925b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin 250a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger if (error) 251a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell goto fail; 252a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 253b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul vpv->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 254b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul if (!vpv->tgsi.tokens) 2559d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger goto fail; 2569d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger 257a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg_destroy( ureg ); 25825b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin 259b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi); 260f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 261b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_TGSI) { 262b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul tgsi_dump( vpv->tgsi.tokens, 0 ); 263b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("\n"); 264b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell } 26507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 26607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell return vpv; 267a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 268a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwellfail: 2699d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger debug_printf("%s: failed to translate Mesa program:\n", __FUNCTION__); 2709d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger _mesa_print_program(&stvp->Base.Base); 2719d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger debug_assert(0); 2729d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger 273a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg_destroy( ureg ); 274a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell return NULL; 275f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 276f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 277f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 278f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 279f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 280f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa fragment shader into a TGSI shader. 281f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return pointer to cached pipe_shader object. 282f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 283b456f1374fc958e53efc80ee38ef343f580c1d6bBrian Paulvoid 284f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_fragment_program(struct st_context *st, 285e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell struct st_fragment_program *stfp ) 286f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 287339e7ec6805e6de8794514c0a935081b5d36d38fBrian struct pipe_context *pipe = st->pipe; 288f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint outputMapping[FRAG_RESULT_MAX]; 289e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell GLuint inputMapping[FRAG_ATTRIB_MAX]; 290e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul GLuint interpMode[PIPE_MAX_SHADER_INPUTS]; /* XXX size? */ 291f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint attr; 292a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger enum pipe_error error; 293e785f190f0d49f0367f7468c22b77962d0f14ea0Brian const GLbitfield inputsRead = stfp->Base.Base.InputsRead; 294a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell struct ureg_program *ureg; 295f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 296e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; 297e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS]; 298fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul uint fs_num_inputs = 0; 299fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 300fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 301fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 302fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul uint fs_num_outputs = 0; 303fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 30483baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT); 30583baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák 306f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 307f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Convert Mesa program inputs to TGSI input register semantics. 308f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 309f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) { 310f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (inputsRead & (1 << attr)) { 311e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell const GLuint slot = fs_num_inputs++; 312f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 313e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell inputMapping[attr] = slot; 314e785f190f0d49f0367f7468c22b77962d0f14ea0Brian 315f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian switch (attr) { 316f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_WPOS: 317e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 318e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_index[slot] = 0; 319e785f190f0d49f0367f7468c22b77962d0f14ea0Brian interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 320f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 321f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_COL0: 322e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 323e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_index[slot] = 0; 324f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 325f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 326f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_COL1: 327e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 328e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_index[slot] = 1; 329f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 330f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 3319d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul case FRAG_ATTRIB_FOGC: 332e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 333e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_index[slot] = 0; 3349d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 3359d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul break; 3369d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul case FRAG_ATTRIB_FACE: 337e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_name[slot] = TGSI_SEMANTIC_FACE; 338e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_index[slot] = 0; 3399d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul interpMode[slot] = TGSI_INTERPOLATE_CONSTANT; 3409d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul break; 34107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell /* In most cases, there is nothing special about these 34207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * inputs, so adopt a convention to use the generic 34307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * semantic name and the mesa FRAG_ATTRIB_ number as the 34407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * index. 34507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * 34607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * All that is required is that the vertex shader labels 34707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * its own outputs similarly, and that the vertex shader 34807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * generates at least every output required by the 34907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * fragment shader plus fixed-function hardware (such as 35007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * BFC). 35107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * 35207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * There is no requirement that semantic indexes start at 35307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * zero or be restricted to a particular range -- nobody 35407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * should be building tables based on semantic index. 35507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell */ 356e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul case FRAG_ATTRIB_PNTC: 357f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX0: 358f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX1: 359f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX2: 360f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX3: 361f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX4: 362f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX5: 363f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX6: 364f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX7: 365f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_VAR0: 366f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian default: 36707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell /* Actually, let's try and zero-base this just for 36807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * readability of the generated TGSI. 36907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell */ 37007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell assert(attr >= FRAG_ATTRIB_TEX0); 371e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0); 372e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 373e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul if (attr == FRAG_ATTRIB_PNTC) 374e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 375e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul else 376e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 37707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell break; 378f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 379f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 380e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell else { 381e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell inputMapping[attr] = -1; 382e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell } 383f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 384f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 385f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 386bc139a19b00f8686caa8db7c56af2087f26e369aBrian * Semantics and mapping for outputs 387f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 388635c4c41bdf111462939da292d65328595d314e8Brian { 389635c4c41bdf111462939da292d65328595d314e8Brian uint numColors = 0; 3905606dfb572bf4b89b4882265924705bacc8c182bIan Romanick GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten; 391635c4c41bdf111462939da292d65328595d314e8Brian 392bc139a19b00f8686caa8db7c56af2087f26e369aBrian /* if z is written, emit that first */ 393b46750d601655c39ccb967ae525d4edcbb9fb9d2Ben Skeggs if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) { 394fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION; 395fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_index[fs_num_outputs] = 0; 3968d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs; 397fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_num_outputs++; 3988d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul outputsWritten &= ~(1 << FRAG_RESULT_DEPTH); 399635c4c41bdf111462939da292d65328595d314e8Brian } 400635c4c41bdf111462939da292d65328595d314e8Brian 401ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) { 402ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_STENCIL; 403ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie fs_output_semantic_index[fs_num_outputs] = 0; 404ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs; 405ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie fs_num_outputs++; 406ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie outputsWritten &= ~(1 << FRAG_RESULT_STENCIL); 407ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie } 408ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie 409bc139a19b00f8686caa8db7c56af2087f26e369aBrian /* handle remaning outputs (color) */ 410635c4c41bdf111462939da292d65328595d314e8Brian for (attr = 0; attr < FRAG_RESULT_MAX; attr++) { 411b46750d601655c39ccb967ae525d4edcbb9fb9d2Ben Skeggs if (outputsWritten & BITFIELD64_BIT(attr)) { 412635c4c41bdf111462939da292d65328595d314e8Brian switch (attr) { 4138d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul case FRAG_RESULT_DEPTH: 414ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie case FRAG_RESULT_STENCIL: 415bc139a19b00f8686caa8db7c56af2087f26e369aBrian /* handled above */ 416635c4c41bdf111462939da292d65328595d314e8Brian assert(0); 417635c4c41bdf111462939da292d65328595d314e8Brian break; 418af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca default: 419af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca assert(attr == FRAG_RESULT_COLOR || 420af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca (FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX)); 421fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR; 422fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_index[fs_num_outputs] = numColors; 423fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul outputMapping[attr] = fs_num_outputs; 424635c4c41bdf111462939da292d65328595d314e8Brian numColors++; 425635c4c41bdf111462939da292d65328595d314e8Brian break; 426635c4c41bdf111462939da292d65328595d314e8Brian } 427c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul 428fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_num_outputs++; 429f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 430f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 431f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 432f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 433a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT ); 434a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell if (ureg == NULL) 435a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger return; 436a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 437ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul if (ST_DEBUG & DEBUG_MESA) { 438ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul _mesa_print_program(&stfp->Base.Base); 439ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul _mesa_print_program_parameters(st->ctx, &stfp->Base.Base); 440ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul debug_printf("\n"); 441ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul } 442a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 443a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger error = 4444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell st_translate_mesa_program(st->ctx, 4454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell TGSI_PROCESSOR_FRAGMENT, 446a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger ureg, 4474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell &stfp->Base.Base, 4484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* inputs */ 4494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell fs_num_inputs, 4504295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell inputMapping, 451e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_name, 452e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_index, 4534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell interpMode, 4544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* outputs */ 4554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell fs_num_outputs, 4564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputMapping, 4574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell fs_output_semantic_name, 458890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger fs_output_semantic_index, FALSE ); 4594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 460b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul stfp->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 461a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger ureg_destroy( ureg ); 462b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul stfp->driver_shader = pipe->create_fs_state(pipe, &stfp->tgsi); 463f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 464b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_TGSI) { 465b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul tgsi_dump( stfp->tgsi.tokens, 0/*TGSI_DUMP_VERBOSE*/ ); 466b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("\n"); 467b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell } 468f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 469f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 470da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinvoid 471da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinst_translate_geometry_program(struct st_context *st, 472da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin struct st_geometry_program *stgp) 473da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin{ 474da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint inputMapping[GEOM_ATTRIB_MAX]; 475da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint outputMapping[GEOM_RESULT_MAX]; 476da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin struct pipe_context *pipe = st->pipe; 477da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin enum pipe_error error; 478da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint attr; 479da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin const GLbitfield inputsRead = stgp->Base.Base.InputsRead; 480da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint vslot = 0; 481da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint num_generic = 0; 482da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 483da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_num_inputs = 0; 484da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_builtin_inputs = 0; 485da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_array_offset = 0; 486da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 487da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ubyte gs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 488da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ubyte gs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 489da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_num_outputs = 0; 490da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 491da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLint i; 492da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint maxSlot = 0; 493da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin struct ureg_program *ureg; 494da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 49583baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_OUTPUT); 49683baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_VARYING); 49783baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák 498da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg = ureg_create( TGSI_PROCESSOR_GEOMETRY ); 499da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (ureg == NULL) { 500da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin return; 501da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 502da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 503da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* which vertex output goes to the first geometry input */ 5047c42390453e611367cf1ba11446692ec04e0abfbZack Rusin vslot = 0; 505da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 506425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin memset(inputMapping, 0, sizeof(inputMapping)); 507425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin memset(outputMapping, 0, sizeof(outputMapping)); 508425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin 509da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* 510da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * Convert Mesa program inputs to TGSI input register semantics. 511da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin */ 512da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (attr = 0; attr < GEOM_ATTRIB_MAX; attr++) { 513da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (inputsRead & (1 << attr)) { 514da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin const GLuint slot = gs_num_inputs; 515da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 516da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_inputs++; 517da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 518da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin inputMapping[attr] = slot; 519da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 520da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_map[slot + gs_array_offset] = vslot - gs_builtin_inputs; 521da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_to_index[attr] = vslot; 522da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->index_to_input[vslot] = attr; 523da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ++vslot; 524da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 5257c42390453e611367cf1ba11446692ec04e0abfbZack Rusin if (attr != GEOM_ATTRIB_PRIMITIVE_ID) { 526da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_array_offset += 2; 527da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } else 528da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ++gs_builtin_inputs; 529da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 530da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#if 1 531da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin debug_printf("input map at %d = %d\n", 532da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin slot + gs_array_offset, stgp->input_map[slot + gs_array_offset]); 533da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif 534da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 535da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin switch (attr) { 536da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_PRIMITIVE_ID: 537da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_PRIMID; 538da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 539da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 540da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_POSITION: 541da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 542da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 543da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 544da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_COLOR0: 545da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 546da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 547da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 548da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_COLOR1: 549da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 550da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 1; 551da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 552da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_FOG_FRAG_COORD: 553da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 554da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 555da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 556da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_TEX_COORD: 557da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 558da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = num_generic++; 559da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 560da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_VAR0: 561da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* fall-through */ 562da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin default: 563da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 564da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = num_generic++; 565da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 566da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 567da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 568da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 569da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* initialize output semantics to defaults */ 570da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) { 571da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[i] = TGSI_SEMANTIC_GENERIC; 572da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[i] = 0; 573da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 574da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 575da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin num_generic = 0; 576da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* 577da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * Determine number of outputs, the (default) output register 578da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * mapping and the semantic information for each output. 579da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin */ 580da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (attr = 0; attr < GEOM_RESULT_MAX; attr++) { 581da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (stgp->Base.Base.OutputsWritten & (1 << attr)) { 582da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint slot; 583da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 584da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin slot = gs_num_outputs; 585da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_outputs++; 586da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin outputMapping[attr] = slot; 587da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 588da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin switch (attr) { 589da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_POS: 590da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(slot == 0); 591da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 592da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 593da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 594da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_COL0: 595da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 596da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 597da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 598da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_COL1: 599da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 600da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 1; 601da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 602da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_SCOL0: 603da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 604da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 605da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 606da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_SCOL1: 607da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 608da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 1; 609da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 610da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_FOGC: 611da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_FOG; 612da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 613da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 614da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_PSIZ: 615da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 616da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 617da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 618da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX0: 619da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX1: 620da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX2: 621da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX3: 622da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX4: 623da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX5: 624da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX6: 625da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX7: 626da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* fall-through */ 627da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_VAR0: 628da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* fall-through */ 629da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin default: 630da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(slot < Elements(gs_output_semantic_name)); 631da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* use default semantic info */ 632da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 633da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = num_generic++; 634da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 635da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 636da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 637da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 638da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(gs_output_semantic_name[0] == TGSI_SEMANTIC_POSITION); 639da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 640da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* find max output slot referenced to compute gs_num_outputs */ 641da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (attr = 0; attr < GEOM_RESULT_MAX; attr++) { 642da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (outputMapping[attr] != ~0 && outputMapping[attr] > maxSlot) 643da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin maxSlot = outputMapping[attr]; 644da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 645da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_outputs = maxSlot + 1; 646da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 647da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#if 0 /* debug */ 648da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin { 649da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint i; 650da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf("outputMapping? %d\n", outputMapping ? 1 : 0); 651da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (outputMapping) { 652da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf("attr -> slot\n"); 653da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < 16; i++) { 654da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf(" %2d %3d\n", i, outputMapping[i]); 655da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 656da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 657da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf("slot sem_name sem_index\n"); 658da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < gs_num_outputs; i++) { 659da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf(" %2d %d %d\n", 660da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin i, 661da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[i], 662da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[i]); 663da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 664da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 665da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif 666da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 667da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* free old shader state, if any */ 668da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (stgp->tgsi.tokens) { 669da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin st_free_tokens(stgp->tgsi.tokens); 670da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->tgsi.tokens = NULL; 671da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 672da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (stgp->driver_shader) { 673da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin cso_delete_geometry_shader(st->cso_context, stgp->driver_shader); 674da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->driver_shader = NULL; 675da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 676da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 677da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_property_gs_input_prim(ureg, stgp->Base.InputType); 678da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_property_gs_output_prim(ureg, stgp->Base.OutputType); 679da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_property_gs_max_vertices(ureg, stgp->Base.VerticesOut); 680da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 681da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin error = st_translate_mesa_program(st->ctx, 682da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin TGSI_PROCESSOR_GEOMETRY, 683da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg, 684da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin &stgp->Base.Base, 685da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* inputs */ 686da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_inputs, 687da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin inputMapping, 688da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name, 689da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index, 690da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin NULL, 691da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* outputs */ 692da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_outputs, 693da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin outputMapping, 694da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name, 695da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index, 696da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin FALSE); 697da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 698da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 699da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->num_inputs = gs_num_inputs; 700da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 701da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_destroy( ureg ); 702da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->driver_shader = pipe->create_gs_state(pipe, &stgp->tgsi); 703da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 704da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) { 705da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin _mesa_print_program(&stgp->Base.Base); 706da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin debug_printf("\n"); 707da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 708da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 709da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (ST_DEBUG & DEBUG_TGSI) { 710da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin tgsi_dump(stgp->tgsi.tokens, 0); 711da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin debug_printf("\n"); 712da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 713da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin} 714678f80b347801d925c07a774faee1ed3f716de15Brian Paul 715678f80b347801d925c07a774faee1ed3f716de15Brian Paul/** 716678f80b347801d925c07a774faee1ed3f716de15Brian Paul * Debug- print current shader text 717678f80b347801d925c07a774faee1ed3f716de15Brian Paul */ 718678f80b347801d925c07a774faee1ed3f716de15Brian Paulvoid 719f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_print_shaders(struct gl_context *ctx) 720678f80b347801d925c07a774faee1ed3f716de15Brian Paul{ 72184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick struct gl_shader_program *shProg[3] = { 72284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick ctx->Shader.CurrentVertexProgram, 72384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick ctx->Shader.CurrentGeometryProgram, 72484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick ctx->Shader.CurrentFragmentProgram, 72584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick }; 72684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick unsigned j; 72784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 72884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick for (j = 0; j < 3; j++) { 72984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick unsigned i; 73084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 73184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick if (shProg[j] == NULL) 73284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick continue; 73384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 73484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick for (i = 0; i < shProg[j]->NumShaders; i++) { 73584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick struct gl_shader *sh; 73684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 73784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick switch (shProg[j]->Shaders[i]->Type) { 73884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick case GL_VERTEX_SHADER: 73984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick sh = (i != 0) ? NULL : shProg[j]->Shaders[i]; 74084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick break; 74184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick case GL_GEOMETRY_SHADER_ARB: 74284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick sh = (i != 1) ? NULL : shProg[j]->Shaders[i]; 74384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick break; 74484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick case GL_FRAGMENT_SHADER: 74584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick sh = (i != 2) ? NULL : shProg[j]->Shaders[i]; 74684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick break; 747a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee default: 748a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee assert(0); 749a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee sh = NULL; 750a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee break; 75184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick } 75284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 75384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick if (sh != NULL) { 75484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick printf("GLSL shader %u of %u:\n", i, shProg[j]->NumShaders); 75584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick printf("%s\n", sh->Source); 75684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick } 757678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 758678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 759678f80b347801d925c07a774faee1ed3f716de15Brian Paul} 760