[Freedreno] [Mesa-dev] [PATCH] gallium/ttn: mark location specially in nir for color0-writes-all
Rob Clark
robdclark at gmail.com
Sat Jun 27 17:42:56 PDT 2015
On Sat, Jun 27, 2015 at 7:47 PM, Connor Abbott <cwabbott0 at gmail.com> wrote:
> On Sat, Jun 27, 2015 at 2:54 PM, Rob Clark <robdclark at gmail.com> wrote:
>> Connor, btw, how does glsl_to_nir handle this?
>
> The variable for gl_FragColor a special location (FRAG_RESULT_COLOR),
> whereas normal outputs (i.e. gl_FragData[] or out variables) start at
> FRAG_RESULT_DATA0.
>
>>
>> I guess at some point we want to try to align ttn w/ gtn (ie. cleanup
>> the whole nir with a tgsi accent thing)..
>>
>> not that this would be the worst of the ttn vs gtn diff's in the
>> current state, so it is fine if there isn't a better way to do it
>> right now.. but I would like to start moving towards using nir
>> #define's for semantic names/indexes, etc, rather than tgsi or glsl
>> specific ones.. in the end the driver shouldn't have to care if the
>> nir came from tgsi/glsl/spirv/etc
>
> Indeed, it would be nice to have NIR do it's own, well-documented
> thing that's consistent between all the frontends... I've been looking
> at SPIR-V inputs/outputs, and it has its own way of doing things
> that's a little more flexible than GLSL in some ways (e.g. right now
> you can have arbitrary structs of structs and one of the members can
> be marked as flat or noperspective), although it's not really clear
> how much of this is intentional and how much is because it wasn't
> specified or accidentally allowed. The plan has been to map that onto
> how the existing Mesa infrastructure does things, although the current
> underspecification of SPIR-V combined with the underspecification of
> how it all works in Mesa has been a bit frustrating. I'm not really
> familiar with how it works in Gallium at all, though, so I'm not sure
> I'd be the one for the job, or if there even is a person really
> qualified for it.
the one good thing about tgsi is it is pretty well specified, and in a
way that is independent of what sits upstream of tgsi ;-)
I'd be a fan of specifying things in NIR (w/ it's own
enums/#defines/etc) and mapping glsl/spirv/etc onto that.. current
re-use of glsl specific stuff in NIR is a bit of a pain point for
gallium drivers (since gallium drivers can be used for things other
than gl..)
BR,
-R
>>
>> BR,
>> -R
>>
>>
>> On Sat, Jun 27, 2015 at 5:38 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
>>> We need to distinguish a shader that has separate writes to each MRT
>>> from one which is supposed to write the data from MRT 0 to all the MRTs.
>>> In TGSI this is done with a property. NIR doesn't have that, so encode
>>> it as a funny location and decode on the other end.
>>>
>>> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
>>> ---
>>>
>>> This fixes bin/fbo-drawbuffers-none gl_FragColor when I additionally
>>> initialize the "default" colors to a register other than r0.x -- as is
>>> this happens to work by luck.
>>>
>>> Also fix up vc4 to ignore this for now.
>>>
>>> src/gallium/auxiliary/nir/tgsi_to_nir.c | 7 ++++++-
>>> src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c | 4 ++++
>>> src/gallium/drivers/vc4/vc4_program.c | 6 ++++++
>>> 3 files changed, 16 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/src/gallium/auxiliary/nir/tgsi_to_nir.c b/src/gallium/auxiliary/nir/tgsi_to_nir.c
>>> index bf7eb2f..4130697 100644
>>> --- a/src/gallium/auxiliary/nir/tgsi_to_nir.c
>>> +++ b/src/gallium/auxiliary/nir/tgsi_to_nir.c
>>> @@ -253,7 +253,12 @@ ttn_emit_declaration(struct ttn_compile *c)
>>> var->name = ralloc_asprintf(var, "out_%d", idx);
>>>
>>> var->data.location = decl->Semantic.Name;
>>> - var->data.index = decl->Semantic.Index;
>>> + if (decl->Semantic.Name == TGSI_SEMANTIC_COLOR &&
>>> + decl->Semantic.Index == 0 &&
>>> + c->scan->properties[TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS])
>>> + var->data.index = -1;
>>> + else
>>> + var->data.index = decl->Semantic.Index;
>>>
>>> if (is_array) {
>>> unsigned j;
>>> diff --git a/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c b/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c
>>> index 3b36114..fa13c40 100644
>>> --- a/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c
>>> +++ b/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c
>>> @@ -2110,6 +2110,10 @@ setup_output(struct ir3_compile *ctx, nir_variable *out)
>>> so->writes_pos = true;
>>> break;
>>> case TGSI_SEMANTIC_COLOR:
>>> + if (semantic_index == -1) {
>>> + semantic_index = 0;
>>> + so->color0_mrt = 1;
>>> + }
>>> break;
>>> default:
>>> compile_error(ctx, "unknown FS semantic name: %s\n",
>>> diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c
>>> index 2061631..728ecc6 100644
>>> --- a/src/gallium/drivers/vc4/vc4_program.c
>>> +++ b/src/gallium/drivers/vc4/vc4_program.c
>>> @@ -1783,6 +1783,12 @@ ntq_setup_outputs(struct vc4_compile *c)
>>>
>>> assert(array_len == 1);
>>>
>>> + /* NIR hack to pass through
>>> + * TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS */
>>> + if (semantic_name == TGSI_SEMANTIC_COLOR &&
>>> + semantic_index == -1)
>>> + semantic_index = 0;
>>> +
>>> for (int i = 0; i < 4; i++) {
>>> add_output(c,
>>> loc + i,
>>> --
>>> 2.3.6
>>>
>>> _______________________________________________
>>> mesa-dev mailing list
>>> mesa-dev at lists.freedesktop.org
>>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the Freedreno
mailing list