Re: [Mesa-dev] [PATCH 16/16] freedreno/ir3: convert to deref instructions
On Sat, Apr 7, 2018 at 12:42 PM, Jason Ekstrand wrote: > On April 7, 2018 09:14:20 Rob Clark wrote: > > Signed-off-by: Rob Clark > --- > .../drivers/freedreno/ir3/ir3_compiler_nir.c | 46 > +++--- > src/gallium/drivers/freedreno/ir3/ir3_nir.c| 4 +- > .../freedreno/ir3/ir3_nir_lower_tg4_to_tex.c | 4 +- > 3 files changed, 26 insertions(+), 28 deletions(-) > > diff --git a/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c > b/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c > index 174141b7fec..c99683368e2 100644 > --- a/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c > +++ b/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c > @@ -1785,7 +1785,7 @@ emit_intrinsic_load_image(struct ir3_context *ctx, > nir_intrinsic_instr *intr, > struct ir3_instruction **dst) > { > struct ir3_block *b = ctx->block; > - const nir_variable *var = intr->variables[0]->var; > + const nir_variable *var = nir_intrinsic_get_var(intr, 0); > > Do you not support arrays if images yet? > no.. if hw supports it, it would take some more instruction encoding r/e to figure out how to do that. I *guess* it doesn't matter, get_image_coords()/get_image_type()/etc would just have to handle getting passed an array var, and look at the array component type?? (Well, they already do glsl_without_array() so maybe that is enough?) BR, -R > > > struct ir3_instruction *sam; > struct ir3_instruction * const *coords = get_src(ctx, &intr->src[0]); > unsigned ncoords = get_image_coords(var); > @@ -1810,7 +1810,7 @@ static void > emit_intrinsic_store_image(struct ir3_context *ctx, nir_intrinsic_instr > *intr) > { > struct ir3_block *b = ctx->block; > - const nir_variable *var = intr->variables[0]->var; > + const nir_variable *var = nir_intrinsic_get_var(intr, 0); > struct ir3_instruction *stib, *offset; > struct ir3_instruction * const *value = get_src(ctx, &intr->src[2]); > struct ir3_instruction * const *coords = get_src(ctx, &intr->src[0]); > @@ -1848,7 +1848,7 @@ emit_intrinsic_image_size(struct ir3_context *ctx, > nir_intrinsic_instr *intr, > struct ir3_instruction **dst) > { > struct ir3_block *b = ctx->block; > - const nir_variable *var = intr->variables[0]->var; > + const nir_variable *var = nir_intrinsic_get_var(intr, 0); > unsigned ncoords = get_image_coords(var); > unsigned tex_idx = get_image_slot(ctx, var); > struct ir3_instruction *sam, *lod; > @@ -1869,7 +1869,7 @@ static struct ir3_instruction * > emit_intrinsic_atomic_image(struct ir3_context *ctx, nir_intrinsic_instr > *intr) > { > struct ir3_block *b = ctx->block; > - const nir_variable *var = intr->variables[0]->var; > + const nir_variable *var = nir_intrinsic_get_var(intr, 0); > struct ir3_instruction *atomic, *image, *src0, *src1, *src2; > struct ir3_instruction * const *coords = get_src(ctx, &intr->src[0]); > unsigned ncoords = get_image_coords(var); > @@ -1885,28 +1885,28 @@ emit_intrinsic_atomic_image(struct ir3_context *ctx, > nir_intrinsic_instr *intr) > src2 = get_image_offset(ctx, var, coords, false); > > switch (intr->intrinsic) { > - case nir_intrinsic_image_var_atomic_add: > + case nir_intrinsic_image_deref_atomic_add: > atomic = ir3_ATOMIC_ADD_G(b, image, 0, src0, 0, src1, 0, src2, 0); > break; > - case nir_intrinsic_image_var_atomic_min: > + case nir_intrinsic_image_deref_atomic_min: > atomic = ir3_ATOMIC_MIN_G(b, image, 0, src0, 0, src1, 0, src2, 0); > break; > - case nir_intrinsic_image_var_atomic_max: > + case nir_intrinsic_image_deref_atomic_max: > atomic = ir3_ATOMIC_MAX_G(b, image, 0, src0, 0, src1, 0, src2, 0); > break; > - case nir_intrinsic_image_var_atomic_and: > + case nir_intrinsic_image_deref_atomic_and: > atomic = ir3_ATOMIC_AND_G(b, image, 0, src0, 0, src1, 0, src2, 0); > break; > - case nir_intrinsic_image_var_atomic_or: > + case nir_intrinsic_image_deref_atomic_or: > atomic = ir3_ATOMIC_OR_G(b, image, 0, src0, 0, src1, 0, src2, 0); > break; > - case nir_intrinsic_image_var_atomic_xor: > + case nir_intrinsic_image_deref_atomic_xor: > atomic = ir3_ATOMIC_XOR_G(b, image, 0, src0, 0, src1, 0, src2, 0); > break; > - case nir_intrinsic_image_var_atomic_exchange: > + case nir_intrinsic_image_deref_atomic_exchange: > atomic = ir3_ATOMIC_XCHG_G(b, image, 0, src0, 0, src1, 0, src2, 0); > break; > - case nir_intrinsic_image_var_atomic_comp_swap: > + case nir_intrinsic_image_deref_atomic_comp_swap: > /* for cmpxchg, src0 is [ui]vec2(data, compare): */ > src0 = create_collect(ctx, (struct ir3_instruction*[]){ > src0, > @@ -2139,23 +2139,23 @@ emit_intrinsic(struct ir3_context *ctx, > nir_intrinsic_instr *intr) > case nir_intrinsic_shared_atomic_comp_swap: > dst[0] = emit_intrinsic_atomic_shared(ctx, intr); > break; > - case nir_intrinsic_image_var_load: > + case nir_intrinsic_image_deref_load: > emit_intrinsic_load_image(ctx, intr, dst); > break; > - cas
Re: [Mesa-dev] [PATCH 16/16] freedreno/ir3: convert to deref instructions
On April 7, 2018 09:14:20 Rob Clark wrote: Signed-off-by: Rob Clark --- .../drivers/freedreno/ir3/ir3_compiler_nir.c | 46 +++--- src/gallium/drivers/freedreno/ir3/ir3_nir.c| 4 +- .../freedreno/ir3/ir3_nir_lower_tg4_to_tex.c | 4 +- 3 files changed, 26 insertions(+), 28 deletions(-) diff --git a/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c b/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c index 174141b7fec..c99683368e2 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c +++ b/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c @@ -1785,7 +1785,7 @@ emit_intrinsic_load_image(struct ir3_context *ctx, nir_intrinsic_instr *intr, struct ir3_instruction **dst) { struct ir3_block *b = ctx->block; - const nir_variable *var = intr->variables[0]->var; + const nir_variable *var = nir_intrinsic_get_var(intr, 0); Do you not support arrays if images yet? struct ir3_instruction *sam; struct ir3_instruction * const *coords = get_src(ctx, &intr->src[0]); unsigned ncoords = get_image_coords(var); @@ -1810,7 +1810,7 @@ static void emit_intrinsic_store_image(struct ir3_context *ctx, nir_intrinsic_instr *intr) { struct ir3_block *b = ctx->block; - const nir_variable *var = intr->variables[0]->var; + const nir_variable *var = nir_intrinsic_get_var(intr, 0); struct ir3_instruction *stib, *offset; struct ir3_instruction * const *value = get_src(ctx, &intr->src[2]); struct ir3_instruction * const *coords = get_src(ctx, &intr->src[0]); @@ -1848,7 +1848,7 @@ emit_intrinsic_image_size(struct ir3_context *ctx, nir_intrinsic_instr *intr, struct ir3_instruction **dst) { struct ir3_block *b = ctx->block; - const nir_variable *var = intr->variables[0]->var; + const nir_variable *var = nir_intrinsic_get_var(intr, 0); unsigned ncoords = get_image_coords(var); unsigned tex_idx = get_image_slot(ctx, var); struct ir3_instruction *sam, *lod; @@ -1869,7 +1869,7 @@ static struct ir3_instruction * emit_intrinsic_atomic_image(struct ir3_context *ctx, nir_intrinsic_instr *intr) { struct ir3_block *b = ctx->block; - const nir_variable *var = intr->variables[0]->var; + const nir_variable *var = nir_intrinsic_get_var(intr, 0); struct ir3_instruction *atomic, *image, *src0, *src1, *src2; struct ir3_instruction * const *coords = get_src(ctx, &intr->src[0]); unsigned ncoords = get_image_coords(var); @@ -1885,28 +1885,28 @@ emit_intrinsic_atomic_image(struct ir3_context *ctx, nir_intrinsic_instr *intr) src2 = get_image_offset(ctx, var, coords, false); switch (intr->intrinsic) { - case nir_intrinsic_image_var_atomic_add: + case nir_intrinsic_image_deref_atomic_add: atomic = ir3_ATOMIC_ADD_G(b, image, 0, src0, 0, src1, 0, src2, 0); break; - case nir_intrinsic_image_var_atomic_min: + case nir_intrinsic_image_deref_atomic_min: atomic = ir3_ATOMIC_MIN_G(b, image, 0, src0, 0, src1, 0, src2, 0); break; - case nir_intrinsic_image_var_atomic_max: + case nir_intrinsic_image_deref_atomic_max: atomic = ir3_ATOMIC_MAX_G(b, image, 0, src0, 0, src1, 0, src2, 0); break; - case nir_intrinsic_image_var_atomic_and: + case nir_intrinsic_image_deref_atomic_and: atomic = ir3_ATOMIC_AND_G(b, image, 0, src0, 0, src1, 0, src2, 0); break; - case nir_intrinsic_image_var_atomic_or: + case nir_intrinsic_image_deref_atomic_or: atomic = ir3_ATOMIC_OR_G(b, image, 0, src0, 0, src1, 0, src2, 0); break; - case nir_intrinsic_image_var_atomic_xor: + case nir_intrinsic_image_deref_atomic_xor: atomic = ir3_ATOMIC_XOR_G(b, image, 0, src0, 0, src1, 0, src2, 0); break; - case nir_intrinsic_image_var_atomic_exchange: + case nir_intrinsic_image_deref_atomic_exchange: atomic = ir3_ATOMIC_XCHG_G(b, image, 0, src0, 0, src1, 0, src2, 0); break; - case nir_intrinsic_image_var_atomic_comp_swap: + case nir_intrinsic_image_deref_atomic_comp_swap: /* for cmpxchg, src0 is [ui]vec2(data, compare): */ src0 = create_collect(ctx, (struct ir3_instruction*[]){ src0, @@ -2139,23 +2139,23 @@ emit_intrinsic(struct ir3_context *ctx, nir_intrinsic_instr *intr) case nir_intrinsic_shared_atomic_comp_swap: dst[0] = emit_intrinsic_atomic_shared(ctx, intr); break; - case nir_intrinsic_image_var_load: + case nir_intrinsic_image_deref_load: emit_intrinsic_load_image(ctx, intr, dst); break; - case nir_intrinsic_image_var_store: + case nir_intrinsic_image_deref_store: emit_intrinsic_store_image(ctx, intr); break; - case nir_intrinsic_image_var_size: + case nir_intrinsic_image_deref_size: emit_intrinsic_image_size(ctx, intr, dst); break; - case nir_intrinsic_image_var_atomic_add: - case nir_intrinsic_image_var_atomic_min: - case nir_intrinsic_image_var_atomic_max: - case nir_intrinsic_image_var_atomic_and: - case nir_intrinsic_image_var_atomic_or: - case nir_intrinsic_image_var_atomic_xor: - case nir_intrinsic_image_var_atomic_exc