X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fauxiliary%2Ftgsi%2Ftgsi_text.c;h=f965b0130e0533f27fb346a5f932040d454098ad;hb=259ec77db9027ddc33b290010167c712c925a82d;hp=2b2e7d58f4ff21e9308d01003b04ffb6e5d91516;hpb=877128505431adaf817dc8069172ebe4a1cdf5d8;p=mesa.git diff --git a/src/gallium/auxiliary/tgsi/tgsi_text.c b/src/gallium/auxiliary/tgsi/tgsi_text.c index 2b2e7d58f4f..f965b0130e0 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_text.c +++ b/src/gallium/auxiliary/tgsi/tgsi_text.c @@ -735,8 +735,9 @@ parse_dst_operand( static boolean parse_optional_swizzle( struct translate_ctx *ctx, - uint swizzle[4], - boolean *parsed_swizzle ) + uint *swizzle, + boolean *parsed_swizzle, + int components) { const char *cur = ctx->cur; @@ -748,7 +749,7 @@ parse_optional_swizzle( cur++; eat_opt_white( &cur ); - for (i = 0; i < 4; i++) { + for (i = 0; i < components; i++) { if (uprcase( *cur ) == 'X') swizzle[i] = TGSI_SWIZZLE_X; else if (uprcase( *cur ) == 'Y') @@ -803,6 +804,13 @@ parse_src_operand( src->Dimension.Indirect = 0; src->Dimension.Dimension = 0; src->Dimension.Index = bracket[0].index; + if (bracket[0].ind_file != TGSI_FILE_NULL) { + src->Dimension.Indirect = 1; + src->DimIndirect.File = bracket[0].ind_file; + src->DimIndirect.Index = bracket[0].ind_index; + src->DimIndirect.Swizzle = bracket[0].ind_comp; + src->DimIndirect.ArrayID = bracket[0].ind_array; + } bracket[0] = bracket[1]; } src->Register.Index = bracket[0].index; @@ -816,7 +824,7 @@ parse_src_operand( /* Parse optional swizzle. */ - if (parse_optional_swizzle( ctx, swizzle, &parsed_swizzle )) { + if (parse_optional_swizzle( ctx, swizzle, &parsed_swizzle, 4 )) { if (parsed_swizzle) { src->Register.SwizzleX = swizzle[0]; src->Register.SwizzleY = swizzle[1]; @@ -838,6 +846,35 @@ parse_src_operand( return TRUE; } +static boolean +parse_texoffset_operand( + struct translate_ctx *ctx, + struct tgsi_texture_offset *src ) +{ + uint file; + uint swizzle[3]; + boolean parsed_swizzle; + struct parsed_bracket bracket; + + if (!parse_register_src(ctx, &file, &bracket)) + return FALSE; + + src->File = file; + src->Index = bracket.index; + + /* Parse optional swizzle. + */ + if (parse_optional_swizzle( ctx, swizzle, &parsed_swizzle, 3 )) { + if (parsed_swizzle) { + src->SwizzleX = swizzle[0]; + src->SwizzleY = swizzle[1]; + src->SwizzleZ = swizzle[2]; + } + } + + return TRUE; +} + static boolean match_inst(const char **pcur, unsigned *saturate, @@ -904,7 +941,7 @@ parse_instruction( if (!parse_register_1d( ctx, &file, &index )) return FALSE; - if (parse_optional_swizzle( ctx, swizzle, &parsed_swizzle )) { + if (parse_optional_swizzle( ctx, swizzle, &parsed_swizzle, 4 )) { if (parsed_swizzle) { inst.Predicate.SwizzleX = swizzle[0]; inst.Predicate.SwizzleY = swizzle[1]; @@ -956,8 +993,7 @@ parse_instruction( /* * These are not considered tex opcodes here (no additional * target argument) however we're required to set the Texture - * bit so we can set the number of tex offsets (offsets aren't - * actually handled here yet in any case). + * bit so we can set the number of tex offsets. */ inst.Instruction.Texture = 1; inst.Texture.Texture = TGSI_TEXTURE_UNKNOWN; @@ -1001,6 +1037,19 @@ parse_instruction( } } + cur = ctx->cur; + eat_opt_white( &cur ); + for (i = 0; inst.Instruction.Texture && *cur == ','; i++) { + cur++; + eat_opt_white( &cur ); + ctx->cur = cur; + if (!parse_texoffset_operand( ctx, &inst.TexOffsets[i] )) + return FALSE; + cur = ctx->cur; + eat_opt_white( &cur ); + } + inst.Texture.NumOffsets = i; + cur = ctx->cur; eat_opt_white( &cur ); if (info->is_branch && *cur == ':') { @@ -1209,8 +1258,8 @@ static boolean parse_declaration( struct translate_ctx *ctx ) ++cur; eat_opt_white( &cur ); for (j = 0; j < 4; ++j) { - for (i = 0; i < PIPE_TYPE_COUNT; ++i) { - if (str_match_nocase_whole(&cur, tgsi_type_names[i])) { + for (i = 0; i < TGSI_RETURN_TYPE_COUNT; ++i) { + if (str_match_nocase_whole(&cur, tgsi_return_type_names[i])) { switch (j) { case 0: decl.SamplerView.ReturnTypeX = i; @@ -1230,7 +1279,7 @@ static boolean parse_declaration( struct translate_ctx *ctx ) break; } } - if (i == PIPE_TYPE_COUNT) { + if (i == TGSI_RETURN_TYPE_COUNT) { if (j == 0 || j > 2) { report_error(ctx, "Expected type name"); return FALSE; @@ -1325,6 +1374,23 @@ static boolean parse_declaration( struct translate_ctx *ctx ) } } + cur = ctx->cur; + eat_opt_white( &cur ); + if (*cur == ',' && !is_vs_input) { + uint i; + + cur++; + eat_opt_white( &cur ); + for (i = 0; i < TGSI_INTERPOLATE_LOC_COUNT; i++) { + if (str_match_nocase_whole( &cur, tgsi_interpolate_locations[i] )) { + decl.Interp.Location = i; + + ctx->cur = cur; + break; + } + } + } + advance = tgsi_build_full_declaration( &decl, ctx->tokens_cur,