[Mesa-dev] [PATCH] mesa: check glBegin()/glDrawArrays()/etc mode with _mesa_valid_prim_mode()

Yuanhan Liu yuanhan.liu at linux.intel.com
Tue Sep 20 18:54:36 PDT 2011


On Tue, Sep 20, 2011 at 08:51:45AM -0600, Brian Paul wrote:
> From: Brian Paul <brianp at vmware.com>
> 
> We now raise an GL_INVALID_ENUM in glBegin() if mode is illegal, as was
> done in Yuanhan Liu's original patch.
> 
> Take geometry shaders support into account too.
> ---
>  src/mesa/main/api_validate.c |   31 ++++++++++++++++++++++++++-----
>  src/mesa/main/api_validate.h |    5 +++++
>  src/mesa/main/dlist.c        |    5 +++--
>  src/mesa/vbo/vbo_exec_api.c  |    7 +++++++
>  4 files changed, 41 insertions(+), 7 deletions(-)
> 
> diff --git a/src/mesa/main/api_validate.c b/src/mesa/main/api_validate.c
> index 699b414..1fcf5cd 100644
> --- a/src/mesa/main/api_validate.c
> +++ b/src/mesa/main/api_validate.c
> @@ -199,6 +199,27 @@ check_index_bounds(struct gl_context *ctx, GLsizei count, GLenum type,
>  
>  
>  /**
> + * Is 'mode' a valid value for glBegin(), glDrawArrays(), glDrawElements(),
> + * etc?  The set of legal values depends on whether geometry shaders/programs
> + * are supported.
> + */
> +GLboolean
> +_mesa_valid_prim_mode(const struct gl_context *ctx, GLenum mode)
> +{
> +   if (ctx->Extensions.ARB_geometry_shader4 &&
> +       mode > GL_TRIANGLE_STRIP_ADJACENCY_ARB) {
> +      return GL_FALSE;
> +   }
> +   else if (mode > GL_POLYGON) {
> +      return GL_FALSE;
> +   }
> +   else {
> +      return GL_TRUE;
> +   }
> +}
> +
> +
> +/**
>   * Error checking for glDrawElements().  Includes parameter checking
>   * and VBO bounds checking.
>   * \return GL_TRUE if OK to render, GL_FALSE if error found
> @@ -216,7 +237,7 @@ _mesa_validate_DrawElements(struct gl_context *ctx,
>        return GL_FALSE;
>     }
>  
> -   if (mode > GL_TRIANGLE_STRIP_ADJACENCY_ARB) {
> +   if (!_mesa_valid_prim_mode(ctx, mode)) {
>        _mesa_error(ctx, GL_INVALID_ENUM, "glDrawElements(mode)" );
>        return GL_FALSE;
>     }
> @@ -273,7 +294,7 @@ _mesa_validate_DrawRangeElements(struct gl_context *ctx, GLenum mode,
>        return GL_FALSE;
>     }
>  
> -   if (mode > GL_TRIANGLE_STRIP_ADJACENCY_ARB) {
> +   if (!_mesa_valid_prim_mode(ctx, mode)) {
>        _mesa_error(ctx, GL_INVALID_ENUM, "glDrawRangeElements(mode)" );
>        return GL_FALSE;
>     }
> @@ -332,7 +353,7 @@ _mesa_validate_DrawArrays(struct gl_context *ctx,
>        return GL_FALSE;
>     }
>  
> -   if (mode > GL_TRIANGLE_STRIP_ADJACENCY_ARB) {
> +   if (!_mesa_valid_prim_mode(ctx, mode)) {
>        _mesa_error(ctx, GL_INVALID_ENUM, "glDrawArrays(mode)" );
>        return GL_FALSE;
>     }
> @@ -362,7 +383,7 @@ _mesa_validate_DrawArraysInstanced(struct gl_context *ctx, GLenum mode, GLint fi
>        return GL_FALSE;
>     }
>  
> -   if (mode > GL_TRIANGLE_STRIP_ADJACENCY_ARB) {
> +   if (!_mesa_valid_prim_mode(ctx, mode)) {
>        _mesa_error(ctx, GL_INVALID_ENUM,
>                    "glDrawArraysInstanced(mode=0x%x)", mode);
>        return GL_FALSE;
> @@ -408,7 +429,7 @@ _mesa_validate_DrawElementsInstanced(struct gl_context *ctx,
>        return GL_FALSE;
>     }
>  
> -   if (mode > GL_TRIANGLE_STRIP_ADJACENCY_ARB) {
> +   if (!_mesa_valid_prim_mode(ctx, mode)) {
>        _mesa_error(ctx, GL_INVALID_ENUM,
>                    "glDrawElementsInstanced(mode = 0x%x)", mode);
>        return GL_FALSE;
> diff --git a/src/mesa/main/api_validate.h b/src/mesa/main/api_validate.h
> index 09e9522..7d6a660 100644
> --- a/src/mesa/main/api_validate.h
> +++ b/src/mesa/main/api_validate.h
> @@ -39,6 +39,11 @@ _mesa_max_buffer_index(struct gl_context *ctx, GLuint count, GLenum type,
>                         const void *indices,
>                         struct gl_buffer_object *elementBuf);
>  
> +
> +extern GLboolean
> +_mesa_valid_prim_mode(const struct gl_context *ctx, GLenum mode);
> +
> +
>  extern GLboolean
>  _mesa_validate_DrawArrays(struct gl_context *ctx,
>  			  GLenum mode, GLint start, GLsizei count);
> diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c
> index 9bba521..f11dae9 100644
> --- a/src/mesa/main/dlist.c
> +++ b/src/mesa/main/dlist.c
> @@ -34,6 +34,7 @@
>  #include "api_arrayelt.h"
>  #include "api_exec.h"
>  #include "api_loopback.h"
> +#include "api_validate.h"
>  #if FEATURE_ATI_fragment_shader
>  #include "atifragshader.h"
>  #endif
> @@ -5762,8 +5763,8 @@ save_Begin(GLenum mode)
>     Node *n;
>     GLboolean error = GL_FALSE;
>  
> -   if ( /*mode < GL_POINTS || */ mode > GL_POLYGON) {
> -      _mesa_compile_error(ctx, GL_INVALID_ENUM, "Begin (mode)");
> +   if (!_mesa_valid_prim_mode(ctx, mode)) {
> +      _mesa_compile_error(ctx, GL_INVALID_ENUM, "glBegin(mode)");
>        error = GL_TRUE;
>     }
>     else if (ctx->Driver.CurrentSavePrimitive == PRIM_UNKNOWN) {
> diff --git a/src/mesa/vbo/vbo_exec_api.c b/src/mesa/vbo/vbo_exec_api.c
> index cad7c46..150589b 100644
> --- a/src/mesa/vbo/vbo_exec_api.c
> +++ b/src/mesa/vbo/vbo_exec_api.c
> @@ -42,6 +42,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
>  #include "main/light.h"
>  #include "main/api_arrayelt.h"
>  #include "main/api_noop.h"
> +#include "main/api_validate.h"
>  #include "main/dispatch.h"
>  
>  #include "vbo_context.h"
> @@ -552,6 +553,7 @@ static void GLAPIENTRY vbo_exec_EvalPoint2( GLint i, GLint j )
>  #endif /* FEATURE_evaluators */
>  
>  
> +
>  /**
>   * Called via glBegin.
>   */
> @@ -563,6 +565,11 @@ static void GLAPIENTRY vbo_exec_Begin( GLenum mode )
>        struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
>        int i;
>  
> +      if (!_mesa_valid_prim_mode(ctx, mode)) {
> +         _mesa_error(ctx, GL_INVALID_ENUM, "glBegin");
> +         return;
> +      }
> +

Sorry, shouldn't we add the mode validation after the if(ctx->NewState)
code block to make sure the previous states are updated?


Thanks,
Yuanhan Liu

>        if (ctx->NewState) {
>  	 _mesa_update_state( ctx );
>  
> -- 
> 1.7.3.4
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list