[Mesa-dev] [RFCv2 00/13] gallium: add support for NIR as alternate IR

Rob Clark robdclark at gmail.com
Fri Jan 29 14:18:08 PST 2016


On Thu, Jan 28, 2016 at 5:24 PM, Rob Clark <robdclark at gmail.com> wrote:
> fyi, I'm getting rather close to having a v3 of this patchset ready to
> send.  Since the last version, I've implemented NIR versions of
> tgsi_emulate, and bitmap/drawpix lowering, moved a bunch of stuff out
> of st_glsl_to_tgsi, etc.  Still a few things to clean up, but it is,
> IMHO, getting reasonable close to mergable.  Ignoring
> variable-indexing[1], I'm down to <40 regressions.

fwiw, I went ahead and implemented the built-in lowering pass (in
mesa/st).. turned out to be not so bad, and now I'm down to 0
regressions and actually 7 fail->pass (which I need to have a closer
look at)

BR,
-R

> [1] the variable-indexing tests need some more work in freedreno/ir3
> backend, because all of a sudden things are not just arrays of vec4.
> The issue is not glsl_to_nir related, and would not apply to other
> drivers (which already lower vars to regs).  But for now to cut down
> on the noise in piglit results I've been -x variable-indexing.
>
> One remaining issue that I've run into is that built-in uniforms don't
> get packed in the same way that normal struct uniforms do.  Ie. for
> gallium:
>
>    struct {
>       vec4 a;
>       float b;
>       float c;
>       float d;
>       float e;
>   }
>
> gets packed as 5*vec4.  But, for example, gl_FogParameters, which has
> conceptually the same structure layout, actually has a physical layout
> of 2*vec4:
>
>   static const struct gl_builtin_uniform_element gl_Fog_elements[] = {
>      {"color", {STATE_FOG_COLOR}, SWIZZLE_XYZW},
>      {"density", {STATE_FOG_PARAMS}, SWIZZLE_XXXX},
>      {"start", {STATE_FOG_PARAMS}, SWIZZLE_YYYY},
>      {"end", {STATE_FOG_PARAMS}, SWIZZLE_ZZZZ},
>      {"scale", {STATE_FOG_PARAMS}, SWIZZLE_WWWW},
>   };
>
> In fact, I'm not even sure that it is guaranteed that STATE_FOG_COLOR
> and STATE_FOG_PARAMS get allocated to two consecutive vec4's.
>
> What I'm thinking of at the moment is to write a lowering pass to run
> before nir_lower_io, which would replace built-in uniform var's w/ the
> equiv physical state elements.  Ie. replace "gl_FogParameters gl_Fog;"
> with "vec4 fog.color;" plus "vec4 fog.params;", and make corresponding
> fixups to the load_var's.
>
> Thoughts?  Better ideas?
>
> This would, I think, need to live outside of nir, since it would need
> access to _mesa_builtin_uniform_desc.  So not quite sure where it
> should live.  Maybe src/glsl/glsl_nir_lower_builtin_uniforms.cpp?
>
> btw, I *think* this issue only applies to built-in uniforms, but if it
> also applies to inputs/outputs/etc pls let me know.
>
> BR,
> -R
>
> On Sun, Nov 8, 2015 at 3:12 PM, Rob Clark <robdclark at gmail.com> wrote:
>> From: Rob Clark <robclark at freedesktop.org>
>>
>> Things have progressed somewhat since the initial RFC, to the point
>> that all sorts of common things are working (glmark2, xonotic, stk,
>> etc), and piglit is *mostly* working (~330 regressions or so)..
>>
>> (This is with both VS and FS converted, fwiw, compared to initial RFC
>> which was only using glsl_to_nir for VS.)
>>
>> Some of the remaining piglit regressions might be bugs in ir3.. still
>> tracking down some assumptions about everything being vec4's (which is
>> true in the glsl->tgsi->nir path but not in the glsl->nir path).
>>
>> Still some cleanup needed, now that I think I have a reasonable grasp
>> on how things should work.  But I think not too early to start getting
>> some comments.
>>
>> I still need to ditch the anon union in pipe_shader_state, but was
>> planning to leave flag-day rename-everything changes until closer to
>> being ready to merge to avoid getting bogged down in rebase conflicts.
>>
>> This is based on top of nir_clone, nir_shader refcnt'ing and a few
>> other in-flight patches which are not part of this patchset.  For the
>> complete branch see:
>>
>> https://github.com/freedreno/mesa/commits/wip-gallium-skip-tgsi
>>
>> Rob Clark (13):
>>   gallium: refactor pipe_shader_state to support multiple IR's
>>   gallium: add NIR as a possible IR
>>   nir: allow pre-resolved sampler uniform locations
>>   nir: add lowering pass for y-transform
>>   gallium/auxiliary: introduce nir_emulate
>>   mesa/st: add support for NIR as possible driver IR
>>   freedreno/ir3: add support for NIR as preferred IR
>>   freedreno/ir3: fix const_index handling for uniforms
>>   freedreno/ir3: handle large inputs/outputs
>>   freedreno/ir3: support load_front_face intrinsic
>>   freedreno/ir3: handle tex instrs w/ const offset
>>   freedreno/ir3: don't ignore local vars
>>   HACK: freedreno/a4xx: workaround glsl_to_nir hang..
>>
>>  src/gallium/auxiliary/Makefile.sources             |   2 +
>>  src/gallium/auxiliary/hud/hud_context.c            |  14 +-
>>  src/gallium/auxiliary/nir/nir_emulate.c            | 139 +++++++
>>  src/gallium/auxiliary/nir/nir_emulate.h            |  34 ++
>>  src/gallium/auxiliary/postprocess/pp_run.c         |   4 +-
>>  src/gallium/auxiliary/tgsi/tgsi_ureg.c             |   6 +-
>>  src/gallium/auxiliary/util/u_simple_shaders.c      |  42 ++-
>>  src/gallium/auxiliary/util/u_tests.c               |   7 +-
>>  src/gallium/drivers/freedreno/a4xx/fd4_program.c   |   4 +-
>>  src/gallium/drivers/freedreno/freedreno_screen.c   |   5 +-
>>  src/gallium/drivers/freedreno/freedreno_util.h     |   1 +
>>  .../drivers/freedreno/ir3/ir3_compiler_nir.c       | 110 ++++--
>>  src/gallium/drivers/freedreno/ir3/ir3_shader.c     |  16 +-
>>  src/gallium/include/pipe/p_defines.h               |  13 +-
>>  src/gallium/include/pipe/p_state.h                 |  27 +-
>>  src/glsl/Makefile.sources                          |   1 +
>>  src/glsl/nir/nir.h                                 |  12 +
>>  src/glsl/nir/nir_lower_samplers.c                  |  23 +-
>>  src/glsl/nir/nir_lower_wpos_ytransform.c           | 320 ++++++++++++++++
>>  src/mesa/state_tracker/st_glsl_to_tgsi.cpp         | 410 ++++++++++++++++++++-
>>  src/mesa/state_tracker/st_glsl_to_tgsi.h           |   5 +
>>  src/mesa/state_tracker/st_program.c                | 118 +++++-
>>  src/mesa/state_tracker/st_program.h                |   6 +
>>  23 files changed, 1247 insertions(+), 72 deletions(-)
>>  create mode 100644 src/gallium/auxiliary/nir/nir_emulate.c
>>  create mode 100644 src/gallium/auxiliary/nir/nir_emulate.h
>>  create mode 100644 src/glsl/nir/nir_lower_wpos_ytransform.c
>>
>> --
>> 2.5.0
>>


More information about the mesa-dev mailing list