[Mesa-dev] [PATCH 2/3] i965/vec4/nir: remove emit_untyped_surface_read and emit_untyped_atomic at brw_vec4_visitor

Francisco Jerez currojerez at riseup.net
Sat Mar 5 02:43:56 UTC 2016


Alejandro PiƱeiro <apinheiro at igalia.com> writes:

> surface_access emit_untyped_read and emit_untyped_atomic provides the same
> functionality.
> ---
>
> This patch also fixes the indentation at switch (instr->intrinsic).
>
>  src/mesa/drivers/dri/i965/brw_vec4.h           |  7 ----
>  src/mesa/drivers/dri/i965/brw_vec4_nir.cpp     | 39 ++++++++++++------
>  src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 55 --------------------------
>  3 files changed, 26 insertions(+), 75 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h
> index 633f13c..1e9f1e2 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4.h
> +++ b/src/mesa/drivers/dri/i965/brw_vec4.h
> @@ -276,13 +276,6 @@ public:
>     void emit_shader_time_end();
>     void emit_shader_time_write(int shader_time_subindex, src_reg value);
>  
> -   void emit_untyped_atomic(unsigned atomic_op, unsigned surf_index,
> -                            dst_reg dst, src_reg offset, src_reg src0,
> -                            src_reg src1);
> -
> -   void emit_untyped_surface_read(unsigned surf_index, dst_reg dst,
> -                                  src_reg offset);
> -
>     src_reg get_scratch_offset(bblock_t *block, vec4_instruction *inst,
>  			      src_reg *reladdr, int reg_offset);
>     src_reg get_pull_constant_offset(bblock_t *block, vec4_instruction *inst,
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
> index 9b721e5..8ae8d9e 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
> @@ -724,24 +724,37 @@ vec4_visitor::nir_emit_intrinsic(nir_intrinsic_instr *instr)
>           (unsigned) instr->const_index[0];
>        src_reg offset = get_nir_src(instr->src[0], nir_type_int,
>                                     instr->num_components);
> +      src_reg surface = brw_imm_ud(surf_index);

const.

> +      const vec4_builder bld =
> +         vec4_builder(this).at_end().annotate(current_annotation, base_ir);
> +      src_reg tmp;
> +
>        dest = get_nir_dest(instr->dest);
>  
>        switch (instr->intrinsic) {
> -         case nir_intrinsic_atomic_counter_inc:
> -            emit_untyped_atomic(BRW_AOP_INC, surf_index, dest, offset,
> -                                src_reg(), src_reg());
> -            break;
> -         case nir_intrinsic_atomic_counter_dec:
> -            emit_untyped_atomic(BRW_AOP_PREDEC, surf_index, dest, offset,
> -                                src_reg(), src_reg());
> -            break;
> -         case nir_intrinsic_atomic_counter_read:
> -            emit_untyped_surface_read(surf_index, dest, offset);
> -            break;
> -         default:
> -            unreachable("Unreachable");
> +      case nir_intrinsic_atomic_counter_inc:
> +         tmp = emit_untyped_atomic(bld, surface, offset,
> +                                   src_reg(), src_reg(),
> +                                   1, 1,
> +                                   BRW_AOP_INC,
> +                                   BRW_PREDICATE_NONE);

No need to specify a predicate.

> +         break;
> +      case nir_intrinsic_atomic_counter_dec:
> +         tmp = emit_untyped_atomic(bld, surface, offset,
> +                                   src_reg(), src_reg(),
> +                                   1, 1,
> +                                   BRW_AOP_PREDEC,
> +                                   BRW_PREDICATE_NONE);

Same here.

> +         break;
> +      case nir_intrinsic_atomic_counter_read:
> +         tmp = emit_untyped_read(bld, surface, offset, 1, 1);
> +         break;
> +      default:
> +         unreachable("Unreachable");
>        }
>  
> +      dest.type = tmp.type;
> +      bld.MOV(dest, tmp);

You can use retype(dest, tmp.type).  With these nit-picks addressed:

Reviewed-by: Francisco Jerez <currojerez at riseup.net>

>        brw_mark_surface_used(stage_prog_data, surf_index);
>        break;
>     }
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> index cfd4d9b..d30330a 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> @@ -1115,61 +1115,6 @@ vec4_visitor::gs_end_primitive()
>  }
>  
>  void
> -vec4_visitor::emit_untyped_atomic(unsigned atomic_op, unsigned surf_index,
> -                                  dst_reg dst, src_reg surf_offset,
> -                                  src_reg src0, src_reg src1)
> -{
> -   unsigned mlen = 1 + (src0.file != BAD_FILE) + (src1.file != BAD_FILE);
> -   src_reg src_payload(this, glsl_type::uint_type, mlen);
> -   dst_reg payload(src_payload);
> -   payload.writemask = WRITEMASK_X;
> -
> -   /* Set the atomic operation offset. */
> -   emit(MOV(offset(payload, 0), surf_offset));
> -   unsigned i = 1;
> -
> -   /* Set the atomic operation arguments. */
> -   if (src0.file != BAD_FILE) {
> -      emit(MOV(offset(payload, i), src0));
> -      i++;
> -   }
> -
> -   if (src1.file != BAD_FILE) {
> -      emit(MOV(offset(payload, i), src1));
> -      i++;
> -   }
> -
> -   /* Emit the instruction.  Note that this maps to the normal SIMD8
> -    * untyped atomic message on Ivy Bridge, but that's OK because
> -    * unused channels will be masked out.
> -    */
> -   vec4_instruction *inst = emit(SHADER_OPCODE_UNTYPED_ATOMIC, dst,
> -                                 src_payload,
> -                                 brw_imm_ud(surf_index), brw_imm_ud(atomic_op));
> -   inst->mlen = mlen;
> -}
> -
> -void
> -vec4_visitor::emit_untyped_surface_read(unsigned surf_index, dst_reg dst,
> -                                        src_reg surf_offset)
> -{
> -   dst_reg offset(this, glsl_type::uint_type);
> -   offset.writemask = WRITEMASK_X;
> -
> -   /* Set the surface read offset. */
> -   emit(MOV(offset, surf_offset));
> -
> -   /* Emit the instruction.  Note that this maps to the normal SIMD8
> -    * untyped surface read message, but that's OK because unused
> -    * channels will be masked out.
> -    */
> -   vec4_instruction *inst = emit(SHADER_OPCODE_UNTYPED_SURFACE_READ, dst,
> -                                 src_reg(offset),
> -                                 brw_imm_ud(surf_index), brw_imm_d(1));
> -   inst->mlen = 1;
> -}
> -
> -void
>  vec4_visitor::emit_ndc_computation()
>  {
>     if (output_reg[VARYING_SLOT_POS].file == BAD_FILE)
> -- 
> 2.5.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 212 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160304/d49fe25d/attachment.sig>


More information about the mesa-dev mailing list