[Mesa-dev] [PATCH 08/21] nir/intrinsics: Add a second const index to load_uniform

Jason Ekstrand jason at jlekstrand.net
Mon Aug 24 16:25:44 PDT 2015


On Mon, Aug 24, 2015 at 4:02 PM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> On Wednesday, August 19, 2015 10:45:43 PM Jason Ekstrand wrote:
>> In the i965 backend, we want to be able to "pull apart" the uniforms and
>> push some of them into the shader through a different path.  In order to do
>> this effectively, we need to know which variable is actually being referred
>> to by a given uniform load.  Previously, it was completely flattened by
>> nir_lower_io which made things difficult.  This adds more information to
>> the intrinsic to make this easier for us.
>> ---
>>  src/glsl/nir/nir_intrinsics.h              | 28 +++++++++++++++++-----------
>>  src/mesa/drivers/dri/i965/brw_fs_nir.cpp   |  2 +-
>>  src/mesa/drivers/dri/i965/brw_vec4_nir.cpp |  2 +-
>>  3 files changed, 19 insertions(+), 13 deletions(-)
>>
>> diff --git a/src/glsl/nir/nir_intrinsics.h b/src/glsl/nir/nir_intrinsics.h
>> index bc6e6b8..5aa12fa 100644
>> --- a/src/glsl/nir/nir_intrinsics.h
>> +++ b/src/glsl/nir/nir_intrinsics.h
>> @@ -139,11 +139,17 @@ SYSTEM_VALUE(sample_mask_in, 1)
>>  SYSTEM_VALUE(invocation_id, 1)
>>
>>  /*
>> - * The first and only index is the base address to load from.  Indirect
>> - * loads have an additional register input, which is added to the constant
>> - * address to compute the final address to load from.  For UBO's (and
>> - * SSBO's), the first source is the (possibly constant) UBO buffer index
>> - * and the indirect (if it exists) is the second source.
>> + * The format of the indices depends on the type of the load.  For uniforms,
>> + * the first index is the base address and the second index is an offset that
>> + * should be added to the base address.  (This way you can determine in the
>> + * back-end which variable is being accessed even in an array.)  For inputs,
>> + * the one and only index corresponds to the attribute slot.  UBO loads also
>
> Please drop the new sentence about inputs.  Attribute slots only make
> sense for vertex shader inputs, not inputs in general...and it's not
> entirely related to this change.

Part of this change was to actually enumerate all of the possibilities
as opposed to describing them in general.  I have to say *something*
about inputs.  I guess I could say something about attribute slot or
input offset.  Suggestions welcome.

> So, it sounds like TGSI-to-NIR simply ignores the second index and keeps
> working as usual?  I suppose that works - it shouldn't break anything,
> at least.  Eric and Rob can change it if they want.

Yeah, they should default to 0 and be completely ignorable.
--Jason

>> + * have a single index which is the base address to load from.
>> + *
>> + * UBO loads have a (possibly constant) source which is the UBO buffer index.
>> + * For each type of load, the _indirect variant has one additional source
>> + * (the second in the case of UBO's) that is the is an indirect to be added to
>> + * the constant address or base offset to compute the final offset.
>>   *
>>   * For vector backends, the address is in terms of one vec4, and so each array
>>   * element is +4 scalar components from the previous array element. For scalar
>> @@ -151,14 +157,14 @@ SYSTEM_VALUE(invocation_id, 1)
>>   * elements begin immediately after the previous array element.
>>   */
>>
>> -#define LOAD(name, extra_srcs, flags) \
>> -   INTRINSIC(load_##name, extra_srcs, ARR(1), true, 0, 0, 1, flags) \
>> +#define LOAD(name, extra_srcs, indices, flags) \
>> +   INTRINSIC(load_##name, extra_srcs, ARR(1), true, 0, 0, indices, flags) \
>>     INTRINSIC(load_##name##_indirect, extra_srcs + 1, ARR(1, 1), \
>> -             true, 0, 0, 1, flags)
>> +             true, 0, 0, indices, flags)
>>
>> -LOAD(uniform, 0, NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER)
>> -LOAD(ubo, 1, NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER)
>> -LOAD(input, 0, NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER)
>> +LOAD(uniform, 0, 2, NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER)
>> +LOAD(ubo, 1, 1, NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER)
>> +LOAD(input, 0, 1, NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER)
>>  /* LOAD(ssbo, 1, 0) */
>>
>>  /*
>> diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
>> index 354c5ee..5b54b95 100644
>> --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
>> +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
>> @@ -1470,7 +1470,7 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr
>>        has_indirect = true;
>>        /* fallthrough */
>>     case nir_intrinsic_load_uniform: {
>> -      unsigned index = instr->const_index[0];
>> +      unsigned index = instr->const_index[0] + instr->const_index[1];
>>
>>        fs_reg uniform_reg;
>>        if (index < num_direct_uniforms) {
>> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
>> index 4f689df..9e52229 100644
>> --- a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
>> +++ b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
>> @@ -570,7 +570,7 @@ vec4_visitor::nir_emit_intrinsic(nir_intrinsic_instr *instr)
>>        has_indirect = true;
>>        /* fallthrough */
>>     case nir_intrinsic_load_uniform: {
>> -      int uniform = instr->const_index[0];
>> +      int uniform = instr->const_index[0] + instr->const_index[1];
>>
>>        dest = get_nir_dest(instr->dest);
>>
>>


More information about the mesa-dev mailing list