<div dir="ltr">On 16 October 2013 23:29, Pohjolainen, Topi <span dir="ltr"><<a href="mailto:topi.pohjolainen@intel.com" target="_blank">topi.pohjolainen@intel.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Wed, Oct 16, 2013 at 11:13:33AM -0700, Paul Berry wrote:<br>
> The queries GEOMETRY_VERTICES_OUT, GEOMETRY_INPUT_TYPE, and<br>
> GEOMETRY_OUTPUT_TYPE (defined by GL 3.2) differ from the corresponding<br>
> queries in ARB_geometry_shader4 in the following ways:<br>
><br>
> - They use different enum values<br>
><br>
> - They can only be queried; they cannot be set.<br>
><br>
> - Attempting to query them yields INVALID_OPERATION if the program is<br>
>   not linked, or lacks a geometry shader.<br>
><br>
> This patch switches us over from the ARB_geometry_shader4 behaviour to<br>
> the GL 3.2 behaviour.<br>
><br>
> Fixes piglit test query-gs-prim-types.<br>
> ---<br>
>  src/mesa/main/shaderapi.c | 100 +++++++++++++++++++---------------------------<br>
>  1 file changed, 40 insertions(+), 60 deletions(-)<br>
><br>
> diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c<br>
> index d3677c8..8be1f78 100644<br>
> --- a/src/mesa/main/shaderapi.c<br>
> +++ b/src/mesa/main/shaderapi.c<br>
> @@ -460,6 +460,31 @@ get_handle(struct gl_context *ctx, GLenum pname)<br>
><br>
><br>
>  /**<br>
> + * Check if a geometry shader query is valid at this time.  If not, report an<br>
> + * error and return false.<br>
> + *<br>
> + * From GL 3.2 section 6.1.16 (Shader and Program Queries):<br>
> + *<br>
> + *     "If GEOMETRY_VERTICES_OUT, GEOMETRY_INPUT_TYPE, or GEOMETRY_OUTPUT_TYPE<br>
> + *     are queried for a program which has not been linked successfully, or<br>
> + *     which does not contain objects to form a geometry shader, then an<br>
> + *     INVALID_OPERATION error is generated."<br>
> + */<br>
> +static bool<br>
> +check_gs_query(struct gl_context *ctx, const struct gl_shader_program *shProg)<br>
> +{<br>
> +   if (shProg->LinkStatus &&<br>
> +       shProg->_LinkedShaders[MESA_SHADER_GEOMETRY] != NULL) {<br>
> +      return true;<br>
> +   }<br>
> +<br>
> +   _mesa_error(ctx, GL_INVALID_OPERATION,<br>
> +               "glGetProgramv(linked geometry shader required)");<br>
> +   return false;<br>
> +}<br>
> +<br>
> +<br>
> +/**<br>
>   * glGetProgramiv() - get shader program state.<br>
>   * Note that this is for GLSL shader programs, not ARB vertex/fragment<br>
>   * programs (see glGetProgramivARB).<br>
> @@ -477,9 +502,10 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, GLint *param<br>
>        || ctx->API == API_OPENGL_CORE<br>
>        || _mesa_is_gles3(ctx);<br>
><br>
> -   /* Are geometry shaders available in this context?<br>
> +   /* Are geometry shaders (of the form that was adopted into GLSL 1.50 and GL<br>
> +    * 3.2) available in this context?<br>
<br>
</div></div>I had to check just for my own understanding. The question here is not implying<br>
that there is still doubt by the author that something else should be checked<br>
along with version 3.2. Instead it is meant to be understood the same as "Check<br>
if geometry shaders (...) are available...", similarly as in case of<br>
'check_gs_query()' above, right?<br></blockquote><div><br></div><div>Yeah.  I agree that phrasing the comment in the form of a question is a little misleading here.  How about if I said this instead?</div><div><br>
</div><div>/* True if geometry shaders (of the form that was adopted into GLSL 1.50 and GL 3.2) are available in this context */</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div><div class="h5"><br>
>      */<br>
> -   const bool has_gs = _mesa_has_geometry_shaders(ctx);<br>
> +   const bool has_core_gs = _mesa_is_desktop_gl(ctx) && ctx->Version >= 32;<br>
><br>
>     /* Are uniform buffer objects available in this context?<br>
>      */<br>
> @@ -564,20 +590,23 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, GLint *param<br>
>           break;<br>
>        *params = shProg->TransformFeedback.BufferMode;<br>
>        return;<br>
> -   case GL_GEOMETRY_VERTICES_OUT_ARB:<br>
> -      if (!has_gs)<br>
> +   case GL_GEOMETRY_VERTICES_OUT:<br>
> +      if (!has_core_gs)<br>
>           break;<br>
> -      *params = shProg->Geom.VerticesOut;<br>
> +      if (check_gs_query(ctx, shProg))<br>
> +         *params = shProg->Geom.VerticesOut;<br>
>        return;<br>
> -   case GL_GEOMETRY_INPUT_TYPE_ARB:<br>
> -      if (!has_gs)<br>
> +   case GL_GEOMETRY_INPUT_TYPE:<br>
> +      if (!has_core_gs)<br>
>           break;<br>
> -      *params = shProg->Geom.InputType;<br>
> +      if (check_gs_query(ctx, shProg))<br>
> +         *params = shProg->Geom.InputType;<br>
>        return;<br>
> -   case GL_GEOMETRY_OUTPUT_TYPE_ARB:<br>
> -      if (!has_gs)<br>
> +   case GL_GEOMETRY_OUTPUT_TYPE:<br>
> +      if (!has_core_gs)<br>
>           break;<br>
> -      *params = shProg->Geom.OutputType;<br>
> +      if (check_gs_query(ctx, shProg))<br>
> +         *params = shProg->Geom.OutputType;<br>
>        return;<br>
>     case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH: {<br>
>        unsigned i;<br>
> @@ -1631,55 +1660,6 @@ _mesa_ProgramParameteri(GLuint program, GLenum pname, GLint value)<br>
>        return;<br>
><br>
>     switch (pname) {<br>
> -   case GL_GEOMETRY_VERTICES_OUT_ARB:<br>
> -      if (!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_geometry_shader4)<br>
> -         break;<br>
> -<br>
> -      if (value < 0 ||<br>
> -          (unsigned) value > ctx->Const.MaxGeometryOutputVertices) {<br>
> -         _mesa_error(ctx, GL_INVALID_VALUE,<br>
> -                     "glProgramParameteri(GL_GEOMETRY_VERTICES_OUT_ARB=%d)",<br>
> -                     value);<br>
> -         return;<br>
> -      }<br>
> -      shProg->Geom.VerticesOut = value;<br>
> -      return;<br>
> -   case GL_GEOMETRY_INPUT_TYPE_ARB:<br>
> -      if (!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_geometry_shader4)<br>
> -         break;<br>
> -<br>
> -      switch (value) {<br>
> -      case GL_POINTS:<br>
> -      case GL_LINES:<br>
> -      case GL_LINES_ADJACENCY_ARB:<br>
> -      case GL_TRIANGLES:<br>
> -      case GL_TRIANGLES_ADJACENCY_ARB:<br>
> -         shProg->Geom.InputType = value;<br>
> -         break;<br>
> -      default:<br>
> -         _mesa_error(ctx, GL_INVALID_VALUE,<br>
> -                     "glProgramParameteri(geometry input type = %s)",<br>
> -                     _mesa_lookup_enum_by_nr(value));<br>
> -         return;<br>
> -      }<br>
> -      return;<br>
> -   case GL_GEOMETRY_OUTPUT_TYPE_ARB:<br>
> -      if (!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_geometry_shader4)<br>
> -         break;<br>
> -<br>
> -      switch (value) {<br>
> -      case GL_POINTS:<br>
> -      case GL_LINE_STRIP:<br>
> -      case GL_TRIANGLE_STRIP:<br>
> -         shProg->Geom.OutputType = value;<br>
> -         break;<br>
> -      default:<br>
> -         _mesa_error(ctx, GL_INVALID_VALUE,<br>
> -                     "glProgramParameteri(geometry output type = %s)",<br>
> -                     _mesa_lookup_enum_by_nr(value));<br>
> -         return;<br>
> -      }<br>
> -      return;<br>
>     case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:<br>
>        /* This enum isn't part of the OES extension for OpenGL ES 2.0, but it<br>
>         * is part of OpenGL ES 3.0.  For the ES2 case, this function shouldn't<br>
> --<br>
> 1.8.4.1<br>
><br>
</div></div>> _______________________________________________<br>
> mesa-dev mailing list<br>
> <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> <a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div><br></div></div>