13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/**************************************************************************
23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * All Rights Reserved.
53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * copy of this software and associated documentation files (the
83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * "Software"), to deal in the Software without restriction, including
93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * permit persons to whom the Software is furnished to do so, subject to
123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the following conditions:
133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * The above copyright notice and this permission notice (including the
153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * next paragraph) shall be included in all copies or substantial portions
163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * of the Software.
173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org **************************************************************************/
273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/**
293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * TGSI program transformation utility.
303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Authors:  Brian Paul
323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "util/u_debug.h"
353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "tgsi_transform.h"
373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void
413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgemit_instruction(struct tgsi_transform_context *ctx,
423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                 const struct tgsi_full_instruction *inst)
433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   uint ti = ctx->ti;
453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ti += tgsi_build_full_instruction(inst,
473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     ctx->tokens_out + ti,
483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     ctx->header,
493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     ctx->max_tokens_out - ti);
503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ctx->ti = ti;
513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void
553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgemit_declaration(struct tgsi_transform_context *ctx,
563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                 const struct tgsi_full_declaration *decl)
573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   uint ti = ctx->ti;
593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ti += tgsi_build_full_declaration(decl,
613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     ctx->tokens_out + ti,
623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     ctx->header,
633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     ctx->max_tokens_out - ti);
643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ctx->ti = ti;
653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void
693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgemit_immediate(struct tgsi_transform_context *ctx,
703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org               const struct tgsi_full_immediate *imm)
713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   uint ti = ctx->ti;
733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ti += tgsi_build_full_immediate(imm,
753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                   ctx->tokens_out + ti,
763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                   ctx->header,
773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                   ctx->max_tokens_out - ti);
783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ctx->ti = ti;
793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
82760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgstatic void
83760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgemit_property(struct tgsi_transform_context *ctx,
84760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org              const struct tgsi_full_property *prop)
85760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org{
86760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   uint ti = ctx->ti;
87760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
88760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   ti += tgsi_build_full_property(prop,
89760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                                  ctx->tokens_out + ti,
90760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                                  ctx->header,
91760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                                  ctx->max_tokens_out - ti);
92760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   ctx->ti = ti;
93760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org}
94760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/**
973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Apply user-defined transformations to the input shader to produce
983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the output shader.
993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * For example, a register search-and-replace operation could be applied
1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * by defining a transform_instruction() callback that examined and changed
1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the instruction src/dest regs.
1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
1033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \return number of tokens emitted
1043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
1053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgint
1063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgtgsi_transform_shader(const struct tgsi_token *tokens_in,
1073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                      struct tgsi_token *tokens_out,
1083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                      uint max_tokens_out,
1093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                      struct tgsi_transform_context *ctx)
1103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
1113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   uint procType;
1123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* input shader */
1143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct tgsi_parse_context parse;
1153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* output shader */
1173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct tgsi_processor *processor;
1183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /**
1213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    ** callback context init
1223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    **/
1233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ctx->emit_instruction = emit_instruction;
1243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ctx->emit_declaration = emit_declaration;
1253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ctx->emit_immediate = emit_immediate;
126760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   ctx->emit_property = emit_property;
1273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ctx->tokens_out = tokens_out;
1283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ctx->max_tokens_out = max_tokens_out;
1293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /**
1323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    ** Setup to begin parsing input shader
1333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    **/
1343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (tgsi_parse_init( &parse, tokens_in ) != TGSI_PARSE_OK) {
1353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      debug_printf("tgsi_parse_init() failed in tgsi_transform_shader()!\n");
1363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return -1;
1373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
1383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   procType = parse.FullHeader.Processor.Processor;
1393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   assert(procType == TGSI_PROCESSOR_FRAGMENT ||
1403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org          procType == TGSI_PROCESSOR_VERTEX ||
1413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org          procType == TGSI_PROCESSOR_GEOMETRY);
1423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /**
1453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    **  Setup output shader
1463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    **/
147760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   ctx->header = (struct tgsi_header *)tokens_out;
1483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   *ctx->header = tgsi_build_header();
1493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
150760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   processor = (struct tgsi_processor *) (tokens_out + 1);
1513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   *processor = tgsi_build_processor( procType, ctx->header );
1523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
153760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   ctx->ti = 2;
1543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /**
1573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    ** Loop over incoming program tokens/instructions
1583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    */
1593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   while( !tgsi_parse_end_of_tokens( &parse ) ) {
1603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      tgsi_parse_token( &parse );
1623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      switch( parse.FullToken.Token.Type ) {
1643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      case TGSI_TOKEN_TYPE_INSTRUCTION:
1653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         {
1663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            struct tgsi_full_instruction *fullinst
1673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org               = &parse.FullToken.FullInstruction;
1683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            if (ctx->transform_instruction)
1703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org               ctx->transform_instruction(ctx, fullinst);
1713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            else
1723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org               ctx->emit_instruction(ctx, fullinst);
1733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         }
1743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         break;
1753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      case TGSI_TOKEN_TYPE_DECLARATION:
1773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         {
1783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            struct tgsi_full_declaration *fulldecl
1793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org               = &parse.FullToken.FullDeclaration;
1803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            if (ctx->transform_declaration)
1823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org               ctx->transform_declaration(ctx, fulldecl);
1833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            else
1843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org               ctx->emit_declaration(ctx, fulldecl);
1853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         }
1863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         break;
1873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      case TGSI_TOKEN_TYPE_IMMEDIATE:
1893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         {
1903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            struct tgsi_full_immediate *fullimm
1913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org               = &parse.FullToken.FullImmediate;
1923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            if (ctx->transform_immediate)
1943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org               ctx->transform_immediate(ctx, fullimm);
1953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            else
1963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org               ctx->emit_immediate(ctx, fullimm);
1973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         }
1983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         break;
199760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      case TGSI_TOKEN_TYPE_PROPERTY:
200760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org         {
201760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            struct tgsi_full_property *fullprop
202760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org               = &parse.FullToken.FullProperty;
203760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
204760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            if (ctx->transform_property)
205760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org               ctx->transform_property(ctx, fullprop);
206760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            else
207760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org               ctx->emit_property(ctx, fullprop);
208760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org         }
209760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org         break;
2103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      default:
2123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         assert( 0 );
2133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
2143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
2153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (ctx->epilog) {
2173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      ctx->epilog(ctx);
2183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
2193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   tgsi_parse_free (&parse);
2213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return ctx->ti;
2233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
2243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "tgsi_text.h"
2273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgextern int tgsi_transform_foo( struct tgsi_token *tokens_out,
2293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                               uint max_tokens_out );
2303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* This function exists only so that tgsi_text_translate() doesn't get
2323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * magic-ed out of the libtgsi.a archive by the build system.  Don't
2333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * remove unless you know this has been fixed - check on mingw/scons
2343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * builds as well.
2353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
2363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgint
2373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgtgsi_transform_foo( struct tgsi_token *tokens_out,
2383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                    uint max_tokens_out )
2393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
2403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   const char *text =
241760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      "FRAG\n"
2423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      "DCL IN[0], COLOR, CONSTANT\n"
2433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      "DCL OUT[0], COLOR\n"
2443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      "  0: MOV OUT[0], IN[0]\n"
2453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      "  1: END";
2463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return tgsi_text_translate( text,
2483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                               tokens_out,
2493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                               max_tokens_out );
2503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
251