1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_prim.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi_text.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi_build.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi_info.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi_parse.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi_sanity.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi_strings.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi_util.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi_dump.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean is_alpha_underscore( const char *cur ) 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*cur >= 'a' && *cur <= 'z') || 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*cur >= 'A' && *cur <= 'Z') || 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *cur == '_'; 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean is_digit( const char *cur ) 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return *cur >= '0' && *cur <= '9'; 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean is_digit_alpha_underscore( const char *cur ) 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return is_digit( cur ) || is_alpha_underscore( cur ); 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic char uprcase( char c ) 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c >= 'a' && c <= 'z') 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return c + 'A' - 'a'; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return c; 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Ignore case of str1 and assume str1 is already uppercase. 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return TRUE iff str1 and str2 are equal. 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstreq_nocase_uprcase(const char *str1, 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *str2) 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (*str1 && *str2) { 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*str1 != uprcase(*str2)) 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org str1++; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org str2++; 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return *str1 == 0 && *str2 == 0; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Return TRUE if both strings match. 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The second string is terminated by zero. 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The pointer to the first string is moved at end of the read word 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * on success. 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean str_match_no_case( const char **pcur, const char *str ) 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur = *pcur; 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (*str != '\0' && *str == uprcase( *cur )) { 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org str++; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*str == '\0') { 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pcur = cur; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Return TRUE if both strings match. 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The first string is be terminated by a non-digit non-letter non-underscore 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * character, the second string is terminated by zero. 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The pointer to the first string is moved at end of the read word 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * on success. 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean str_match_nocase_whole( const char **pcur, const char *str ) 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur = *pcur; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (str_match_no_case(&cur, str) && 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !is_digit_alpha_underscore(cur)) { 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pcur = cur; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Eat zero or more whitespaces. 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void eat_opt_white( const char **pcur ) 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (**pcur == ' ' || **pcur == '\t' || **pcur == '\n') 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*pcur)++; 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Eat one or more whitespaces. 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return TRUE if at least one whitespace eaten. 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean eat_white( const char **pcur ) 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur = *pcur; 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( pcur ); 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return *pcur > cur; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Parse unsigned integer. 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * No checks for overflow. 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean parse_uint( const char **pcur, uint *val ) 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur = *pcur; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_digit( cur )) { 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *val = *cur++ - '0'; 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (is_digit( cur )) 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *val = *val * 10 + *cur++ - '0'; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pcur = cur; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean parse_int( const char **pcur, int *val ) 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur = *pcur; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int sign = (*cur == '-' ? -1 : 1); 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*cur == '+' || *cur == '-') 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (parse_uint(&cur, (uint *)val)) { 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *val *= sign; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pcur = cur; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean parse_identifier( const char **pcur, char *ret ) 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur = *pcur; 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i = 0; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_alpha_underscore( cur )) { 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret[i++] = *cur++; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (is_alpha_underscore( cur ) || is_digit( cur )) 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret[i++] = *cur++; 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret[i++] = '\0'; 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pcur = cur; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Parse floating point. 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean parse_float( const char **pcur, float *val ) 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur = *pcur; 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean integral_part = FALSE; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean fractional_part = FALSE; 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *val = (float) atof( cur ); 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*cur == '-' || *cur == '+') 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_digit( cur )) { 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org integral_part = TRUE; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (is_digit( cur )) 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*cur == '.') { 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_digit( cur )) { 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fractional_part = TRUE; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (is_digit( cur )) 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!integral_part && !fractional_part) 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (uprcase( *cur ) == 'E') { 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*cur == '-' || *cur == '+') 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_digit( cur )) { 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (is_digit( cur )) 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pcur = cur; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct translate_ctx 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *text; 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur; 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_token *tokens; 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_token *tokens_cur; 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_token *tokens_end; 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_header *header; 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned processor : 4; 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int implied_array_size : 5; 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void report_error( struct translate_ctx *ctx, const char *msg ) 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int line = 1; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int column = 1; 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *itr = ctx->text; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (itr != ctx->cur) { 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*itr == '\n') { 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org column = 1; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++line; 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++column; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++itr; 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf( "\nTGSI asm error: %s [%d : %d] \n", msg, line, column ); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Parse shader header. 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return TRUE for one of the following headers. 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FRAG 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GEOM 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * VERT 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean parse_header( struct translate_ctx *ctx ) 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint processor; 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (str_match_nocase_whole( &ctx->cur, "FRAG" )) 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org processor = TGSI_PROCESSOR_FRAGMENT; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (str_match_nocase_whole( &ctx->cur, "VERT" )) 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org processor = TGSI_PROCESSOR_VERTEX; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (str_match_nocase_whole( &ctx->cur, "GEOM" )) 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org processor = TGSI_PROCESSOR_GEOMETRY; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (str_match_nocase_whole( &ctx->cur, "COMP" )) 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org processor = TGSI_PROCESSOR_COMPUTE; 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Unknown header" ); 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->tokens_cur >= ctx->tokens_end) 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->header = (struct tgsi_header *) ctx->tokens_cur++; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *ctx->header = tgsi_build_header(); 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->tokens_cur >= ctx->tokens_end) 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *(struct tgsi_processor *) ctx->tokens_cur++ = tgsi_build_processor( processor, ctx->header ); 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->processor = processor; 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean parse_label( struct translate_ctx *ctx, uint *val ) 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur = ctx->cur; 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (parse_uint( &cur, val )) { 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur ); 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*cur == ':') { 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur = cur; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_file( const char **pcur, uint *file ) 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i; 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < TGSI_FILE_COUNT; i++) { 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur = *pcur; 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (str_match_nocase_whole( &cur, tgsi_file_names[i] )) { 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pcur = cur; 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *file = i; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_opt_writemask( 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct translate_ctx *ctx, 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint *writemask ) 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur; 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur = ctx->cur; 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur ); 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*cur == '.') { 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *writemask = TGSI_WRITEMASK_NONE; 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur ); 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (uprcase( *cur ) == 'X') { 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *writemask |= TGSI_WRITEMASK_X; 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (uprcase( *cur ) == 'Y') { 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *writemask |= TGSI_WRITEMASK_Y; 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (uprcase( *cur ) == 'Z') { 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *writemask |= TGSI_WRITEMASK_Z; 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (uprcase( *cur ) == 'W') { 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *writemask |= TGSI_WRITEMASK_W; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*writemask == TGSI_WRITEMASK_NONE) { 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Writemask expected" ); 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur = cur; 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *writemask = TGSI_WRITEMASK_XYZW; 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* <register_file_bracket> ::= <file> `[' 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_register_file_bracket( 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct translate_ctx *ctx, 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint *file ) 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_file( &ctx->cur, file )) { 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Unknown register file" ); 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*ctx->cur != '[') { 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected `['" ); 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur++; 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* <register_file_bracket_index> ::= <register_file_bracket> <uint> 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_register_file_bracket_index( 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct translate_ctx *ctx, 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint *file, 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int *index ) 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint uindex; 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_register_file_bracket( ctx, file )) 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_uint( &ctx->cur, &uindex )) { 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected literal unsigned integer" ); 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *index = (int) uindex; 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Parse simple 1d register operand. 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * <register_dst> ::= <register_file_bracket_index> `]' 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_register_1d(struct translate_ctx *ctx, 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint *file, 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int *index ) 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_register_file_bracket_index( ctx, file, index )) 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*ctx->cur != ']') { 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected `]'" ); 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur++; 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct parsed_bracket { 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int index; 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint ind_file; 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ind_index; 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint ind_comp; 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_register_bracket( 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct translate_ctx *ctx, 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct parsed_bracket *brackets) 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur; 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint uindex; 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(brackets, 0, sizeof(struct parsed_bracket)); 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur = ctx->cur; 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (parse_file( &cur, &brackets->ind_file )) { 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_register_1d( ctx, &brackets->ind_file, 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &brackets->ind_index )) 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*ctx->cur == '.') { 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur++; 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white(&ctx->cur); 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (uprcase(*ctx->cur)) { 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 'X': 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brackets->ind_comp = TGSI_SWIZZLE_X; 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 'Y': 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brackets->ind_comp = TGSI_SWIZZLE_Y; 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 'Z': 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brackets->ind_comp = TGSI_SWIZZLE_Z; 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 'W': 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brackets->ind_comp = TGSI_SWIZZLE_W; 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error(ctx, "Expected indirect register swizzle component `x', `y', `z' or `w'"); 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur++; 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white(&ctx->cur); 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*ctx->cur == '+' || *ctx->cur == '-') 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org parse_int( &ctx->cur, &brackets->index ); 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brackets->index = 0; 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_uint( &ctx->cur, &uindex )) { 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected literal unsigned integer" ); 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brackets->index = (int) uindex; 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brackets->ind_file = TGSI_FILE_NULL; 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brackets->ind_index = 0; 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*ctx->cur != ']') { 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected `]'" ); 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur++; 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_opt_register_src_bracket( 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct translate_ctx *ctx, 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct parsed_bracket *brackets, 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int *parsed_brackets) 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur = ctx->cur; 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *parsed_brackets = 0; 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur ); 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cur[0] == '[') { 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++cur; 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur = cur; 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_register_bracket(ctx, brackets)) 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *parsed_brackets = 1; 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Parse source register operand. 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * <register_src> ::= <register_file_bracket_index> `]' | 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * <register_file_bracket> <register_dst> [`.' (`x' | `y' | `z' | `w')] `]' | 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * <register_file_bracket> <register_dst> [`.' (`x' | `y' | `z' | `w')] `+' <uint> `]' | 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * <register_file_bracket> <register_dst> [`.' (`x' | `y' | `z' | `w')] `-' <uint> `]' 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_register_src( 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct translate_ctx *ctx, 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint *file, 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct parsed_bracket *brackets) 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brackets->ind_comp = TGSI_SWIZZLE_X; 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_register_file_bracket( ctx, file )) 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_register_bracket( ctx, brackets )) 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct parsed_dcl_bracket { 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint first; 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint last; 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_register_dcl_bracket( 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct translate_ctx *ctx, 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct parsed_dcl_bracket *bracket) 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint uindex; 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(bracket, 0, sizeof(struct parsed_dcl_bracket)); 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_uint( &ctx->cur, &uindex )) { 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* it can be an empty bracket [] which means its range 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * is from 0 to some implied size */ 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->cur[0] == ']' && ctx->implied_array_size != 0) { 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bracket->first = 0; 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bracket->last = ctx->implied_array_size - 1; 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup; 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected literal unsigned integer" ); 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bracket->first = uindex; 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->cur[0] == '.' && ctx->cur[1] == '.') { 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint uindex; 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur += 2; 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_uint( &ctx->cur, &uindex )) { 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected literal integer" ); 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bracket->last = (int) uindex; 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bracket->last = bracket->first; 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcleanup: 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*ctx->cur != ']') { 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected `]' or `..'" ); 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur++; 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Parse register declaration. 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * <register_dcl> ::= <register_file_bracket_index> `]' | 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * <register_file_bracket_index> `..' <index> `]' 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_register_dcl( 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct translate_ctx *ctx, 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint *file, 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct parsed_dcl_bracket *brackets, 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int *num_brackets) 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur; 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *num_brackets = 0; 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_register_file_bracket( ctx, file )) 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_register_dcl_bracket( ctx, &brackets[0] )) 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *num_brackets = 1; 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur = ctx->cur; 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur ); 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cur[0] == '[') { 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++cur; 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur = cur; 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_register_dcl_bracket( ctx, &brackets[1] )) 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* for geometry shader we don't really care about 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the first brackets it's always the size of the 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * input primitive. so we want to declare just 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the index relevant to the semantics which is in 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the second bracket */ 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->processor == TGSI_PROCESSOR_GEOMETRY && *file == TGSI_FILE_INPUT) { 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brackets[0] = brackets[1]; 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *num_brackets = 1; 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *num_brackets = 2; 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Parse destination register operand.*/ 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_register_dst( 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct translate_ctx *ctx, 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint *file, 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct parsed_bracket *brackets) 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brackets->ind_comp = TGSI_SWIZZLE_X; 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_register_file_bracket( ctx, file )) 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_register_bracket( ctx, brackets )) 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_dst_operand( 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct translate_ctx *ctx, 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_dst_register *dst ) 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint file; 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint writemask; 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur; 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct parsed_bracket bracket[2]; 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int parsed_opt_brackets; 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_register_dst( ctx, &file, &bracket[0] )) 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_opt_register_src_bracket(ctx, &bracket[1], &parsed_opt_brackets)) 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur = ctx->cur; 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur ); 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_opt_writemask( ctx, &writemask )) 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Register.File = file; 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (parsed_opt_brackets) { 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Register.Dimension = 1; 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Dimension.Indirect = 0; 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Dimension.Dimension = 0; 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Dimension.Index = bracket[0].index; 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bracket[0] = bracket[1]; 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Register.Index = bracket[0].index; 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Register.WriteMask = writemask; 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bracket[0].ind_file != TGSI_FILE_NULL) { 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Register.Indirect = 1; 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Indirect.File = bracket[0].ind_file; 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Indirect.Index = bracket[0].ind_index; 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Indirect.SwizzleX = bracket[0].ind_comp; 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Indirect.SwizzleY = bracket[0].ind_comp; 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Indirect.SwizzleZ = bracket[0].ind_comp; 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Indirect.SwizzleW = bracket[0].ind_comp; 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_optional_swizzle( 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct translate_ctx *ctx, 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint swizzle[4], 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean *parsed_swizzle ) 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur = ctx->cur; 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *parsed_swizzle = FALSE; 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur ); 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*cur == '.') { 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i; 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur ); 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (uprcase( *cur ) == 'X') 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle[i] = TGSI_SWIZZLE_X; 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (uprcase( *cur ) == 'Y') 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle[i] = TGSI_SWIZZLE_Y; 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (uprcase( *cur ) == 'Z') 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle[i] = TGSI_SWIZZLE_Z; 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (uprcase( *cur ) == 'W') 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle[i] = TGSI_SWIZZLE_W; 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected register swizzle component `x', `y', `z' or `w'" ); 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *parsed_swizzle = TRUE; 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur = cur; 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_src_operand( 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct translate_ctx *ctx, 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_src_register *src ) 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint file; 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint swizzle[4]; 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean parsed_swizzle; 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct parsed_bracket bracket[2]; 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int parsed_opt_brackets; 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*ctx->cur == '-') { 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur++; 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->Register.Negate = 1; 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*ctx->cur == '|') { 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur++; 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->Register.Absolute = 1; 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_register_src(ctx, &file, &bracket[0])) 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_opt_register_src_bracket(ctx, &bracket[1], &parsed_opt_brackets)) 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->Register.File = file; 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (parsed_opt_brackets) { 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->Register.Dimension = 1; 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->Dimension.Indirect = 0; 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->Dimension.Dimension = 0; 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->Dimension.Index = bracket[0].index; 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bracket[0] = bracket[1]; 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->Register.Index = bracket[0].index; 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bracket[0].ind_file != TGSI_FILE_NULL) { 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->Register.Indirect = 1; 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->Indirect.File = bracket[0].ind_file; 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->Indirect.Index = bracket[0].ind_index; 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->Indirect.SwizzleX = bracket[0].ind_comp; 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->Indirect.SwizzleY = bracket[0].ind_comp; 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->Indirect.SwizzleZ = bracket[0].ind_comp; 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->Indirect.SwizzleW = bracket[0].ind_comp; 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Parse optional swizzle. 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (parse_optional_swizzle( ctx, swizzle, &parsed_swizzle )) { 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (parsed_swizzle) { 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->Register.SwizzleX = swizzle[0]; 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->Register.SwizzleY = swizzle[1]; 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->Register.SwizzleZ = swizzle[2]; 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->Register.SwizzleW = swizzle[3]; 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src->Register.Absolute) { 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*ctx->cur != '|') { 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected `|'" ); 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur++; 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmatch_inst(const char **pcur, 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned *saturate, 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_opcode_info *info) 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur = *pcur; 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple case: the whole string matches the instruction name */ 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (str_match_nocase_whole(&cur, info->mnemonic)) { 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pcur = cur; 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *saturate = TGSI_SAT_NONE; 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (str_match_no_case(&cur, info->mnemonic)) { 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* the instruction has a suffix, figure it out */ 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (str_match_nocase_whole(&cur, "_SAT")) { 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pcur = cur; 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *saturate = TGSI_SAT_ZERO_ONE; 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (str_match_nocase_whole(&cur, "_SATNV")) { 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pcur = cur; 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *saturate = TGSI_SAT_MINUS_PLUS_ONE; 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_instruction( 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct translate_ctx *ctx, 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean has_label ) 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i; 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint saturate = TGSI_SAT_NONE; 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_opcode_info *info; 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction inst; 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur; 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint advance; 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst = tgsi_default_full_instruction(); 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Parse predicate. 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*ctx->cur == '(') { 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint file; 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int index; 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint swizzle[4]; 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean parsed_swizzle; 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst.Instruction.Predicate = 1; 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur++; 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*ctx->cur == '!') { 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur++; 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst.Predicate.Negate = 1; 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_register_1d( ctx, &file, &index )) 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (parse_optional_swizzle( ctx, swizzle, &parsed_swizzle )) { 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (parsed_swizzle) { 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst.Predicate.SwizzleX = swizzle[0]; 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst.Predicate.SwizzleY = swizzle[1]; 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst.Predicate.SwizzleZ = swizzle[2]; 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst.Predicate.SwizzleW = swizzle[3]; 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*ctx->cur != ')') { 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected `)'" ); 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur++; 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Parse instruction name. 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < TGSI_OPCODE_LAST; i++) { 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur = ctx->cur; 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info = tgsi_get_opcode_info( i ); 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (match_inst(&cur, &saturate, info)) { 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->num_dst + info->num_src + info->is_tex == 0) { 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur = cur; 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (*cur == '\0' || eat_white( &cur )) { 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur = cur; 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == TGSI_OPCODE_LAST) { 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (has_label) 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Unknown opcode" ); 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected `DCL', `IMM' or a label" ); 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst.Instruction.Opcode = i; 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst.Instruction.Saturate = saturate; 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst.Instruction.NumDstRegs = info->num_dst; 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst.Instruction.NumSrcRegs = info->num_src; 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Parse instruction operands. 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < info->num_dst + info->num_src + info->is_tex; i++) { 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i > 0) { 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*ctx->cur != ',') { 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected `,'" ); 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur++; 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i < info->num_dst) { 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_dst_operand( ctx, &inst.Dst[i] )) 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (i < info->num_dst + info->num_src) { 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_src_operand( ctx, &inst.Src[i - info->num_dst] )) 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint j; 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < TGSI_TEXTURE_COUNT; j++) { 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (str_match_nocase_whole( &ctx->cur, tgsi_texture_names[j] )) { 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst.Instruction.Texture = 1; 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst.Texture.Texture = j; 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (j == TGSI_TEXTURE_COUNT) { 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected texture target" ); 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur = ctx->cur; 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur ); 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->is_branch && *cur == ':') { 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint target; 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur ); 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_uint( &cur, &target )) { 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected a label" ); 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst.Instruction.Label = 1; 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst.Label.Label = target; 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur = cur; 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org advance = tgsi_build_full_instruction( 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &inst, 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->tokens_cur, 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->header, 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (uint) (ctx->tokens_end - ctx->tokens_cur) ); 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (advance == 0) 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->tokens_cur += advance; 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* parses a 4-touple of the form {x, y, z, w} 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * where x, y, z, w are numbers */ 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean parse_immediate_data(struct translate_ctx *ctx, unsigned type, 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org union tgsi_immediate_data *values) 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ret; 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*ctx->cur != '{') { 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected `{'" ); 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur++; 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i > 0) { 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*ctx->cur != ',') { 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected `,'" ); 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur++; 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (type) { 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_IMM_FLOAT32: 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = parse_float(&ctx->cur, &values[i].Float); 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_IMM_UINT32: 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = parse_uint(&ctx->cur, &values[i].Uint); 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_IMM_INT32: 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = parse_int(&ctx->cur, &values[i].Int); 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = FALSE; 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ret) { 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected immediate constant" ); 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*ctx->cur != '}') { 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected `}'" ); 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur++; 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean parse_declaration( struct translate_ctx *ctx ) 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_declaration decl; 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint file; 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct parsed_dcl_bracket brackets[2]; 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int num_brackets; 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint writemask; 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur, *cur2; 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint advance; 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean is_vs_input; 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean is_imm_array; 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!eat_white( &ctx->cur )) { 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Syntax error" ); 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_register_dcl( ctx, &file, brackets, &num_brackets)) 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_opt_writemask( ctx, &writemask )) 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl = tgsi_default_full_declaration(); 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.Declaration.File = file; 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.Declaration.UsageMask = writemask; 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (num_brackets == 1) { 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.Range.First = brackets[0].first; 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.Range.Last = brackets[0].last; 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.Range.First = brackets[1].first; 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.Range.Last = brackets[1].last; 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.Declaration.Dimension = 1; 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.Dim.Index2D = brackets[0].first; 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org is_vs_input = (file == TGSI_FILE_INPUT && 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->processor == TGSI_PROCESSOR_VERTEX); 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org is_imm_array = (file == TGSI_FILE_IMMEDIATE_ARRAY); 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur = ctx->cur; 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur ); 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*cur == ',' && !is_vs_input) { 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i, j; 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur ); 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (file == TGSI_FILE_RESOURCE) { 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < TGSI_TEXTURE_COUNT; i++) { 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (str_match_nocase_whole(&cur, tgsi_texture_names[i])) { 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.Resource.Resource = i; 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == TGSI_TEXTURE_COUNT) { 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error(ctx, "Expected texture target"); 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur2 = cur; 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white(&cur2); 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (*cur2 == ',') { 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur2++; 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white(&cur2); 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (str_match_nocase_whole(&cur2, "RAW")) { 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.Resource.Raw = 1; 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (str_match_nocase_whole(&cur2, "WR")) { 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.Resource.Writable = 1; 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur = cur2; 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white(&cur2); 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur = cur; 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (file == TGSI_FILE_SAMPLER_VIEW) { 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < TGSI_TEXTURE_COUNT; i++) { 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (str_match_nocase_whole(&cur, tgsi_texture_names[i])) { 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.SamplerView.Resource = i; 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == TGSI_TEXTURE_COUNT) { 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error(ctx, "Expected texture target"); 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur ); 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*cur != ',') { 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected `,'" ); 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++cur; 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur ); 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; ++j) { 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < PIPE_TYPE_COUNT; ++i) { 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (str_match_nocase_whole(&cur, tgsi_type_names[i])) { 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (j) { 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0: 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.SamplerView.ReturnTypeX = i; 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.SamplerView.ReturnTypeY = i; 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.SamplerView.ReturnTypeZ = i; 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.SamplerView.ReturnTypeW = i; 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == PIPE_TYPE_COUNT) { 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (j == 0 || j > 2) { 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error(ctx, "Expected type name"); 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur2 = cur; 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur2 ); 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*cur2 == ',') { 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur2++; 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur2 ); 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur = cur2; 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (j < 4) { 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.SamplerView.ReturnTypeY = 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.SamplerView.ReturnTypeZ = 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.SamplerView.ReturnTypeW = 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.SamplerView.ReturnTypeX; 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur = cur; 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (str_match_nocase_whole(&cur, "LOCAL")) { 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.Declaration.Local = 1; 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur = cur; 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur = ctx->cur; 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur ); 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*cur == ',') { 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur ); 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < TGSI_SEMANTIC_COUNT; i++) { 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (str_match_nocase_whole(&cur, tgsi_semantic_names[i])) { 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint index; 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur2 = cur; 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur2 ); 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*cur2 == '[') { 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur2++; 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur2 ); 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_uint( &cur2, &index )) { 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected literal integer" ); 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur2 ); 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*cur2 != ']') { 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected `]'" ); 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur2++; 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.Semantic.Index = index; 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur = cur2; 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.Declaration.Semantic = 1; 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.Semantic.Name = i; 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur = cur; 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (is_imm_array) { 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org union tgsi_immediate_data *vals_itr; 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* we have our immediate data */ 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*cur != '{') { 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Immediate array without data" ); 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++cur; 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur = cur; 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.ImmediateData.u = 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MALLOC(sizeof(union tgsi_immediate_data) * 4 * 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (decl.Range.Last + 1)); 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vals_itr = decl.ImmediateData.u; 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i <= decl.Range.Last; ++i) { 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_immediate_data(ctx, TGSI_IMM_FLOAT32, vals_itr)) { 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(decl.ImmediateData.u); 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vals_itr += 4; 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*ctx->cur != ',') { 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i != decl.Range.Last) { 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Not enough data in immediate array!" ); 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(decl.ImmediateData.u); 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++ctx->cur; 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*ctx->cur != '}') { 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(decl.ImmediateData.u); 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Immediate array data missing closing '}'" ); 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++ctx->cur; 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur = ctx->cur; 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur ); 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*cur == ',' && !is_vs_input) { 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i; 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur++; 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &cur ); 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < TGSI_INTERPOLATE_COUNT; i++) { 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (str_match_nocase_whole( &cur, tgsi_interpolate_names[i] )) { 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.Declaration.Interpolate = 1; 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl.Interp.Interpolate = i; 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cur = cur; 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == TGSI_INTERPOLATE_COUNT) { 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected semantic or interpolate attribute" ); 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org advance = tgsi_build_full_declaration( 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &decl, 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->tokens_cur, 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->header, 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (uint) (ctx->tokens_end - ctx->tokens_cur) ); 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_imm_array) 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(decl.ImmediateData.u); 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (advance == 0) 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->tokens_cur += advance; 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean parse_immediate( struct translate_ctx *ctx ) 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_immediate imm; 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint advance; 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int type; 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!eat_white( &ctx->cur )) { 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Syntax error" ); 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (type = 0; type < Elements(tgsi_immediate_type_names); ++type) { 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (str_match_nocase_whole(&ctx->cur, tgsi_immediate_type_names[type])) 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (type == Elements(tgsi_immediate_type_names)) { 1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected immediate type" ); 1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org imm = tgsi_default_full_immediate(); 1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org imm.Immediate.NrTokens += 4; 1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org imm.Immediate.DataType = type; 1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org parse_immediate_data(ctx, type, imm.u); 1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org advance = tgsi_build_full_immediate( 1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &imm, 1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->tokens_cur, 1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->header, 1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (uint) (ctx->tokens_end - ctx->tokens_cur) ); 1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (advance == 0) 1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->tokens_cur += advance; 1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_primitive( const char **pcur, uint *primitive ) 1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i; 1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < PIPE_PRIM_MAX; i++) { 1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur = *pcur; 1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (str_match_nocase_whole( &cur, tgsi_primitive_names[i])) { 1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *primitive = i; 1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pcur = cur; 1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_fs_coord_origin( const char **pcur, uint *fs_coord_origin ) 1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i; 1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < Elements(tgsi_fs_coord_origin_names); i++) { 1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur = *pcur; 1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (str_match_nocase_whole( &cur, tgsi_fs_coord_origin_names[i])) { 1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *fs_coord_origin = i; 1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pcur = cur; 1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_fs_coord_pixel_center( const char **pcur, uint *fs_coord_pixel_center ) 1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i; 1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < Elements(tgsi_fs_coord_pixel_center_names); i++) { 1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *cur = *pcur; 1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (str_match_nocase_whole( &cur, tgsi_fs_coord_pixel_center_names[i])) { 1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *fs_coord_pixel_center = i; 1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pcur = cur; 1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean parse_property( struct translate_ctx *ctx ) 1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_property prop; 1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint property_name; 1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint values[8]; 1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint advance; 1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char id[64]; 1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!eat_white( &ctx->cur )) { 1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Syntax error" ); 1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_identifier( &ctx->cur, id )) { 1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Syntax error" ); 1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (property_name = 0; property_name < TGSI_PROPERTY_COUNT; 1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++property_name) { 1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (streq_nocase_uprcase(tgsi_property_names[property_name], id)) { 1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (property_name >= TGSI_PROPERTY_COUNT) { 1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf( "\nError: Unknown property : '%s'", id ); 1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(property_name) { 1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_PROPERTY_GS_INPUT_PRIM: 1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_PROPERTY_GS_OUTPUT_PRIM: 1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_primitive(&ctx->cur, &values[0] )) { 1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Unknown primitive name as property!" ); 1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (property_name == TGSI_PROPERTY_GS_INPUT_PRIM && 1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->processor == TGSI_PROCESSOR_GEOMETRY) { 1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->implied_array_size = u_vertices_per_prim(values[0]); 1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_PROPERTY_FS_COORD_ORIGIN: 1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_fs_coord_origin(&ctx->cur, &values[0] )) { 1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Unknown coord origin as property: must be UPPER_LEFT or LOWER_LEFT!" ); 1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_PROPERTY_FS_COORD_PIXEL_CENTER: 1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_fs_coord_pixel_center(&ctx->cur, &values[0] )) { 1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Unknown coord pixel center as property: must be HALF_INTEGER or INTEGER!" ); 1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS: 1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_uint(&ctx->cur, &values[0] )) { 1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Expected unsigned integer as property!" ); 1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prop = tgsi_default_full_property(); 1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prop.Property.PropertyName = property_name; 1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prop.Property.NrTokens += 1; 1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prop.u[0].Data = values[0]; 1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org advance = tgsi_build_full_property( 1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &prop, 1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->tokens_cur, 1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->header, 1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (uint) (ctx->tokens_end - ctx->tokens_cur) ); 1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (advance == 0) 1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->tokens_cur += advance; 1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean translate( struct translate_ctx *ctx ) 1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eat_opt_white( &ctx->cur ); 1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_header( ctx )) 1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (*ctx->cur != '\0') { 1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint label_val = 0; 1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!eat_white( &ctx->cur )) { 1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org report_error( ctx, "Syntax error" ); 1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*ctx->cur == '\0') 1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (parse_label( ctx, &label_val )) { 1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_instruction( ctx, TRUE )) 1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (str_match_nocase_whole( &ctx->cur, "DCL" )) { 1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_declaration( ctx )) 1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (str_match_nocase_whole( &ctx->cur, "IMM" )) { 1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_immediate( ctx )) 1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (str_match_nocase_whole( &ctx->cur, "PROPERTY" )) { 1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!parse_property( ctx )) 1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (!parse_instruction( ctx, FALSE )) { 1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtgsi_text_translate( 1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *text, 1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_token *tokens, 1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint num_tokens ) 1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct translate_ctx ctx; 1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.text = text; 1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.cur = text; 1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.tokens = tokens; 1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.tokens_cur = tokens; 1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.tokens_end = tokens + num_tokens; 1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!translate( &ctx )) 1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tgsi_sanity_check( tokens ); 1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1557