00001 /************************************************************************** 00002 * 00003 * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 00004 * All Rights Reserved. 00005 * 00006 * Permission is hereby granted, free of charge, to any person obtaining a 00007 * copy of this software and associated documentation files (the 00008 * "Software"), to deal in the Software without restriction, including 00009 * without limitation the rights to use, copy, modify, merge, publish, 00010 * distribute, sub license, and/or sell copies of the Software, and to 00011 * permit persons to whom the Software is furnished to do so, subject to 00012 * the following conditions: 00013 * 00014 * The above copyright notice and this permission notice (including the 00015 * next paragraph) shall be included in all copies or substantial portions 00016 * of the Software. 00017 * 00018 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 00019 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 00020 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 00021 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 00022 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 00023 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 00024 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 00025 * 00026 **************************************************************************/ 00027 00028 #include "pipe/p_debug.h" 00029 #include "tgsi_iterate.h" 00030 00031 boolean 00032 tgsi_iterate_shader( 00033 const struct tgsi_token *tokens, 00034 struct tgsi_iterate_context *ctx ) 00035 { 00036 struct tgsi_parse_context parse; 00037 00038 if (tgsi_parse_init( &parse, tokens ) != TGSI_PARSE_OK) 00039 return FALSE; 00040 00041 ctx->processor = parse.FullHeader.Processor; 00042 ctx->version = parse.FullVersion.Version; 00043 00044 if (ctx->prolog) 00045 if (!ctx->prolog( ctx )) 00046 goto fail; 00047 00048 while (!tgsi_parse_end_of_tokens( &parse )) { 00049 tgsi_parse_token( &parse ); 00050 00051 switch (parse.FullToken.Token.Type) { 00052 case TGSI_TOKEN_TYPE_INSTRUCTION: 00053 if (ctx->iterate_instruction) 00054 if (!ctx->iterate_instruction( ctx, &parse.FullToken.FullInstruction )) 00055 goto fail; 00056 break; 00057 00058 case TGSI_TOKEN_TYPE_DECLARATION: 00059 if (ctx->iterate_declaration) 00060 if (!ctx->iterate_declaration( ctx, &parse.FullToken.FullDeclaration )) 00061 goto fail; 00062 break; 00063 00064 case TGSI_TOKEN_TYPE_IMMEDIATE: 00065 if (ctx->iterate_immediate) 00066 if (!ctx->iterate_immediate( ctx, &parse.FullToken.FullImmediate )) 00067 goto fail; 00068 break; 00069 00070 default: 00071 assert( 0 ); 00072 } 00073 } 00074 00075 if (ctx->epilog) 00076 if (!ctx->epilog( ctx )) 00077 goto fail; 00078 00079 tgsi_parse_free( &parse ); 00080 return TRUE; 00081 00082 fail: 00083 tgsi_parse_free( &parse ); 00084 return FALSE; 00085 }