[Mesa-dev] [PATCH 7/7] tgsi: use separate structure for indirect address
Jose Fonseca
jfonseca at vmware.com
Mon Mar 11 07:52:50 PDT 2013
Christian,
I didn't comment on the previous threads, but the approach mentioned in http://lists.freedesktop.org/archives/mesa-dev/2012-November/030476.html seems sensible to me.
I think after the first round we should have this in a branch to allow drivers to catch up with the interface change. Or is it possible for drivers to opt-in via a cap?
Also, I think that a nice summary of how this is supposed to work in src/gallium/docs is a must.
A few more remarks inline.
----- Original Message -----
> From: Christian König <christian.koenig at amd.com>
>
> To further improve the optimization of source and destination
> indirect addressing we need the ability to store a reference
> to the declaration of the addressed operands.
Just to be perfectly clear, declaration number does not refer to the n-th TEMP declaration, but declaration of TEMP[n], right?
That is, this
DCL TEMP[1][0..70]
DCL TEMP[2][0..7]
MOV OUT[1], TEMP[1][ADDR[0].x]
and this
DCL TEMP[2][0..7]
DCL TEMP[1][0..70]
MOV OUT[1], TEMP[1][ADDR[0].x]
are equivalent, right?
If so, I wonder if there is a name more descriptive than "Declaration" here. Maybe "Range", or "IndexableRange"?
> Since most of the fields in tgsi_src_register doesn't apply for
> an indirect addressing operand replace it with a separate
> tgsi_ind_register structure and so make room for extra information.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> ---
> src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c | 4 +-
> src/gallium/auxiliary/tgsi/tgsi_build.c | 109
> +++++++++++---------
> src/gallium/auxiliary/tgsi/tgsi_dump.c | 28 ++++-
> src/gallium/auxiliary/tgsi/tgsi_exec.c | 8 +-
> src/gallium/auxiliary/tgsi/tgsi_parse.c | 35 +------
> src/gallium/auxiliary/tgsi/tgsi_parse.h | 8 +-
> src/gallium/auxiliary/tgsi/tgsi_text.c | 98 +++++++++---------
> src/gallium/auxiliary/tgsi/tgsi_ureg.c | 38 +++----
> src/gallium/auxiliary/tgsi/tgsi_ureg.h | 7 ++
> src/gallium/auxiliary/tgsi/tgsi_util.c | 18 ++++
> src/gallium/auxiliary/tgsi/tgsi_util.h | 3 +
> src/gallium/drivers/i915/i915_fpc.h | 8 +-
> src/gallium/drivers/nv30/nvfx_vertprog.c | 2 +-
> .../drivers/nv50/codegen/nv50_ir_from_tgsi.cpp | 6 ++
> src/gallium/drivers/r600/r600_llvm.c | 2 +-
> src/gallium/include/pipe/p_shader_tokens.h | 18 ++--
> 16 files changed, 221 insertions(+), 171 deletions(-)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> index 69957fe..f8e011e 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> @@ -517,12 +517,12 @@ emit_mask_scatter(struct lp_build_tgsi_soa_context
> *bld,
> static LLVMValueRef
> get_indirect_index(struct lp_build_tgsi_soa_context *bld,
> unsigned reg_file, unsigned reg_index,
> - const struct tgsi_src_register *indirect_reg)
> + const struct tgsi_ind_register *indirect_reg)
> {
> LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder;
> struct lp_build_context *uint_bld = &bld->bld_base.uint_bld;
> /* always use X component of address register */
> - unsigned swizzle = indirect_reg->SwizzleX;
> + unsigned swizzle = indirect_reg->Swizzle;
> LLVMValueRef base;
> LLVMValueRef rel;
> LLVMValueRef max_index;
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_build.c
> b/src/gallium/auxiliary/tgsi/tgsi_build.c
> index 33cbbd8..e71a6ea 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_build.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_build.c
> @@ -816,6 +816,43 @@ tgsi_build_src_register(
> return src_register;
> }
>
> +static struct tgsi_ind_register
> +tgsi_default_ind_register( void )
> +{
> + struct tgsi_ind_register ind_register;
> +
> + ind_register.File = TGSI_FILE_NULL;
> + ind_register.Swizzle = TGSI_SWIZZLE_X;
> + ind_register.Declaration = 0;
> +
> + return ind_register;
> +}
> +
> +static struct tgsi_ind_register
> +tgsi_build_ind_register(
> + unsigned file,
> + unsigned swizzle,
> + unsigned declaration,
> + int index,
> + struct tgsi_instruction *instruction,
> + struct tgsi_header *header )
> +{
> + struct tgsi_ind_register ind_register;
> +
> + assert( file < TGSI_FILE_COUNT );
> + assert( swizzle <= TGSI_SWIZZLE_W );
> + assert( index >= -0x8000 && index <= 0x7FFF );
> +
> + ind_register.File = file;
> + ind_register.Swizzle = swizzle;
> + ind_register.Index = index;
> + ind_register.Declaration = declaration;
> +
> + instruction_grow( instruction, header );
> +
> + return ind_register;
> +}
> +
> static struct tgsi_dimension
> tgsi_default_dimension( void )
> {
> @@ -835,9 +872,9 @@ tgsi_default_full_src_register( void )
> struct tgsi_full_src_register full_src_register;
>
> full_src_register.Register = tgsi_default_src_register();
> - full_src_register.Indirect = tgsi_default_src_register();
> + full_src_register.Indirect = tgsi_default_ind_register();
> full_src_register.Dimension = tgsi_default_dimension();
> - full_src_register.DimIndirect = tgsi_default_src_register();
> + full_src_register.DimIndirect = tgsi_default_ind_register();
>
> return full_src_register;
> }
> @@ -910,9 +947,9 @@ tgsi_default_full_dst_register( void )
> struct tgsi_full_dst_register full_dst_register;
>
> full_dst_register.Register = tgsi_default_dst_register();
> - full_dst_register.Indirect = tgsi_default_src_register();
> + full_dst_register.Indirect = tgsi_default_ind_register();
> full_dst_register.Dimension = tgsi_default_dimension();
> - full_dst_register.DimIndirect = tgsi_default_src_register();
> + full_dst_register.DimIndirect = tgsi_default_ind_register();
>
> return full_dst_register;
> }
> @@ -1057,24 +1094,18 @@ tgsi_build_full_instruction(
> header );
>
> if( reg->Register.Indirect ) {
> - struct tgsi_src_register *ind;
> + struct tgsi_ind_register *ind;
>
> if( maxsize <= size )
> return 0;
> - ind = (struct tgsi_src_register *) &tokens[size];
> + ind = (struct tgsi_ind_register *) &tokens[size];
> size++;
>
> - *ind = tgsi_build_src_register(
> + *ind = tgsi_build_ind_register(
> reg->Indirect.File,
> - reg->Indirect.SwizzleX,
> - reg->Indirect.SwizzleY,
> - reg->Indirect.SwizzleZ,
> - reg->Indirect.SwizzleW,
> - reg->Indirect.Negate,
> - reg->Indirect.Absolute,
> - reg->Indirect.Indirect,
> - reg->Indirect.Dimension,
> + reg->Indirect.Swizzle,
> reg->Indirect.Index,
> + reg->Indirect.Declaration,
> instruction,
> header );
> }
> @@ -1096,24 +1127,18 @@ tgsi_build_full_instruction(
> header );
>
> if( reg->Dimension.Indirect ) {
> - struct tgsi_src_register *ind;
> + struct tgsi_ind_register *ind;
>
> if( maxsize <= size )
> return 0;
> - ind = (struct tgsi_src_register *) &tokens[size];
> + ind = (struct tgsi_ind_register *) &tokens[size];
> size++;
>
> - *ind = tgsi_build_src_register(
> + *ind = tgsi_build_ind_register(
> reg->DimIndirect.File,
> - reg->DimIndirect.SwizzleX,
> - reg->DimIndirect.SwizzleY,
> - reg->DimIndirect.SwizzleZ,
> - reg->DimIndirect.SwizzleW,
> - reg->DimIndirect.Negate,
> - reg->DimIndirect.Absolute,
> - reg->DimIndirect.Indirect,
> - reg->DimIndirect.Dimension,
> + reg->DimIndirect.Swizzle,
> reg->DimIndirect.Index,
> + reg->DimIndirect.Declaration,
> instruction,
> header );
> }
> @@ -1144,24 +1169,18 @@ tgsi_build_full_instruction(
> header );
>
> if( reg->Register.Indirect ) {
> - struct tgsi_src_register *ind;
> + struct tgsi_ind_register *ind;
>
> if( maxsize <= size )
> return 0;
> - ind = (struct tgsi_src_register *) &tokens[size];
> + ind = (struct tgsi_ind_register *) &tokens[size];
> size++;
>
> - *ind = tgsi_build_src_register(
> + *ind = tgsi_build_ind_register(
> reg->Indirect.File,
> - reg->Indirect.SwizzleX,
> - reg->Indirect.SwizzleY,
> - reg->Indirect.SwizzleZ,
> - reg->Indirect.SwizzleW,
> - reg->Indirect.Negate,
> - reg->Indirect.Absolute,
> - reg->Indirect.Indirect,
> - reg->Indirect.Dimension,
> + reg->Indirect.Swizzle,
> reg->Indirect.Index,
> + reg->Indirect.Declaration,
> instruction,
> header );
> }
> @@ -1183,24 +1202,18 @@ tgsi_build_full_instruction(
> header );
>
> if( reg->Dimension.Indirect ) {
> - struct tgsi_src_register *ind;
> + struct tgsi_ind_register *ind;
>
> if( maxsize <= size )
> return 0;
> - ind = (struct tgsi_src_register *) &tokens[size];
> + ind = (struct tgsi_ind_register *) &tokens[size];
> size++;
>
> - *ind = tgsi_build_src_register(
> + *ind = tgsi_build_ind_register(
> reg->DimIndirect.File,
> - reg->DimIndirect.SwizzleX,
> - reg->DimIndirect.SwizzleY,
> - reg->DimIndirect.SwizzleZ,
> - reg->DimIndirect.SwizzleW,
> - reg->DimIndirect.Negate,
> - reg->DimIndirect.Absolute,
> - reg->DimIndirect.Indirect,
> - reg->DimIndirect.Dimension,
> + reg->DimIndirect.Swizzle,
> reg->DimIndirect.Index,
> + reg->DimIndirect.Declaration,
> instruction,
> header );
> }
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.c
> b/src/gallium/auxiliary/tgsi/tgsi_dump.c
> index 177be0f..466fb13 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_dump.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_dump.c
> @@ -102,12 +102,17 @@ _dump_register_src(
> ENM(src->Register.File, tgsi_file_names);
> if (src->Register.Dimension) {
> if (src->Dimension.Indirect) {
> + if (src->DimIndirect.Declaration) {
> + CHR( '[' );
> + SID( src->DimIndirect.Declaration );
> + CHR( ']' );
> + }
> CHR( '[' );
> ENM( src->DimIndirect.File, tgsi_file_names );
> CHR( '[' );
> SID( src->DimIndirect.Index );
> TXT( "]." );
> - ENM( src->DimIndirect.SwizzleX, tgsi_swizzle_names );
> + ENM( src->DimIndirect.Swizzle, tgsi_swizzle_names );
> if (src->Dimension.Index != 0) {
> if (src->Dimension.Index > 0)
> CHR( '+' );
> @@ -121,12 +126,17 @@ _dump_register_src(
> }
> }
> if (src->Register.Indirect) {
> + if (src->Indirect.Declaration) {
> + CHR( '[' );
> + SID( src->Indirect.Declaration );
> + CHR( ']' );
> + }
> CHR( '[' );
> ENM( src->Indirect.File, tgsi_file_names );
> CHR( '[' );
> SID( src->Indirect.Index );
> TXT( "]." );
> - ENM( src->Indirect.SwizzleX, tgsi_swizzle_names );
> + ENM( src->Indirect.Swizzle, tgsi_swizzle_names );
> if (src->Register.Index != 0) {
> if (src->Register.Index > 0)
> CHR( '+' );
> @@ -149,12 +159,17 @@ _dump_register_dst(
> ENM(dst->Register.File, tgsi_file_names);
> if (dst->Register.Dimension) {
> if (dst->Dimension.Indirect) {
> + if (dst->DimIndirect.Declaration) {
> + CHR( '[' );
> + SID( dst->DimIndirect.Declaration );
> + CHR( ']' );
> + }
> CHR( '[' );
> ENM( dst->DimIndirect.File, tgsi_file_names );
> CHR( '[' );
> SID( dst->DimIndirect.Index );
> TXT( "]." );
> - ENM( dst->DimIndirect.SwizzleX, tgsi_swizzle_names );
> + ENM( dst->DimIndirect.Swizzle, tgsi_swizzle_names );
> if (dst->Dimension.Index != 0) {
> if (dst->Dimension.Index > 0)
> CHR( '+' );
> @@ -168,12 +183,17 @@ _dump_register_dst(
> }
> }
> if (dst->Register.Indirect) {
> + if (dst->Indirect.Declaration) {
> + CHR( '[' );
> + SID( dst->Indirect.Declaration );
> + CHR( ']' );
> + }
> CHR( '[' );
> ENM( dst->Indirect.File, tgsi_file_names );
> CHR( '[' );
> SID( dst->Indirect.Index );
> TXT( "]." );
> - ENM( dst->Indirect.SwizzleX, tgsi_swizzle_names );
> + ENM( dst->Indirect.Swizzle, tgsi_swizzle_names );
> if (dst->Register.Index != 0) {
> if (dst->Register.Index > 0)
> CHR( '+' );
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c
> b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> index 838c4a8..3f5f182 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> @@ -1192,7 +1192,7 @@ fetch_source(const struct tgsi_exec_machine *mach,
> index2.i[2] =
> index2.i[3] = reg->Indirect.Index;
> /* get current value of address register[swizzle] */
> - swizzle = tgsi_util_get_src_register_swizzle( ®->Indirect,
> TGSI_CHAN_X );
> + swizzle = reg->Indirect.Swizzle;
> fetch_src_file_channel(mach,
> chan_index,
> reg->Indirect.File,
> @@ -1252,7 +1252,7 @@ fetch_source(const struct tgsi_exec_machine *mach,
> index2.i[2] =
> index2.i[3] = reg->DimIndirect.Index;
>
> - swizzle = tgsi_util_get_src_register_swizzle( ®->DimIndirect,
> TGSI_CHAN_X );
> + swizzle = reg->DimIndirect.Swizzle;
> fetch_src_file_channel(mach,
> chan_index,
> reg->DimIndirect.File,
> @@ -1356,7 +1356,7 @@ store_dest(struct tgsi_exec_machine *mach,
> index.i[3] = reg->Indirect.Index;
>
> /* get current value of address register[swizzle] */
> - swizzle = tgsi_util_get_src_register_swizzle( ®->Indirect,
> TGSI_CHAN_X );
> + swizzle = reg->Indirect.Swizzle;
>
> /* fetch values from the address/indirection register */
> fetch_src_file_channel(mach,
> @@ -1408,7 +1408,7 @@ store_dest(struct tgsi_exec_machine *mach,
> index2.i[2] =
> index2.i[3] = reg->DimIndirect.Index;
>
> - swizzle = tgsi_util_get_src_register_swizzle( ®->DimIndirect,
> TGSI_CHAN_X );
> + swizzle = reg->DimIndirect.Swizzle;
> fetch_src_file_channel(mach,
> chan_index,
> reg->DimIndirect.File,
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_parse.c
> b/src/gallium/auxiliary/tgsi/tgsi_parse.c
> index 720d68d..4990871 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_parse.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_parse.c
> @@ -196,15 +196,9 @@ tgsi_parse_token(
>
> next_token( ctx, &inst->Dst[i].Register );
>
> - if( inst->Dst[i].Register.Indirect ) {
> + if( inst->Dst[i].Register.Indirect )
> next_token( ctx, &inst->Dst[i].Indirect );
>
> - /*
> - * No support for indirect or multi-dimensional addressing.
> - */
> - assert( !inst->Dst[i].Indirect.Dimension );
> - assert( !inst->Dst[i].Indirect.Indirect );
> - }
> if( inst->Dst[i].Register.Dimension ) {
> next_token( ctx, &inst->Dst[i].Dimension );
>
> @@ -213,15 +207,8 @@ tgsi_parse_token(
> */
> assert( !inst->Dst[i].Dimension.Dimension );
>
> - if( inst->Dst[i].Dimension.Indirect ) {
> + if( inst->Dst[i].Dimension.Indirect )
> next_token( ctx, &inst->Dst[i].DimIndirect );
> -
> - /*
> - * No support for indirect or multi-dimensional addressing.
> - */
> - assert( !inst->Dst[i].Indirect.Indirect );
> - assert( !inst->Dst[i].Indirect.Dimension );
> - }
> }
> }
>
> @@ -231,16 +218,9 @@ tgsi_parse_token(
>
> next_token( ctx, &inst->Src[i].Register );
>
> - if( inst->Src[i].Register.Indirect ) {
> + if( inst->Src[i].Register.Indirect )
> next_token( ctx, &inst->Src[i].Indirect );
>
> - /*
> - * No support for indirect or multi-dimensional addressing.
> - */
> - assert( !inst->Src[i].Indirect.Indirect );
> - assert( !inst->Src[i].Indirect.Dimension );
> - }
> -
> if( inst->Src[i].Register.Dimension ) {
> next_token( ctx, &inst->Src[i].Dimension );
>
> @@ -249,15 +229,8 @@ tgsi_parse_token(
> */
> assert( !inst->Src[i].Dimension.Dimension );
>
> - if( inst->Src[i].Dimension.Indirect ) {
> + if( inst->Src[i].Dimension.Indirect )
> next_token( ctx, &inst->Src[i].DimIndirect );
> -
> - /*
> - * No support for indirect or multi-dimensional addressing.
> - */
> - assert( !inst->Src[i].Indirect.Indirect );
> - assert( !inst->Src[i].Indirect.Dimension );
> - }
> }
> }
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_parse.h
> b/src/gallium/auxiliary/tgsi/tgsi_parse.h
> index 78210ed..31aea1c 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_parse.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_parse.h
> @@ -44,17 +44,17 @@ struct tgsi_full_header
> struct tgsi_full_dst_register
> {
> struct tgsi_dst_register Register;
> - struct tgsi_src_register Indirect;
> + struct tgsi_ind_register Indirect;
> struct tgsi_dimension Dimension;
> - struct tgsi_src_register DimIndirect;
> + struct tgsi_ind_register DimIndirect;
> };
>
> struct tgsi_full_src_register
> {
> struct tgsi_src_register Register;
> - struct tgsi_src_register Indirect;
> + struct tgsi_ind_register Indirect;
> struct tgsi_dimension Dimension;
> - struct tgsi_src_register DimIndirect;
> + struct tgsi_ind_register DimIndirect;
> };
>
> struct tgsi_full_declaration
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_text.c
> b/src/gallium/auxiliary/tgsi/tgsi_text.c
> index 7d580e6..8ff73a5 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_text.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_text.c
> @@ -441,6 +441,7 @@ struct parsed_bracket {
> uint ind_file;
> int ind_index;
> uint ind_comp;
> + uint ind_decl;
> };
>
>
> @@ -449,59 +450,64 @@ parse_register_bracket(
> struct translate_ctx *ctx,
> struct parsed_bracket *brackets)
> {
> - const char *cur;
> uint uindex;
>
> memset(brackets, 0, sizeof(struct parsed_bracket));
>
> eat_opt_white( &ctx->cur );
>
> - cur = ctx->cur;
> - if (parse_file( &cur, &brackets->ind_file )) {
> - if (!parse_register_1d( ctx, &brackets->ind_file,
> - &brackets->ind_index ))
> - return FALSE;
> + if (parse_uint( &ctx->cur, &uindex )) {
> eat_opt_white( &ctx->cur );
> + if (*ctx->cur != ']') {
> + report_error( ctx, "Expected `]'" );
> + return FALSE;
> + }
> + ctx->cur++;
> + if (*ctx->cur != '[') {
> + brackets->index = (int) uindex;
> + brackets->ind_file = TGSI_FILE_NULL;
> + brackets->ind_index = 0;
> + return TRUE;
> + }
> + brackets->ind_decl = uindex;
> + }
> +
> + if (!parse_register_1d( ctx, &brackets->ind_file,
> + &brackets->ind_index ))
> + return FALSE;
>
> - if (*ctx->cur == '.') {
> - ctx->cur++;
> - eat_opt_white(&ctx->cur);
> + eat_opt_white( &ctx->cur );
>
> - switch (uprcase(*ctx->cur)) {
> - case 'X':
> - brackets->ind_comp = TGSI_SWIZZLE_X;
> - break;
> - case 'Y':
> - brackets->ind_comp = TGSI_SWIZZLE_Y;
> - break;
> - case 'Z':
> - brackets->ind_comp = TGSI_SWIZZLE_Z;
> - break;
> - case 'W':
> - brackets->ind_comp = TGSI_SWIZZLE_W;
> - break;
> - default:
> - report_error(ctx, "Expected indirect register swizzle component
> `x', `y', `z' or `w'");
> - return FALSE;
> - }
> - ctx->cur++;
> - eat_opt_white(&ctx->cur);
> - }
> + if (*ctx->cur == '.') {
> + ctx->cur++;
> + eat_opt_white(&ctx->cur);
>
> - if (*ctx->cur == '+' || *ctx->cur == '-')
> - parse_int( &ctx->cur, &brackets->index );
> - else
> - brackets->index = 0;
> - }
> - else {
> - if (!parse_uint( &ctx->cur, &uindex )) {
> - report_error( ctx, "Expected literal unsigned integer" );
> + switch (uprcase(*ctx->cur)) {
> + case 'X':
> + brackets->ind_comp = TGSI_SWIZZLE_X;
> + break;
> + case 'Y':
> + brackets->ind_comp = TGSI_SWIZZLE_Y;
> + break;
> + case 'Z':
> + brackets->ind_comp = TGSI_SWIZZLE_Z;
> + break;
> + case 'W':
> + brackets->ind_comp = TGSI_SWIZZLE_W;
> + break;
> + default:
> + report_error(ctx, "Expected indirect register swizzle component
> `x', `y', `z' or `w'");
> return FALSE;
> }
> - brackets->index = (int) uindex;
> - brackets->ind_file = TGSI_FILE_NULL;
> - brackets->ind_index = 0;
> + ctx->cur++;
> + eat_opt_white(&ctx->cur);
> }
> +
> + if (*ctx->cur == '+' || *ctx->cur == '-')
> + parse_int( &ctx->cur, &brackets->index );
> + else
> + brackets->index = 0;
> +
> eat_opt_white( &ctx->cur );
> if (*ctx->cur != ']') {
> report_error( ctx, "Expected `]'" );
> @@ -711,10 +717,8 @@ parse_dst_operand(
> dst->Register.Indirect = 1;
> dst->Indirect.File = bracket[0].ind_file;
> dst->Indirect.Index = bracket[0].ind_index;
> - dst->Indirect.SwizzleX = bracket[0].ind_comp;
> - dst->Indirect.SwizzleY = bracket[0].ind_comp;
> - dst->Indirect.SwizzleZ = bracket[0].ind_comp;
> - dst->Indirect.SwizzleW = bracket[0].ind_comp;
> + dst->Indirect.Swizzle = bracket[0].ind_comp;
> + dst->Indirect.Declaration = bracket[0].ind_decl;
> }
> return TRUE;
> }
> @@ -797,10 +801,8 @@ parse_src_operand(
> src->Register.Indirect = 1;
> src->Indirect.File = bracket[0].ind_file;
> src->Indirect.Index = bracket[0].ind_index;
> - src->Indirect.SwizzleX = bracket[0].ind_comp;
> - src->Indirect.SwizzleY = bracket[0].ind_comp;
> - src->Indirect.SwizzleZ = bracket[0].ind_comp;
> - src->Indirect.SwizzleW = bracket[0].ind_comp;
> + src->Indirect.Swizzle = bracket[0].ind_comp;
> + src->Indirect.Declaration = bracket[0].ind_decl;
> }
>
> /* Parse optional swizzle.
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> index d5fa084..8f693e0 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> @@ -58,6 +58,7 @@ union tgsi_any_token {
> struct tgsi_instruction_texture insn_texture;
> struct tgsi_texture_offset insn_texture_offset;
> struct tgsi_src_register src;
> + struct tgsi_ind_register ind;
> struct tgsi_dimension dim;
> struct tgsi_dst_register dst;
> unsigned value;
> @@ -155,6 +156,7 @@ struct ureg_program
> struct util_bitmask *local_temps;
> struct util_bitmask *decl_temps;
> unsigned nr_temps;
> + unsigned nr_decls;
>
> struct const_decl const_decls;
> struct const_decl const_decls2D[PIPE_MAX_CONSTANT_BUFFERS];
> @@ -262,6 +264,7 @@ ureg_dst_register( unsigned file,
> dst.PredSwizzleZ = TGSI_SWIZZLE_Z;
> dst.PredSwizzleW = TGSI_SWIZZLE_W;
> dst.Index = index;
> + dst.Declaration = 0;
>
> return dst;
> }
> @@ -557,6 +560,9 @@ static struct ureg_dst alloc_temporary( struct
> ureg_program *ureg,
> /* Start a new declaration when the local flag changes */
> if (!i || util_bitmask_get(ureg->local_temps, i - 1) != local)
> util_bitmask_set(ureg->decl_temps, i);
> +
> + if (util_bitmask_get(ureg->decl_temps, i))
> + ureg->nr_decls++;
> }
>
> util_bitmask_clear(ureg->free_temps, i);
> @@ -584,11 +590,13 @@ struct ureg_dst ureg_DECL_array_temporary( struct
> ureg_program *ureg,
> if (local)
> util_bitmask_set(ureg->local_temps, i);
>
> + ureg->nr_decls++;
> util_bitmask_set(ureg->decl_temps, i);
>
> ureg->nr_temps += size;
> util_bitmask_set(ureg->decl_temps, ureg->nr_temps);
>
> + dst.Declaration = ureg->nr_decls;
> return dst;
> }
>
> @@ -870,12 +878,10 @@ ureg_emit_src( struct ureg_program *ureg,
> if (src.Indirect) {
> out[0].src.Indirect = 1;
> out[n].value = 0;
> - out[n].src.File = src.IndirectFile;
> - out[n].src.SwizzleX = src.IndirectSwizzle;
> - out[n].src.SwizzleY = src.IndirectSwizzle;
> - out[n].src.SwizzleZ = src.IndirectSwizzle;
> - out[n].src.SwizzleW = src.IndirectSwizzle;
> - out[n].src.Index = src.IndirectIndex;
> + out[n].ind.File = src.IndirectFile;
> + out[n].ind.Swizzle = src.IndirectSwizzle;
> + out[n].ind.Index = src.IndirectIndex;
> + out[n].ind.Declaration = src.Declaration;
> n++;
> }
>
> @@ -888,12 +894,10 @@ ureg_emit_src( struct ureg_program *ureg,
> out[n].dim.Index = src.DimensionIndex;
> n++;
> out[n].value = 0;
> - out[n].src.File = src.DimIndFile;
> - out[n].src.SwizzleX = src.DimIndSwizzle;
> - out[n].src.SwizzleY = src.DimIndSwizzle;
> - out[n].src.SwizzleZ = src.DimIndSwizzle;
> - out[n].src.SwizzleW = src.DimIndSwizzle;
> - out[n].src.Index = src.DimIndIndex;
> + out[n].ind.File = src.DimIndFile;
> + out[n].ind.Swizzle = src.DimIndSwizzle;
> + out[n].ind.Index = src.DimIndIndex;
> + out[n].ind.Declaration = src.Declaration;
> } else {
> out[n].dim.Indirect = 0;
> out[n].dim.Index = src.DimensionIndex;
> @@ -932,12 +936,10 @@ ureg_emit_dst( struct ureg_program *ureg,
>
> if (dst.Indirect) {
> out[n].value = 0;
> - out[n].src.File = TGSI_FILE_ADDRESS;
> - out[n].src.SwizzleX = dst.IndirectSwizzle;
> - out[n].src.SwizzleY = dst.IndirectSwizzle;
> - out[n].src.SwizzleZ = dst.IndirectSwizzle;
> - out[n].src.SwizzleW = dst.IndirectSwizzle;
> - out[n].src.Index = dst.IndirectIndex;
> + out[n].ind.File = TGSI_FILE_ADDRESS;
> + out[n].ind.Swizzle = dst.IndirectSwizzle;
> + out[n].ind.Index = dst.IndirectIndex;
> + out[n].ind.Declaration = dst.Declaration;
> n++;
> }
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> index cd140de..6bb1f7f 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> @@ -62,6 +62,7 @@ struct ureg_src
> int IndirectIndex : 16; /* SINT */
> int DimensionIndex : 16; /* SINT */
> int DimIndIndex : 16; /* SINT */
> + unsigned Declaration : 10; /* UINT */
> };
>
> /* Very similar to a tgsi_dst_register, removing unsupported fields
> @@ -84,6 +85,7 @@ struct ureg_dst
> int Index : 16; /* SINT */
> int IndirectIndex : 16; /* SINT */
> int IndirectSwizzle : 2; /* TGSI_SWIZZLE_ */
> + unsigned Declaration : 10; /* UINT */
> };
>
> struct pipe_context;
> @@ -1129,6 +1131,7 @@ ureg_dst( struct ureg_src src )
> dst.PredSwizzleZ = TGSI_SWIZZLE_Z;
> dst.PredSwizzleW = TGSI_SWIZZLE_W;
> dst.Index = src.Index;
> + dst.Declaration = src.Declaration;
>
> return dst;
> }
> @@ -1157,6 +1160,7 @@ ureg_src_register(unsigned file,
> src.DimIndFile = TGSI_FILE_NULL;
> src.DimIndIndex = 0;
> src.DimIndSwizzle = 0;
> + src.Declaration = 0;
>
> return src;
> }
> @@ -1184,6 +1188,7 @@ ureg_src( struct ureg_dst dst )
> src.DimIndFile = TGSI_FILE_NULL;
> src.DimIndIndex = 0;
> src.DimIndSwizzle = 0;
> + src.Declaration = dst.Declaration;
>
> return src;
> }
> @@ -1208,6 +1213,7 @@ ureg_dst_undef( void )
> dst.PredSwizzleZ = TGSI_SWIZZLE_Z;
> dst.PredSwizzleW = TGSI_SWIZZLE_W;
> dst.Index = 0;
> + dst.Declaration = 0;
>
> return dst;
> }
> @@ -1235,6 +1241,7 @@ ureg_src_undef( void )
> src.DimIndFile = TGSI_FILE_NULL;
> src.DimIndIndex = 0;
> src.DimIndSwizzle = 0;
> + src.Declaration = 0;
>
> return src;
> }
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_util.c
> b/src/gallium/auxiliary/tgsi/tgsi_util.c
> index 8a5a8ea..dfd32d7 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_util.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_util.c
> @@ -320,3 +320,21 @@ tgsi_util_get_inst_usage_mask(const struct
> tgsi_full_instruction *inst,
>
> return usage_mask;
> }
> +
> +/**
> + * Convert a tgsi_ind_register into a tgsi_src_register
> + */
> +struct tgsi_src_register
> +tgsi_util_get_src_from_ind(const struct tgsi_ind_register *reg)
> +{
> + struct tgsi_src_register src = {};
> +
> + src.File = reg->File;
> + src.Index = reg->Index;
> + src.SwizzleX = reg->Swizzle;
> + src.SwizzleY = reg->Swizzle;
> + src.SwizzleZ = reg->Swizzle;
> + src.SwizzleW = reg->Swizzle;
> +
> + return src;
> +}
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_util.h
> b/src/gallium/auxiliary/tgsi/tgsi_util.h
> index 04702ba..d9f8859 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_util.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_util.h
> @@ -76,6 +76,9 @@ unsigned
> tgsi_util_get_inst_usage_mask(const struct tgsi_full_instruction *inst,
> unsigned src_idx);
>
> +struct tgsi_src_register
> +tgsi_util_get_src_from_ind(const struct tgsi_ind_register *reg);
> +
> #if defined __cplusplus
> }
> #endif
> diff --git a/src/gallium/drivers/i915/i915_fpc.h
> b/src/gallium/drivers/i915/i915_fpc.h
> index 9e4a7ea..e915822 100644
> --- a/src/gallium/drivers/i915/i915_fpc.h
> +++ b/src/gallium/drivers/i915/i915_fpc.h
> @@ -276,9 +276,9 @@ struct i915_full_dst_register
> {
> struct i915_dst_register Register;
> /*
> - struct tgsi_src_register Indirect;
> + struct tgsi_ind_register Indirect;
> struct tgsi_dimension Dimension;
> - struct tgsi_src_register DimIndirect;
> + struct tgsi_ind_register DimIndirect;
> */
> };
>
> @@ -286,9 +286,9 @@ struct i915_full_src_register
> {
> struct i915_src_register Register;
> /*
> - struct tgsi_src_register Indirect;
> + struct tgsi_ind_register Indirect;
> struct tgsi_dimension Dimension;
> - struct tgsi_src_register DimIndirect;
> + struct tgsi_ind_register DimIndirect;
> */
> };
>
> diff --git a/src/gallium/drivers/nv30/nvfx_vertprog.c
> b/src/gallium/drivers/nv30/nvfx_vertprog.c
> index 827d518..74dba38 100644
> --- a/src/gallium/drivers/nv30/nvfx_vertprog.c
> +++ b/src/gallium/drivers/nv30/nvfx_vertprog.c
> @@ -405,7 +405,7 @@ tgsi_src(struct nvfx_vpc *vpc, const struct
> tgsi_full_src_register *fsrc) {
> fsrc->Register.File == TGSI_FILE_INPUT)) {
> src.indirect = 1;
> src.indirect_reg = fsrc->Indirect.Index;
> - src.indirect_swz = fsrc->Indirect.SwizzleX;
> + src.indirect_swz = fsrc->Indirect.Swizzle;
> } else {
> src.reg.index = 0;
> src.reg.type = -1;
> diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir_from_tgsi.cpp
> b/src/gallium/drivers/nv50/codegen/nv50_ir_from_tgsi.cpp
> index f5525b2..7e7b688 100644
> --- a/src/gallium/drivers/nv50/codegen/nv50_ir_from_tgsi.cpp
> +++ b/src/gallium/drivers/nv50/codegen/nv50_ir_from_tgsi.cpp
> @@ -23,6 +23,7 @@
> extern "C" {
> #include "tgsi/tgsi_dump.h"
> #include "tgsi/tgsi_scan.h"
> +#include "tgsi/tgsi_util.h"
> }
>
> #include "nv50_ir.h"
> @@ -53,6 +54,11 @@ public:
>
> SrcRegister(const struct tgsi_src_register& src) : reg(src), fsr(NULL)
> { }
>
> + SrcRegister(const struct tgsi_ind_register& ind)
> + : reg(tgsi_util_get_src_from_ind(&ind)),
> + fsr(NULL)
> + { }
> +
> struct tgsi_src_register offsetToSrc(struct tgsi_texture_offset off)
> {
> struct tgsi_src_register reg;
> diff --git a/src/gallium/drivers/r600/r600_llvm.c
> b/src/gallium/drivers/r600/r600_llvm.c
> index c7aa45f..d256f22 100644
> --- a/src/gallium/drivers/r600/r600_llvm.c
> +++ b/src/gallium/drivers/r600/r600_llvm.c
> @@ -35,7 +35,7 @@ static LLVMValueRef llvm_fetch_const(
> };
> if (reg->Register.Indirect) {
> struct lp_build_tgsi_soa_context *bld = lp_soa_context(bld_base);
> - LLVMValueRef index = LLVMBuildLoad(bld_base->base.gallivm->builder,
> bld->addr[reg->Indirect.Index][reg->Indirect.SwizzleX], "");
> + LLVMValueRef index = LLVMBuildLoad(bld_base->base.gallivm->builder,
> bld->addr[reg->Indirect.Index][reg->Indirect.Swizzle], "");
> offset[1] = LLVMBuildAdd(bld_base->base.gallivm->builder, offset[1],
> index, "");
> }
> unsigned ConstantAddressSpace = CONSTANT_BUFFER_0_ADDR_SPACE ;
> diff --git a/src/gallium/include/pipe/p_shader_tokens.h
> b/src/gallium/include/pipe/p_shader_tokens.h
> index 81e4a6b..6aa9ba5 100644
> --- a/src/gallium/include/pipe/p_shader_tokens.h
> +++ b/src/gallium/include/pipe/p_shader_tokens.h
> @@ -583,14 +583,20 @@ struct tgsi_src_register
> };
>
> /**
> - * If tgsi_src_register::Modifier is TRUE, tgsi_src_register_modifier
> follows.
> - *
> - * Then, if tgsi_src_register::Indirect is TRUE, another tgsi_src_register
> - * follows.
> - *
> - * Then, if tgsi_src_register::Dimension is TRUE, tgsi_dimension follows.
> + * If tgsi_src_register::Indirect is TRUE, tgsi_ind_register follows.
> */
>
> +struct tgsi_ind_register
> +{
> + unsigned File : 4; /* TGSI_FILE_ */
> + int Index : 16; /* SINT */
> + unsigned Swizzle : 2; /* TGSI_SWIZZLE_ */
> + unsigned Declaration : 10; /* INT */
I think you mean /* UINT */
> +};
> +
> +/**
> + * If tgsi_src_register::Dimension is TRUE, tgsi_dimension follows.
> + */
>
> struct tgsi_dimension
> {
> --
> 1.7.9.5
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
More information about the mesa-dev
mailing list