[Mesa-dev] Mesa (master): prog_to_nir: Use a variable for uniform data

Jason Ekstrand jason at jlekstrand.net
Mon May 25 09:33:27 PDT 2015


On Mon, May 25, 2015 at 7:01 AM, Brian Paul <brianp at vmware.com> wrote:
> On 05/23/2015 01:48 PM, Jason Ekstrand wrote:
>>
>> Module: Mesa
>> Branch: master
>> Commit: 58aed1031d40e62c9f41f7c512b3165dd5913d1e
>> URL:
>> https://urldefense.proofpoint.com/v2/url?u=http-3A__cgit.freedesktop.org_mesa_mesa_commit_-3Fid-3D58aed1031d40e62c9f41f7c512b3165dd5913d1e&d=BQIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=T0t4QG7chq2ZwJo6wilkFznRSFy-8uDKartPGbomVj8&m=AUmfmJbvB-Il64EyCF0vFjoyskBKDGIchgr_TL5EQDI&s=mfkMXNGXikWYcTiazg6hxmdzUdzK3jVALmh024FfCP4&e=
>>
>> Author: Jason Ekstrand <jason.ekstrand at intel.com>
>> Date:   Tue May 19 16:25:02 2015 -0700
>>
>> prog_to_nir: Use a variable for uniform data
>>
>> Previously, the prog_to_nir pass was directly generating uniform
>> load/store
>> intrinsics.  This converts it to use a single giant "parameters" variable
>> and we now depend on lowering to get the uniform load/store intrinsics.
>> One advantage of this is that we now have one code-path after we do the
>> initial conversion into NIR.
>>
>> No shader-db changes.
>>
>> Signed-off-by: Jason Ekstrand <jason.ekstrand at intel.com>
>> Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
>>
>> ---
>>
>>   src/mesa/drivers/dri/i965/brw_nir.c |   15 ++------
>>   src/mesa/program/prog_to_nir.c      |   65
>> +++++++++++++++++++----------------
>>   2 files changed, 38 insertions(+), 42 deletions(-)
>>
>> diff --git a/src/mesa/drivers/dri/i965/brw_nir.c
>> b/src/mesa/drivers/dri/i965/brw_nir.c
>> index de4d7aa..142162c 100644
>> --- a/src/mesa/drivers/dri/i965/brw_nir.c
>> +++ b/src/mesa/drivers/dri/i965/brw_nir.c
>> @@ -122,18 +122,9 @@ brw_create_nir(struct brw_context *brw,
>>      /* Get rid of split copies */
>>      nir_optimize(nir);
>>
>> -   if (shader_prog) {
>> -      nir_assign_var_locations_scalar_direct_first(nir, &nir->uniforms,
>> -
>> &nir->num_direct_uniforms,
>> -                                                   &nir->num_uniforms);
>> -   } else {
>> -      /* ARB programs generally create a giant array of "uniform" data,
>> and allow
>> -       * indirect addressing without any boundaries.  In the absence of
>> bounds
>> -       * analysis, it's all or nothing.  num_direct_uniforms is only
>> useful when
>> -       * we have some direct and some indirect access; it doesn't matter
>> here.
>> -       */
>> -      nir->num_direct_uniforms = 0;
>> -   }
>> +   nir_assign_var_locations_scalar_direct_first(nir, &nir->uniforms,
>> +
>> &nir->num_direct_uniforms,
>> +                                                &nir->num_uniforms);
>>      nir_assign_var_locations_scalar(&nir->inputs, &nir->num_inputs);
>>      nir_assign_var_locations_scalar(&nir->outputs, &nir->num_outputs);
>>
>> diff --git a/src/mesa/program/prog_to_nir.c
>> b/src/mesa/program/prog_to_nir.c
>> index 6c5fa51..3067b25 100644
>> --- a/src/mesa/program/prog_to_nir.c
>> +++ b/src/mesa/program/prog_to_nir.c
>> @@ -47,6 +47,7 @@ struct ptn_compile {
>>      nir_builder build;
>>      bool error;
>>
>> +   nir_variable *parameters;
>>      nir_variable *input_vars[VARYING_SLOT_MAX];
>>      nir_variable *output_vars[VARYING_SLOT_MAX];
>>      nir_register **output_regs;
>> @@ -112,21 +113,6 @@ ptn_get_dest(struct ptn_compile *c, const struct
>> prog_dst_register *prog_dst)
>>      return dest;
>>   }
>>
>> -/**
>> - * Multiply the contents of the ADDR register by 4 to convert from the
>> number
>> - * of vec4s to the number of floating point components.
>> - */
>> -static nir_ssa_def *
>> -ptn_addr_reg_value(struct ptn_compile *c)
>> -{
>> -   nir_builder *b = &c->build;
>> -   nir_alu_src src;
>> -   memset(&src, 0, sizeof(src));
>> -   src.src = nir_src_for_reg(c->addr_reg);
>> -
>> -   return nir_imul(b, nir_fmov_alu(b, src, 1), nir_imm_int(b, 4));
>> -}
>> -
>>   static nir_ssa_def *
>>   ptn_get_src(struct ptn_compile *c, const struct prog_src_register
>> *prog_src)
>>   {
>> @@ -180,27 +166,40 @@ ptn_get_src(struct ptn_compile *c, const struct
>> prog_src_register *prog_src)
>>            }
>>            /* FALLTHROUGH */
>>         case PROGRAM_STATE_VAR: {
>> -         nir_intrinsic_op load_op =
>> -            prog_src->RelAddr ? nir_intrinsic_load_uniform_indirect :
>> -                                nir_intrinsic_load_uniform;
>> -         nir_intrinsic_instr *load =
>> nir_intrinsic_instr_create(b->shader, load_op);
>> +         nir_intrinsic_instr *load =
>> +            nir_intrinsic_instr_create(b->shader,
>> nir_intrinsic_load_var);
>>            nir_ssa_dest_init(&load->instr, &load->dest, 4, NULL);
>>            load->num_components = 4;
>>
>> -         /* Multiply src->Index by 4 to scale from # of vec4s to
>> components. */
>> -         load->const_index[0] = 4 * prog_src->Index;
>> -         load->const_index[1] = 1;
>> +         load->variables[0] = nir_deref_var_create(load, c->parameters);
>> +         nir_deref_array *deref_arr =
>> +            nir_deref_array_create(load->variables[0]);
>> +         deref_arr->deref.type = glsl_vec4_type();
>> +         load->variables[0]->deref.child = &deref_arr->deref;
>>
>>            if (prog_src->RelAddr) {
>> -            nir_ssa_def *reladdr = ptn_addr_reg_value(c);
>> +            deref_arr->deref_array_type = nir_deref_array_type_indirect;
>> +
>> +            nir_alu_src addr_src = { NIR_SRC_INIT };
>> +            addr_src.src = nir_src_for_reg(c->addr_reg);
>> +            nir_ssa_def *reladdr = nir_imov_alu(b, addr_src, 1);
>> +
>>               if (prog_src->Index < 0) {
>>                  /* This is a negative offset which should be added to the
>> address
>>                   * register's value.
>>                   */
>> -               reladdr = nir_iadd(b, reladdr, nir_imm_int(b,
>> load->const_index[0]));
>> -               load->const_index[0] = 0;
>> +               nir_alu_src addr_src = { NIR_SRC_INIT };
>> +               addr_src.src = nir_src_for_reg(c->addr_reg);
>> +               reladdr = nir_iadd(b, reladdr, nir_imm_int(b,
>> prog_src->Index));
>> +
>> +               deref_arr->base_offset = 0;
>> +            } else {
>> +               deref_arr->base_offset = prog_src->Index;
>>               }
>
>
>
> program/prog_to_nir.c: In function 'ptn_get_src':
> program/prog_to_nir.c:191:28: warning: variable 'addr_src' set but not used
> [-Wunused-but-set-variable]
>                 nir_alu_src addr_src = { NIR_SRC_INIT };
>                             ^

Sorry about that.  It was a copy-paste error.  It's fixed now.
--Jason

>> -            load->src[0] = nir_src_for_ssa(reladdr);
>> +            deref_arr->indirect = nir_src_for_ssa(reladdr);
>> +         } else {
>> +            deref_arr->deref_array_type = nir_deref_array_type_direct;
>> +            deref_arr->base_offset = prog_src->Index;
>>            }
>>
>>            nir_instr_insert_after_cf_list(b->cf_node_list, &load->instr);
>
>
> -Brian
>
>
> _______________________________________________
> 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