[Mesa-dev] [PATCH 08/14] mesa/varray: rename update_array_format() -> validate_array_format()

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


On 04/12/2017 05:42 PM, Timothy Arceri wrote:
> We also move _mesa_update_array_format() into the caller.
>
> This gets these functions ready for KHR_no_error support.
> ---
>   src/mesa/main/varray.c | 68 +++++++++++++++++++++++++++++++-------------------
>   1 file changed, 43 insertions(+), 25 deletions(-)
>
> diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c
> index 353a614..f84b6cb 100644
> --- a/src/mesa/main/varray.c
> +++ b/src/mesa/main/varray.c
> @@ -330,31 +330,29 @@ _mesa_update_array_format(struct gl_context *ctx,
>    * \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 normalized   Whether integer types are 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 relativeOffset Offset of the first element relative to the binding offset.
>    */
>   static bool
> -update_array_format(struct gl_context *ctx,
> -                    const char *func,
> -                    struct gl_vertex_array_object *vao,
> -                    GLuint attrib, GLbitfield legalTypesMask,
> -                    GLint sizeMin, GLint sizeMax,
> -                    GLint size, GLenum type,
> -                    GLboolean normalized, GLboolean integer, GLboolean doubles,
> -                    GLuint relativeOffset)
> +validate_array_format(struct gl_context *ctx, const char *func,
> +                      struct gl_vertex_array_object *vao,
> +                      GLuint attrib, GLbitfield legalTypesMask,
> +                      GLint sizeMin, GLint sizeMax,
> +                      GLint size, GLenum type, GLboolean normalized,
> +                      GLboolean integer, GLboolean doubles,
> +                      GLuint relativeOffset, GLenum format)

I think you need to update the comment on the function if it no longer 
updates/changes the array attrib info.  Also, document if returning 
true/false means OK/error or error/OK.


>   {
>      GLbitfield typeBit;
> -   GLenum format = get_array_format(ctx, sizeMax, &size);
>
>      /* at most, one of these bools can be true */
>      assert((int) normalized + (int) integer + (int) doubles <= 1);
>
>      if (ctx->Array.LegalTypesMask == 0 || ctx->Array.LegalTypesMaskAPI != ctx->API) {
>         /* Compute the LegalTypesMask only once, unless the context API has
>          * changed, in which case we want to compute it again.  We can't do this
>          * in _mesa_init_varrays() below because extensions are not yet enabled
>          * at that point.
>          */
> @@ -434,23 +432,20 @@ update_array_format(struct gl_context *ctx,
>                     func, relativeOffset);
>         return false;
>      }
>
>      if (ctx->Extensions.ARB_vertex_type_10f_11f_11f_rev &&
>            type == GL_UNSIGNED_INT_10F_11F_11F_REV && size != 3) {
>         _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 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
> @@ -540,30 +535,35 @@ validate_array(struct gl_context *ctx, const char *func,
>   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;
> +   GLenum format = get_array_format(ctx, sizeMax, &size);
>
>      validate_array(ctx, func, attrib, legalTypesMask, sizeMin, sizeMax,
>                     size, type, stride, normalized, integer, doubles, ptr);
>
> -   if (!update_array_format(ctx, func, vao, attrib,
> -                            legalTypesMask, sizeMin, sizeMax,
> -                            size, type, normalized, integer, doubles, 0)) {
> +   if (!validate_array_format(ctx, func, vao, attrib,
> +                              legalTypesMask, sizeMin, sizeMax,
> +                              size, type, normalized, integer, doubles, 0,
> +                              format)) {
>         return;
>      }
>
> +   _mesa_update_array_format(ctx, vao, attrib, size, type, format,
> +                             normalized, integer, doubles, 0);
> +
>      /* Reset the vertex attrib binding */
>      vertex_attrib_binding(ctx, vao, attrib, attrib);
>
>      /* The Stride and Ptr fields are not set by update_array_format() */
>      struct gl_array_attributes *array = &vao->VertexAttrib[attrib];
>      array->Stride = stride;
>      array->Ptr = ptr;
>
>      /* Update the vertex buffer binding */
>      GLsizei effectiveStride = stride != 0 ? stride : array->_ElementSize;
> @@ -2018,26 +2018,28 @@ _mesa_VertexArrayVertexBuffers(GLuint vaobj, GLuint first, GLsizei count,
>      vertex_array_vertex_buffers(ctx, vao, first, count,
>                                  buffers, offsets, strides,
>                                  "glVertexArrayVertexBuffers");
>   }
>
>
>   static void
>   vertex_attrib_format(GLuint attribIndex, GLint size, GLenum type,
>                        GLboolean normalized, GLboolean integer,
>                        GLboolean doubles, GLbitfield legalTypes,
> -                     GLsizei maxSize, GLuint relativeOffset,
> +                     GLsizei sizeMax, GLuint relativeOffset,
>                        const char *func)
>   {
>      GET_CURRENT_CONTEXT(ctx);
>      ASSERT_OUTSIDE_BEGIN_END(ctx);
>
> +   GLenum format = get_array_format(ctx, sizeMax, &size);
> +
>      /* The ARB_vertex_attrib_binding spec says:
>       *
>       *    "An INVALID_OPERATION error is generated under any of the following
>       *     conditions:
>       *     - if no vertex array object is currently bound (see section 2.10);
>       *     - ..."
>       *
>       * This error condition only applies to VertexAttribFormat and
>       * VertexAttribIFormat in the extension spec, but we assume that this
>       * is an oversight.  In the OpenGL 4.3 (Core Profile) spec, it applies
> @@ -2058,24 +2060,32 @@ vertex_attrib_format(GLuint attribIndex, GLint size, GLenum type,
>      if (attribIndex >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
>         _mesa_error(ctx, GL_INVALID_VALUE,
>                     "%s(attribindex=%u > "
>                     "GL_MAX_VERTEX_ATTRIBS)",
>                     func, attribIndex);
>         return;
>      }
>
>      FLUSH_VERTICES(ctx, 0);
>
> -   update_array_format(ctx, func, ctx->Array.VAO,
> -                       VERT_ATTRIB_GENERIC(attribIndex),
> -                       legalTypes, 1, maxSize, size, type,
> -                       normalized, integer, doubles, relativeOffset);
> +   if (!validate_array_format(ctx, func, ctx->Array.VAO,
> +                              VERT_ATTRIB_GENERIC(attribIndex),
> +                              legalTypes, 1, sizeMax, size, type,
> +                              normalized, integer, doubles, relativeOffset,
> +                              format)) {
> +      return;
> +   }
> +
> +   _mesa_update_array_format(ctx, ctx->Array.VAO,
> +                             VERT_ATTRIB_GENERIC(attribIndex), size, type,
> +                             format, normalized, integer, doubles,
> +                             relativeOffset);
>   }
>
>
>   void GLAPIENTRY
>   _mesa_VertexAttribFormat(GLuint attribIndex, GLint size, GLenum type,
>                            GLboolean normalized, GLuint relativeOffset)
>   {
>      vertex_attrib_format(attribIndex, size, type, normalized,
>                           GL_FALSE, GL_FALSE, ATTRIB_FORMAT_TYPES_MASK,
>                           BGRA_OR_4, relativeOffset,
> @@ -2100,28 +2110,30 @@ _mesa_VertexAttribLFormat(GLuint attribIndex, GLint size, GLenum type,
>      vertex_attrib_format(attribIndex, size, type, GL_FALSE, GL_FALSE,
>                           GL_TRUE, ATTRIB_LFORMAT_TYPES_MASK, 4,
>                           relativeOffset, "glVertexAttribLFormat");
>   }
>
>
>   static void
>   vertex_array_attrib_format(GLuint vaobj, GLuint attribIndex, GLint size,
>                              GLenum type, GLboolean normalized,
>                              GLboolean integer, GLboolean doubles,
> -                           GLbitfield legalTypes, GLsizei maxSize,
> +                           GLbitfield legalTypes, GLsizei sizeMax,
>                              GLuint relativeOffset, const char *func)
>   {
>      GET_CURRENT_CONTEXT(ctx);
>      struct gl_vertex_array_object *vao;
>
>      ASSERT_OUTSIDE_BEGIN_END(ctx);
>
> +   GLenum format = get_array_format(ctx, sizeMax, &size);
> +
>      /* The ARB_direct_state_access spec says:
>       *
>       *   "An INVALID_OPERATION error is generated by VertexArrayAttrib*Format
>       *    if <vaobj> is not [compatibility profile: zero or] the name of an
>       *    existing vertex array object."
>       */
>      vao = _mesa_lookup_vao_err(ctx, vaobj, func);
>      if (!vao)
>         return;
>
> @@ -2132,24 +2144,30 @@ vertex_array_attrib_format(GLuint vaobj, GLuint attribIndex, GLint size,
>       */
>      if (attribIndex >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
>         _mesa_error(ctx, GL_INVALID_VALUE,
>                     "%s(attribindex=%u > GL_MAX_VERTEX_ATTRIBS)",
>                     func, attribIndex);
>         return;
>      }
>
>      FLUSH_VERTICES(ctx, 0);
>
> -   update_array_format(ctx, func, vao,
> -                       VERT_ATTRIB_GENERIC(attribIndex),
> -                       legalTypes, 1, maxSize, size, type, normalized,
> -                       integer, doubles, relativeOffset);
> +   if (!validate_array_format(ctx, func, vao,
> +                              VERT_ATTRIB_GENERIC(attribIndex),
> +                              legalTypes, 1, sizeMax, size, type, normalized,
> +                              integer, doubles, relativeOffset, format)) {
> +      return;
> +   }
> +
> +   _mesa_update_array_format(ctx, vao, VERT_ATTRIB_GENERIC(attribIndex), size,
> +                             type, format, normalized, integer, doubles,
> +                             relativeOffset);
>   }
>
>
>   void GLAPIENTRY
>   _mesa_VertexArrayAttribFormat(GLuint vaobj, GLuint attribIndex, GLint size,
>                                 GLenum type, GLboolean normalized,
>                                 GLuint relativeOffset)
>   {
>      vertex_array_attrib_format(vaobj, attribIndex, size, type, normalized,
>                                 GL_FALSE, GL_FALSE, ATTRIB_FORMAT_TYPES_MASK,
>



More information about the mesa-dev mailing list