[Mesa-dev] [PATCH] tgsi: support parsing texture offsets from text tgsi shaders

Ilia Mirkin imirkin at alum.mit.edu
Tue May 13 10:12:24 PDT 2014


ping? ran into this when trying to feed text shaders into
nouveau_compiler that had texture offsets...

On Wed, May 7, 2014 at 9:25 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
>  src/gallium/auxiliary/tgsi/tgsi_text.c | 53 ++++++++++++++++++++++++++++++----
>  1 file changed, 48 insertions(+), 5 deletions(-)
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_text.c b/src/gallium/auxiliary/tgsi/tgsi_text.c
> index 2b2e7d5..7e50d8d 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')
> @@ -816,7 +817,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];
> @@ -839,6 +840,35 @@ parse_src_operand(
>  }
>
>  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,
>             const struct tgsi_opcode_info *info)
> @@ -904,7 +934,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];
> @@ -1003,6 +1033,19 @@ parse_instruction(
>
>     cur = ctx->cur;
>     eat_opt_white( &cur );
> +   for (i = 0; info->is_tex && *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 == ':') {
>        uint target;
>
> --
> 1.8.3.2
>


More information about the mesa-dev mailing list