[Mesa-dev] [PATCH 08/15] i965/vec4: add support for packing vs/gs/tes outputs

Alejandro Piñeiro apinheiro at igalia.com
Wed Jul 20 16:03:25 UTC 2016


Reviewed-by: Alejandro Piñeiro <apinheiro at igalia.com>


On 19/07/16 08:33, Timothy Arceri wrote:
> Here we create a new output_generic_reg array with the ability to
> store the dst_reg for each component of user defined varyings.
> This is needed as the previous code only stored the dst_reg based
> on the varying location which meant packed varyings would overwrite
> each other.
> ---
>  src/mesa/drivers/dri/i965/brw_vec4.h           |  3 +++
>  src/mesa/drivers/dri/i965/brw_vec4_nir.cpp     |  9 ++++++-
>  src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 37 +++++++++++++++++++++++---
>  3 files changed, 45 insertions(+), 4 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h
> index 3043147..4236b51 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4.h
> +++ b/src/mesa/drivers/dri/i965/brw_vec4.h
> @@ -114,6 +114,8 @@ public:
>      * for the ir->location's used.
>      */
>     dst_reg output_reg[BRW_VARYING_SLOT_COUNT];
> +   dst_reg output_generic_reg[MAX_VARYINGS_INCL_PATCH][4];
> +   unsigned output_generic_num_components[MAX_VARYINGS_INCL_PATCH][4];
>     const char *output_reg_annotation[BRW_VARYING_SLOT_COUNT];
>     int uniforms;
>  
> @@ -270,6 +272,7 @@ public:
>     void emit_ndc_computation();
>     void emit_psiz_and_flags(dst_reg reg);
>     vec4_instruction *emit_generic_urb_slot(dst_reg reg, int varying);
> +   void emit_generic_urb_slot(dst_reg reg, int varying, int component);
>     virtual void emit_urb_slot(dst_reg reg, int varying);
>  
>     void emit_shader_time_begin();
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
> index 33ad852..e5a091d 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
> @@ -416,7 +416,14 @@ vec4_visitor::nir_emit_intrinsic(nir_intrinsic_instr *instr)
>        src = get_nir_src(instr->src[0], BRW_REGISTER_TYPE_F,
>                          instr->num_components);
>  
> -      output_reg[varying] = dst_reg(src);
> +      if (varying >= VARYING_SLOT_VAR0) {
> +         unsigned c = nir_intrinsic_component(instr);
> +         unsigned v = varying - VARYING_SLOT_VAR0;
> +         output_generic_reg[v][c] = dst_reg(src);
> +         output_generic_num_components[v][c] = instr->num_components;
> +      } else {
> +         output_reg[varying] = dst_reg(src);
> +      }
>        break;
>     }
>  
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> index 652b453..e6eea69 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> @@ -1279,13 +1279,35 @@ vec4_visitor::emit_generic_urb_slot(dst_reg reg, int varying)
>     assert(varying < VARYING_SLOT_MAX);
>     assert(output_reg[varying].type == reg.type);
>     current_annotation = output_reg_annotation[varying];
> -   if (output_reg[varying].file != BAD_FILE)
> +   if (output_reg[varying].file != BAD_FILE) {
>        return emit(MOV(reg, src_reg(output_reg[varying])));
> -   else
> +   } else
>        return NULL;
>  }
>  
>  void
> +vec4_visitor::emit_generic_urb_slot(dst_reg reg, int varying, int component)
> +{
> +   assert(varying < VARYING_SLOT_MAX);
> +   assert(varying >= VARYING_SLOT_VAR0);
> +   varying = varying - VARYING_SLOT_VAR0;
> +
> +   unsigned num_comps = output_generic_num_components[varying][component];
> +   if (num_comps == 0)
> +      return;
> +
> +   assert(output_generic_reg[varying][component].type == reg.type);
> +   current_annotation = output_reg_annotation[varying];
> +   if (output_generic_reg[varying][component].file != BAD_FILE) {
> +      src_reg src = src_reg(output_generic_reg[varying][component]);
> +      src.swizzle = BRW_SWZ_COMP_OUTPUT(component);
> +      reg.writemask =
> +         brw_writemask_for_component_packing(num_comps, component);
> +      emit(MOV(reg, src));
> +   }
> +}
> +
> +void
>  vec4_visitor::emit_urb_slot(dst_reg reg, int varying)
>  {
>     reg.type = BRW_REGISTER_TYPE_F;
> @@ -1324,7 +1346,13 @@ vec4_visitor::emit_urb_slot(dst_reg reg, int varying)
>        /* No need to write to this slot */
>        break;
>     default:
> -      emit_generic_urb_slot(reg, varying);
> +      if (varying >= VARYING_SLOT_VAR0) {
> +         for (int i = 0; i < 4; i++) {
> +            emit_generic_urb_slot(reg, varying, i);
> +         }
> +      } else {
> +         emit_generic_urb_slot(reg, varying);
> +      }
>        break;
>     }
>  }
> @@ -1772,6 +1800,9 @@ vec4_visitor::vec4_visitor(const struct brw_compiler *compiler,
>     this->current_annotation = NULL;
>     memset(this->output_reg_annotation, 0, sizeof(this->output_reg_annotation));
>  
> +   memset(this->output_generic_num_components, 0,
> +          sizeof(this->output_generic_num_components));
> +
>     this->virtual_grf_start = NULL;
>     this->virtual_grf_end = NULL;
>     this->live_intervals = NULL;



More information about the mesa-dev mailing list