13b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich/**************************************************************************
23b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich *
33b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
43b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * All Rights Reserved.
53b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich *
63b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * Permission is hereby granted, free of charge, to any person obtaining a
73b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * copy of this software and associated documentation files (the
83b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * "Software"), to deal in the Software without restriction, including
98a43715afb478fa8be16187374618be33ff49442MK Ryu * without limitation the rights to use, copy, modify, merge, publish,
103b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * distribute, sub license, and/or sell copies of the Software, and to
113b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * permit persons to whom the Software is furnished to do so, subject to
123b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * the following conditions:
13f960d89a7b197fe3b3bd28546c6c89c2331b9f14Jakob Juelich *
143b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * The above copyright notice and this permission notice (including the
158a43715afb478fa8be16187374618be33ff49442MK Ryu * next paragraph) shall be included in all copies or substantial portions
163b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * of the Software.
173b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich *
183b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
193b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
203b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
211e1c41b1b4a1b97c0b7086b8430856ed45e064d3Gabe Black * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
2222dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
233b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
245949b4af7a872aeb58e7ad29090812d648725ed5Prashanth Balasubramanian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
258421d5905ab0aed8689c2eea6be8d9c4042ce618Jakob Juelich *
260cb2a3b1d2d86d70da06a3f45be9297139e48207Fang Deng **************************************************************************/
2789cca5d6ef8df35f1b294b16bf536a8f3ffb5efbMK Ryu
2875be1d3f881ef4f4f9cffe0c38fc3139338d8f84Prashanth Balasubramanian#include "util/u_debug.h"
293b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich#include "tgsi_iterate.h"
303b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich
313b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelichboolean
323b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelichtgsi_iterate_shader(
333b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich   const struct tgsi_token *tokens,
343b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich   struct tgsi_iterate_context *ctx )
353b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich{
363b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich   struct tgsi_parse_context parse;
373b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich
383b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich   if (tgsi_parse_init( &parse, tokens ) != TGSI_PARSE_OK)
393b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich      return FALSE;
403b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich
413b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich   ctx->processor = parse.FullHeader.Processor;
423b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich
433b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich   if (ctx->prolog)
443b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich      if (!ctx->prolog( ctx ))
453b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich         goto fail;
463b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich
473b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich   while (!tgsi_parse_end_of_tokens( &parse )) {
483b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich      tgsi_parse_token( &parse );
493b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich
501b52574752be108a743d3b33561c34324f8538e7Jakob Juelich      switch (parse.FullToken.Token.Type) {
511b52574752be108a743d3b33561c34324f8538e7Jakob Juelich      case TGSI_TOKEN_TYPE_INSTRUCTION:
521b52574752be108a743d3b33561c34324f8538e7Jakob Juelich         if (ctx->iterate_instruction)
531b52574752be108a743d3b33561c34324f8538e7Jakob Juelich            if (!ctx->iterate_instruction( ctx, &parse.FullToken.FullInstruction ))
541b52574752be108a743d3b33561c34324f8538e7Jakob Juelich               goto fail;
551b52574752be108a743d3b33561c34324f8538e7Jakob Juelich         break;
563b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich
573b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich      case TGSI_TOKEN_TYPE_DECLARATION:
583b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich         if (ctx->iterate_declaration)
593b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich            if (!ctx->iterate_declaration( ctx, &parse.FullToken.FullDeclaration ))
601b52574752be108a743d3b33561c34324f8538e7Jakob Juelich               goto fail;
611b52574752be108a743d3b33561c34324f8538e7Jakob Juelich         break;
621b52574752be108a743d3b33561c34324f8538e7Jakob Juelich
633b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich      case TGSI_TOKEN_TYPE_IMMEDIATE:
643b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich         if (ctx->iterate_immediate)
653b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich            if (!ctx->iterate_immediate( ctx, &parse.FullToken.FullImmediate ))
663b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich               goto fail;
673b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich         break;
683b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich
693b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich      case TGSI_TOKEN_TYPE_PROPERTY:
703b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich         if (ctx->iterate_property)
713b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich            if (!ctx->iterate_property( ctx,  &parse.FullToken.FullProperty ))
723b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich               goto fail;
733b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich         break;
743b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich
753b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich      default:
763b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich         assert( 0 );
773b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich      }
783b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich   }
793b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich
801b52574752be108a743d3b33561c34324f8538e7Jakob Juelich   if (ctx->epilog)
811b52574752be108a743d3b33561c34324f8538e7Jakob Juelich      if (!ctx->epilog( ctx ))
821b52574752be108a743d3b33561c34324f8538e7Jakob Juelich         goto fail;
831b52574752be108a743d3b33561c34324f8538e7Jakob Juelich
843b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich   tgsi_parse_free( &parse );
853b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich   return TRUE;
863b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich
873b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelichfail:
88f960d89a7b197fe3b3bd28546c6c89c2331b9f14Jakob Juelich   tgsi_parse_free( &parse );
898421d5905ab0aed8689c2eea6be8d9c4042ce618Jakob Juelich   return FALSE;
908421d5905ab0aed8689c2eea6be8d9c4042ce618Jakob Juelich}
918421d5905ab0aed8689c2eea6be8d9c4042ce618Jakob Juelich