Re: [Mesa-dev] [PATCH 16/16] freedreno/ir3: convert to deref instructions

2018-04-07 Thread Rob Clark
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

2018-04-07 Thread Jason Ekstrand

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