[Mesa-dev] [RFC PATCH] glsl: Allow mixing of GLSL 1.40 and later shader versions.
Paul Berry
stereotype441 at gmail.com
Thu Oct 17 08:49:23 CEST 2013
On 16 October 2013 16:56, Ian Romanick <idr at freedesktop.org> 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.
>
Looking at the specs, it appears that they removed the restriction for both
intra- and inter-stage linking.
>
> > 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?
>
That's a good point--when I tested this the other day, I only tested
interstage.
I've just checked intrastage linking and I see the same behaviour: any
version can be linked with any other version.
>
> > src/glsl/linker.cpp | 28 ++++++++++++++++++++--------
> > 1 file changed, 20 insertions(+), 8 deletions(-)
> >
> > diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
> > index 9095a40..1dac85c 100644
> > --- a/src/glsl/linker.cpp
> > +++ b/src/glsl/linker.cpp
> > @@ -2057,17 +2057,29 @@ link_shaders(struct gl_context *ctx, struct
> gl_shader_program *prog)
> > }
> > }
> >
> > - /* Previous to GLSL version 1.30, different compilation units could
> mix and
> > - * match shading language versions. With GLSL 1.30 and later, the
> versions
> > - * of all shaders must match.
> > + /* For desktop GLSL, versions 1.10 and 1.20 may be linked together,
> and
> > + * versions 1.40 and later may be linked together. But version 1.30
> may
> > + * not be linked with any other version, and versions prior to 1.30
> may not
> > + * be linked to versions after 1.30.
> > *
> > * GLSL ES has never allowed mixing of shading language versions.
> > */
> > - if ((is_es_prog || max_version >= 130)
> > - && min_version != max_version) {
> > - linker_error(prog, "all shaders must use same shading "
> > - "language version\n");
> > - goto done;
> > + if (is_es_prog) {
> > + if (min_version != max_version) {
> > + linker_error(prog, "all shaders must use same shading "
> > + "language version\n");
> > + goto done;
> > + }
> > + } else {
> > + if (min_version < 130 && max_version >= 130) {
> > + linker_error(prog, "GLSL versions prior to 1.30 may not be
> linked "
> > + "with GLSL versions 1.30 and above\n");
> > + goto done;
> > + } else if (min_version == 130 && max_version > 130) {
> > + linker_error(prog, "GLSL version 1.30 may not be linked with
> GLSL "
> > + "versions above 1.30\n");
> > + goto done;
> > + }
> > }
> >
> > prog->Version = max_version;
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20131016/bb5e2306/attachment.html>
More information about the mesa-dev
mailing list