[Mesa-dev] [PATCH 06/92] nir/lower_system_values: add support for the FRAG_COORD system value
Timothy Arceri
tarceri at itsqueeze.com
Mon Jul 3 21:34:42 UTC 2017
On 04/07/17 06:19, Connor Abbott wrote:
> 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.
My concern here was that we are creating a system value in GLSL IR only
to lower it in NIR so there seems no reason for it to be a system value
in the first place. Having a path for both types through NIR seem
excessive, and unhelpful. As far as I can tell RADV doesn't make use of
it, please stop me if I'm wrong but the system values doesn't actually
make it through NIR intact right?
>
>>
>> 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