[Mesa-dev] [PATCH 06/92] nir/lower_system_values: add support for the FRAG_COORD system value

Connor Abbott cwabbott0 at gmail.com
Mon Jul 3 20:19:45 UTC 2017


On Mon, Jul 3, 2017 at 8:51 AM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> On 03.07.2017 02:50, Timothy Arceri wrote:
>>
>> On 03/07/17 10:46, Timothy Arceri wrote:
>>>
>>> This and the previous patch seem a bit hacky to me. It seems it would be
>>> better to either plum the system value all the way through NIR for all
>>> drivers or simply disable GLSLFragCoordIsSysVal when radeonsi is going to be
>>> using the NIR path.
>>
>>
>> Well maybe not disable, but surely we could ignore it.
>
>
> I agree that it's a bit hacky, but having FragCoord as a system value is
> cleaner more logical at least in radeonsi. Since this isn't necessarily true
> for all drivers, I don't think it makes sense to do the "plumbing through
> for all drivers".
>
> Though I could change this patch to add a load_frag_coord NIR intrinsic
> instead, that would be slightly cleaner.

Yeah, I don't know much about this, but if it's cleaner for radeonsi
(and presumably radv too?) for it to be a system value, then sure, add
the plumbing to make it a proper system value in NIR. Of course, other
drivers don't have to make it a system value though.

>
> Cheers,
> Nicolai
>
>
>
>>
>>>
>>> On 27/06/17 00:09, Nicolai Hähnle wrote:
>>>>
>>>> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>>>>
>>>> Arguably this could convert to a load intrinsic, but other code paths
>>>> already expect this as a fragment shader input.
>>>> ---
>>>>   src/compiler/nir/nir_lower_system_values.c | 36
>>>> ++++++++++++++++++++++++++----
>>>>   1 file changed, 32 insertions(+), 4 deletions(-)
>>>>
>>>> diff --git a/src/compiler/nir/nir_lower_system_values.c
>>>> b/src/compiler/nir/nir_lower_system_values.c
>>>> index 810100a..64a1354 100644
>>>> --- a/src/compiler/nir/nir_lower_system_values.c
>>>> +++ b/src/compiler/nir/nir_lower_system_values.c
>>>> @@ -21,22 +21,46 @@
>>>>    * IN THE SOFTWARE.
>>>>    *
>>>>    * Authors:
>>>>    *    Connor Abbott (cwabbott0 at gmail.com)
>>>>    *
>>>>    */
>>>>   #include "nir.h"
>>>>   #include "nir_builder.h"
>>>> +static nir_ssa_def *
>>>> +get_frag_coord(nir_builder *b, nir_shader *shader, nir_variable *orig)
>>>> +{
>>>> +   nir_variable *pos = NULL;
>>>> +
>>>> +   assert(shader->stage == MESA_SHADER_FRAGMENT);
>>>> +
>>>> +   nir_foreach_variable(var, &shader->inputs) {
>>>> +      if (var->data.location == VARYING_SLOT_POS) {
>>>> +         pos = var;
>>>> +         break;
>>>> +      }
>>>> +   }
>>>> +
>>>> +   if (!pos) {
>>>> +      pos = nir_variable_create(shader, nir_var_shader_in,
>>>> glsl_vec4_type(), "gl_FragCoord");
>>>> +      pos->data.location = VARYING_SLOT_POS;
>>>> +      pos->data.pixel_center_integer = orig->data.pixel_center_integer;
>>>> +      pos->data.origin_upper_left = orig->data.origin_upper_left;
>>>> +   }
>>>> +
>>>> +   return nir_load_var(b, pos);
>>>> +}
>>>> +
>>>>   static bool
>>>> -convert_block(nir_block *block, nir_builder *b)
>>>> +convert_block(nir_block *block, nir_builder *b, nir_shader *shader)
>>>>   {
>>>>      bool progress = false;
>>>>      nir_foreach_instr_safe(instr, block) {
>>>>         if (instr->type != nir_instr_type_intrinsic)
>>>>            continue;
>>>>         nir_intrinsic_instr *load_var = nir_instr_as_intrinsic(instr);
>>>>         if (load_var->intrinsic != nir_intrinsic_load_var)
>>>> @@ -109,59 +133,63 @@ convert_block(nir_block *block, nir_builder *b)
>>>>               sysval = nir_load_vertex_id(b);
>>>>            }
>>>>            break;
>>>>         case SYSTEM_VALUE_INSTANCE_INDEX:
>>>>            sysval = nir_iadd(b,
>>>>                              nir_load_instance_id(b),
>>>>                              nir_load_base_instance(b));
>>>>            break;
>>>> +      case SYSTEM_VALUE_FRAG_COORD:
>>>> +         sysval = get_frag_coord(b, shader, var);
>>>> +         break;
>>>> +
>>>>         default:
>>>>            break;
>>>>         }
>>>>         if (sysval == NULL) {
>>>>            nir_intrinsic_op sysval_op =
>>>>               nir_intrinsic_from_system_value(var->data.location);
>>>>            sysval = nir_load_system_value(b, sysval_op, 0);
>>>>         }
>>>>         nir_ssa_def_rewrite_uses(&load_var->dest.ssa,
>>>> nir_src_for_ssa(sysval));
>>>>         nir_instr_remove(&load_var->instr);
>>>>         progress = true;
>>>>      }
>>>>      return progress;
>>>>   }
>>>>   static bool
>>>> -convert_impl(nir_function_impl *impl)
>>>> +convert_impl(nir_function_impl *impl, nir_shader *shader)
>>>>   {
>>>>      bool progress = false;
>>>>      nir_builder builder;
>>>>      nir_builder_init(&builder, impl);
>>>>      nir_foreach_block(block, impl) {
>>>> -      progress |= convert_block(block, &builder);
>>>> +      progress |= convert_block(block, &builder, shader);
>>>>      }
>>>>      nir_metadata_preserve(impl, nir_metadata_block_index |
>>>>                                  nir_metadata_dominance);
>>>>      return progress;
>>>>   }
>>>>   bool
>>>>   nir_lower_system_values(nir_shader *shader)
>>>>   {
>>>>      bool progress = false;
>>>>      nir_foreach_function(function, shader) {
>>>>         if (function->impl)
>>>> -         progress = convert_impl(function->impl) || progress;
>>>> +         progress = convert_impl(function->impl, shader) || progress;
>>>>      }
>>>>      exec_list_make_empty(&shader->system_values);
>>>>      return progress;
>>>>   }
>>>>
>>> _______________________________________________
>>> mesa-dev mailing list
>>> mesa-dev at lists.freedesktop.org
>>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
>
>
> --
> Lerne, wie die Welt wirklich ist,
> Aber vergiss niemals, wie sie sein sollte.
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list