[Mesa-dev] [PATCH 07/12] mesa/sso: Implement _mesa_UseProgramStages

Eric Anholt eric at anholt.net
Wed Mar 5 12:35:02 PST 2014


Ian Romanick <idr at freedesktop.org> writes:

> From: Gregory Hainaut <gregory.hainaut at gmail.com>
>
> Now arb_separate_shader_object-GetProgramPipelineiv should pass.
>
> V3 (idr):
> * Change spec references to core OpenGL versions instead of issues in
>   the extension spec.
> * Split out from previous uber patch.
>
> v4 (idr): Use _mesa_has_geometry_shaders in _mesa_UseProgramStages to
> detect availability of geometry shaders.
>
> Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
>  src/mesa/main/pipelineobj.c | 115 ++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 115 insertions(+)
>
> diff --git a/src/mesa/main/pipelineobj.c b/src/mesa/main/pipelineobj.c
> index 849c781..7149578 100644
> --- a/src/mesa/main/pipelineobj.c
> +++ b/src/mesa/main/pipelineobj.c

> +   GLbitfield any_valid_stages = GL_VERTEX_SHADER_BIT | GL_FRAGMENT_SHADER_BIT;
> +   if (_mesa_has_geometry_shaders(ctx))
> +      any_valid_stages |= GL_GEOMETRY_SHADER_BIT;
> +
> +   if (stages != GL_ALL_SHADER_BITS && (stages  & ~any_valid_stages) != 0) {

Weird double space before &.

> +      _mesa_error(ctx, GL_INVALID_VALUE, "glUseProgramStages(Stages)");
> +      return;
> +   }

> +   if (program) {
> +      /* Section 2.11.1 (Shader Objects) of the OpenGL 3.1 spec (and probably
> +       * earlier) says:
> +       *
> +       *     "Commands that accept shader or program object names will
> +       *     generate the error INVALID_VALUE if the provided name is not the
> +       *     name of either a shader or program object and INVALID_OPERATION
> +       *     if the provided name identifies an object that is not the
> +       *     expected type."
> +       */
> +      struct gl_shader *sh = _mesa_lookup_shader(ctx, program);
> +      if (sh != NULL) {
> +         _mesa_error(ctx, GL_INVALID_OPERATION,
> +               "glUseProgramStages(progam is a shader object)");
> +         return;
> +      }

This block could get dropped into the shProg == NULL case below, right?
The code confused me as is.

> +
> +      shProg = _mesa_lookup_shader_program(ctx, program);
> +      if (shProg == NULL) {
> +         _mesa_error(ctx, GL_INVALID_VALUE,
> +               "glUseProgramStages(progam is not a program object)");
> +         return;
> +      }


> +   /* Section 2.11.4 (Program Pipeline Objects) of the OpenGL 4.1 spec
> +    * says:
> +    *
> +    *     "If UseProgramStages is called with program set to zero or with a
> +    *     program object that contains no executable code for the given
> +    *     stages, it is as if the pipeline object has no programmable stage
> +    *     configured for the indicated shader stages."
> +    */
> +   if ((stages & GL_VERTEX_SHADER_BIT) != 0)
> +      _mesa_use_shader_program(ctx, GL_VERTEX_SHADER, shProg, pipe);
> +
> +   if ((stages & GL_FRAGMENT_SHADER_BIT) != 0)
> +      _mesa_use_shader_program(ctx, GL_FRAGMENT_SHADER, shProg, pipe);
> +
> +   if ((stages & GL_GEOMETRY_SHADER_BIT) != 0)
> +      _mesa_use_shader_program(ctx, GL_GEOMETRY_SHADER, shProg, pipe);
>  }

The spec cite here doesn't seem to be explaining the code it's next to,
to me.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 818 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140305/50f9b99c/attachment.pgp>


More information about the mesa-dev mailing list