[Mesa-dev] [Mesa-stable] [PATCH 2/5] glsl/linker: Properly report gl_PerVertex shader inputs

Timothy Arceri timothy.arceri at collabora.com
Tue May 31 22:07:47 UTC 2016


On Tue, 2016-05-31 at 17:26 -0400, Ilia Mirkin wrote:
> On Tue, May 31, 2016 at 5:09 PM, Ian Romanick <idr at freedesktop.org>
> wrote:
> > 
> > On 05/31/2016 01:48 PM, Ian Romanick wrote:
> > > 
> > > On 05/31/2016 11:56 AM, Ilia Mirkin wrote:
> > > > 
> > > > On Tue, May 31, 2016 at 2:52 PM, Ian Romanick <idr at freedesktop.
> > > > org> wrote:
> > > > > 
> > > > > From: Ian Romanick <ian.d.romanick at intel.com>
> > > > > 
> > > > > Issue #16 of the GL_ARB_program_interface_query makes it
> > > > > pretty clear
> > > > > array shader inputs of gl_PerVertex blocks should be reported
> > > > > as
> > > > > gl_PerVertex.gl_Foo.  Piglit tests were recently changed to
> > > > > expect
> > > > > this behavior, and this change makes those tests pass again.
> > > > I'd like to note that you're now removing arrays of *all*
> > > > interfaces,
> > > > not just gl_PerVertex. I suspect this is OK, but just want to
> > > > double-check. Assuming that was your intent,
> > > It was the intent when I wrote it, but I wasn't sure whether or
> > > not it
> > > was correct.  I ran it through piglit, CTS, and dEQP, and there
> > > were no
> > > changes.  I was intending to go dig deeper in the spec, but I
> > > forgot.
> > > I'll double check that.
> > Right... so here's the weird thing.  I feel like it's all
> > junk.  The
> > ARB_piq spec clearly says:
> > 
> >       * For an active interface block declared as an array of
> > instances,
> >         separate entries will be generated for each active
> > instance.  The name
> >         of the instance is formed by concatenating the block name,
> > the "["
> >         character, an integer identifying the instance number, and
> > the "]"
> >         character.
> > 
> > By my reading, even gl_PerVertex stuff should come through as
> > gl_PerVertex[0].gl_Foo through gl_PerVertex[#].gl_Foo.  If that's
> > true,
> > then even the dEQP tests are bunk.
> > 
> > Before we would return BlockName[#array_size].foo, and that is
> > definitely wrong.  Now we'll return BlockName.foo.  This possibly
> > not
> > right, but I don't think it's worse than what we did before... but
> > we
> > now do what dEQP expects for gl_PerVertex.
> > 
> > I think I want to push this patch with some of the commentary above
> > added to the commit message.  How does that sound?
> Looking closer, I think you're right - issue 16 says:
> 
>     (16) How are inputs and outputs in the built-in interface block
>          "gl_PerVertex" enumerated?
> 
>       RESOLVED:  We will follow the default rule for enumerating
> block members
>       in the OpenGL API, which is:
> 
>         * If a variable is a member of an interface block without an
> instance
>           name, it is enumerated using just the variable name.
> 
>         * If a variable is a member of an interface block with an
> instance
>           name, it is enumerated as "BlockName.Member", where
> "BlockName" is
>           the name of the interface block (not the instance name) and
> "Member"
>           is the name of the variable.
> 
>       For example, in the following code:
> 
>         uniform Block1 {
>           int member1;
>         };
>         uniform Block2 {
>           int member2;
>         } instance2;
>         uniform Block3 {
>           int member3;
>         } instance3[2];  // uses two separate buffer bindings
> 
>       the three uniforms (if active) are enumerated as "member1",
>       "Block2.member2", and "Block3.member3".
> 
> However the ACTUAL rules for enumerating block members are:
> 
>       * For an active interface block not declared as an array of
> block
>         instances, a single entry will be generated, using the block
> name from
>         the shader source.
> 
>       * For an active interface block declared as an array of
> instances,
>         separate entries will be generated for each active
> instance.  The name
>         of the instance is formed by concatenating the block name,
> the "["
>         character, an integer identifying the instance number, and
> the "]"
>         character.
> 
> So I think in that example, it should be Block1.member1, and
> Block3[0].member3 + Block3[1].member3?
> 
> Anyways, this is all very confusing to me. I'd like to withdraw my
> R-b, since I clearly don't understand what's going on. Hopefully a
> more experienced spec reader will be able to do a real review.

Yeah this seems like an oversight to me. I was looking at this the
other day and it seemed to me we should be using or at least doing
something like how the names are generated in the
program_resource_visitor in link_uniforms.cpp which is used for both
UBO's and interface blocks.

I also added create_xfb_varying_names() a while back too which does a
similar thing.

The code in add_shader_variable() that deals with structs to me also
looks like it should be taking into account arrays.

> 
> Cheers,
> 
>   -ilia
> _______________________________________________
> mesa-stable mailing list
> mesa-stable at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-stable


More information about the mesa-dev mailing list