[Mesa-dev] [PATCH 06/14] mesa/varray: split update_array() into validate_array() and update_array()

Brian Paul brianp at vmware.com
Thu Apr 13 02:54:55 UTC 2017


On 04/12/2017 05:42 PM, Timothy Arceri wrote:
> This will be used for adding KHR_no_error support.
> ---
>   src/mesa/main/varray.c | 55 +++++++++++++++++++++++++++++++++++++-------------
>   1 file changed, 41 insertions(+), 14 deletions(-)
>
> diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c
> index 233dc0d..65734df 100644
> --- a/src/mesa/main/varray.c
> +++ b/src/mesa/main/varray.c
> @@ -431,50 +431,45 @@ update_array_format(struct gl_context *ctx,
>         _mesa_error(ctx, GL_INVALID_OPERATION, "%s(size=%d)", func, size);
>         return false;
>      }
>
>      _mesa_update_array_format(ctx, vao, attrib, size, type, format,
>                                normalized, integer, doubles, relativeOffset);
>
>      return true;
>   }
>
> -
>   /**
> - * Do error checking and update state for glVertex/Color/TexCoord/...Pointer
> - * functions.
> + * Do error checking for glVertex/Color/TexCoord/...Pointer functions.
>    *
>    * \param func  name of calling function used for error reporting
>    * \param attrib  the attribute array index to update
>    * \param legalTypes  bitmask of *_BIT above indicating legal datatypes
>    * \param sizeMin  min allowable size value
>    * \param sizeMax  max allowable size value (may also be BGRA_OR_4)
>    * \param size  components per element (1, 2, 3 or 4)
>    * \param type  datatype of each component (GL_FLOAT, GL_INT, etc)
>    * \param stride  stride between elements, in elements
>    * \param normalized  are integer types converted to floats in [-1, 1]?
>    * \param integer  integer-valued values (will not be normalized to [-1,1])
>    * \param doubles  Double values not reduced to floats
>    * \param ptr  the address (or offset inside VBO) of the array data
>    */
>   static void
> -update_array(struct gl_context *ctx,
> -             const char *func,
> -             GLuint attrib, GLbitfield legalTypesMask,
> -             GLint sizeMin, GLint sizeMax,
> -             GLint size, GLenum type, GLsizei stride,
> -             GLboolean normalized, GLboolean integer, GLboolean doubles,
> -             const GLvoid *ptr)
> +validate_array(struct gl_context *ctx, const char *func,
> +               GLuint attrib, GLbitfield legalTypesMask,
> +               GLint sizeMin, GLint sizeMax,
> +               GLint size, GLenum type, GLsizei stride,
> +               GLboolean normalized, GLboolean integer, GLboolean doubles,
> +               const GLvoid *ptr)
>   {
>      struct gl_vertex_array_object *vao = ctx->Array.VAO;
> -   struct gl_array_attributes *array;
> -   GLsizei effectiveStride;
>
>      /* Page 407 (page 423 of the PDF) of the OpenGL 3.0 spec says:
>       *
>       *     "Client vertex arrays - all vertex array attribute pointers must
>       *     refer to buffer objects (section 2.9.2). The default vertex array
>       *     object (the name zero) is also deprecated. Calling
>       *     VertexAttribPointer when no buffer object or no vertex array object
>       *     is bound will generate an INVALID_OPERATION error..."
>       *
>       * The check for VBOs is handled below.
> @@ -507,37 +502,69 @@ update_array(struct gl_context *ctx,
>       *     * any of the *Pointer commands specifying the location and
>       *       organization of vertex array data are called while zero is bound
>       *       to the ARRAY_BUFFER buffer object binding point (see section
>       *       2.9.6), and the pointer argument is not NULL."
>       */
>      if (ptr != NULL && vao->ARBsemantics &&
>          !_mesa_is_bufferobj(ctx->Array.ArrayBufferObj)) {
>         _mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-VBO array)", func);
>         return;
>      }
> +}
> +
> +
> +/**
> + * Update state for glVertex/Color/TexCoord/...Pointer functions.
> + *
> + * \param func  name of calling function used for error reporting
> + * \param attrib  the attribute array index to update
> + * \param legalTypes  bitmask of *_BIT above indicating legal datatypes
> + * \param sizeMin  min allowable size value
> + * \param sizeMax  max allowable size value (may also be BGRA_OR_4)
> + * \param size  components per element (1, 2, 3 or 4)
> + * \param type  datatype of each component (GL_FLOAT, GL_INT, etc)
> + * \param stride  stride between elements, in elements
> + * \param normalized  are integer types converted to floats in [-1, 1]?
> + * \param integer  integer-valued values (will not be normalized to [-1,1])
> + * \param doubles  Double values not reduced to floats
> + * \param ptr  the address (or offset inside VBO) of the array data
> + */
> +static void
> +update_array(struct gl_context *ctx,
> +             const char *func,
> +             GLuint attrib, GLbitfield legalTypesMask,
> +             GLint sizeMin, GLint sizeMax,
> +             GLint size, GLenum type, GLsizei stride,
> +             GLboolean normalized, GLboolean integer, GLboolean doubles,
> +             const GLvoid *ptr)
> +{
> +   struct gl_vertex_array_object *vao = ctx->Array.VAO;
> +
> +   validate_array(ctx, func, attrib, legalTypesMask, sizeMin, sizeMax,
> +                  size, type, stride, normalized, integer, doubles, ptr);

Don't we need validate_array() to return a bool so that we can return 
here if an error was found?


>
>      if (!update_array_format(ctx, func, vao, attrib,
>                               legalTypesMask, sizeMin, sizeMax,
>                               size, type, normalized, integer, doubles, 0)) {
>         return;
>      }
>
>      /* Reset the vertex attrib binding */
>      vertex_attrib_binding(ctx, vao, attrib, attrib);
>
>      /* The Stride and Ptr fields are not set by update_array_format() */
> -   array = &vao->VertexAttrib[attrib];
> +   struct gl_array_attributes *array = &vao->VertexAttrib[attrib];
>      array->Stride = stride;
>      array->Ptr = ptr;
>
>      /* Update the vertex buffer binding */
> -   effectiveStride = stride != 0 ? stride : array->_ElementSize;
> +   GLsizei effectiveStride = stride != 0 ? stride : array->_ElementSize;
>      _mesa_bind_vertex_buffer(ctx, vao, attrib,
>                               ctx->Array.ArrayBufferObj, (GLintptr) ptr,
>                               effectiveStride);
>   }
>
>
>   void GLAPIENTRY
>   _mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
>   {
>      GET_CURRENT_CONTEXT(ctx);
>



More information about the mesa-dev mailing list