[Mesa-dev] [RFC PATCH] glsl: Allow mixing of GLSL 1.40 and later shader versions.

Paul Berry stereotype441 at gmail.com
Thu Oct 17 19:05:41 CEST 2013


On 16 October 2013 22:30, Kenneth Graunke <kenneth at whitecape.org> wrote:

> On 10/16/2013 04:56 PM, Ian Romanick wrote:
> > On 10/16/2013 10:29 AM, Paul Berry wrote:
> >> ---
> >>
> >> I'm not 100% sure this is the right way to go, and here's why:
> >>
> >> Taken together, all the GLSL specs except GLSL 4.30 and GLSL 4.40 tell
> >> a consistent story: desktop shader versions 1.10 and 1.20 may be
> >> linked together, and desktop shader versions 1.40 and above may be
> >> linked together.  No other cross-version linking is allowed.
> >>
> >> However, cross-version linking restrictions were explicitly removed in
> >> GLSL 4.30 (the change is listed under "Summary of Changes from Version
> >> 4.20 as "Remove cross-version linking restrictions.").  GLSL 4.30 and
> >> 4.40 state that *any* version of desktop GLSL may be linked with any
> >> other version of desktop GLSL.  (Note that cross-version linking is
> >> still prohibited for ES shaders).
> >
> > This came from a Khronos bug that I submitted.  The problem is that no
> > other driver enforces the spec mandated restriction.  On top of that,
> > you can't fully enforce the restriction (without draw-time errors) with
> > separate shader objects.  I *thought* the change in 4.3 was to allow
> > mixed versions between stages, but mixing versions within a stage is
> > still forbidden.
> >
> >> This leads to a conundrum.  Normally when the GLSL spec changes from
> >> one version to the next, we implement different rules depending on the
> >> user-supplied "#version" directive.  But we can't do that for
> >> cross-version linking rules since it's not clear which version of GLSL
> >> should apply.  Should we:
> >>
> >> (a) always follow pre-GLSL 4.30 linking rules, since we don't support
> >> GLSL 4.30 yet?  (that's what this patch implements).
> >>
> >> (b) always follow post-GLSL 4.30 linking rules, since they're probably
> >> the clearest reflection of the Khronos board's intent?
> >>
> >> (c) make some kind of dynamic determination of which set of rules to
> >> follow?
> >>
> >> FWIW, the NVIDIA proprietary driver for Linux (version 313.18) appears
> >> to implement (b).
> >
> > There are different cases: intrastage and interstage.  I assume they
> > allow mixing interstage.  What about intrastage?
>
> I ran a quick test on my AMD Radeon 6870, using Catalyst 13.10 (which
> supports 4.30).  It allowed both kinds of linking.  Here's my test:
>
> [require]
> GL >= 2.1
> GLSL >= 1.10
>
> [vertex shader]
> #version 400 compatibility
>
> void main()
> {
>     gl_Position = gl_Vertex;
> }
>
> [fragment shader]
> #version 330 core
> uniform vec4 color;
>
> vec4 get_color()
> {
>     return color;
> }
>
> [fragment shader]
> #version 110
> vec4 get_color();
>
> void main()
> {
>     gl_FragColor = get_color();
> }
>
> [test]
> uniform vec4 color 0 1 0 1
> draw rect -1 -1 2 2
> relative probe rgba (0.5, 0.5) (0.0, 1.0, 0.0, 1.0)
>

Ok, thanks Ken.  Based on the NVIDIA results, and further discussion with
Ian this morning, I'm going to NAK this patch and follow up with a patch
that allows all desktop GLSL versions to be inter-linked.

(BTW, for any Khronos members, the Khronos bug that led to this change is
bug 8463)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20131017/ae3f9e6d/attachment.html>


More information about the mesa-dev mailing list