[Mesa-dev] [PATCH 10/22] mesa: Refactor VertexAttrib[I|L]Format
Laura Ekstrand
laura at jlekstrand.net
Fri Mar 20 15:37:09 PDT 2015
On Wed, Mar 18, 2015 at 4:18 PM, Fredrik Höglund <fredrik at kde.org> wrote:
> The only difference between these functions is the legal types and
> sizes, so consolidate the code into a single vertex_attrib_format()
> function and call it from all three entry points.
> ---
> src/mesa/main/varray.c | 143
> +++++++++++++++----------------------------------
> 1 file changed, 43 insertions(+), 100 deletions(-)
>
> diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c
> index 5f58016..a6b66a0 100644
> --- a/src/mesa/main/varray.c
> +++ b/src/mesa/main/varray.c
> @@ -66,6 +66,21 @@
> #define UNSIGNED_INT_10F_11F_11F_REV_BIT (1 << 14)
> #define ALL_TYPE_BITS ((1 << 15) - 1)
>
> +#define ATTRIB_FORMAT_TYPES_MASK (BYTE_BIT | UNSIGNED_BYTE_BIT | \
> + SHORT_BIT | UNSIGNED_SHORT_BIT | \
> + INT_BIT | UNSIGNED_INT_BIT | \
> + HALF_BIT | FLOAT_BIT | DOUBLE_BIT | \
> + FIXED_GL_BIT | \
> + UNSIGNED_INT_2_10_10_10_REV_BIT | \
> + INT_2_10_10_10_REV_BIT | \
> + UNSIGNED_INT_10F_11F_11F_REV_BIT)
> +
> +#define ATTRIB_IFORMAT_TYPES_MASK (BYTE_BIT | UNSIGNED_BYTE_BIT | \
> + SHORT_BIT | UNSIGNED_SHORT_BIT | \
> + INT_BIT | UNSIGNED_INT_BIT)
> +
> +#define ATTRIB_LFORMAT_TYPES_MASK DOUBLE_BIT
> +
>
> /** Convert GL datatype enum into a <type>_BIT value seen above */
> static GLbitfield
> @@ -1739,19 +1754,12 @@ _mesa_VertexArrayVertexBuffers(GLuint vaobj,
> GLuint first, GLsizei count,
> }
>
>
> -void GLAPIENTRY
> -_mesa_VertexAttribFormat(GLuint attribIndex, GLint size, GLenum type,
> - GLboolean normalized, GLuint relativeOffset)
> +static void
> +vertex_attrib_format(GLuint attribIndex, GLint size, GLenum type,
> + GLboolean normalized, GLboolean integer,
> + GLbitfield legalTypes, GLsizei maxSize,
> + GLuint relativeOffset, const char *func)
> {
> - const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
> - SHORT_BIT | UNSIGNED_SHORT_BIT |
> - INT_BIT | UNSIGNED_INT_BIT |
> - HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
> - FIXED_GL_BIT |
> - UNSIGNED_INT_2_10_10_10_REV_BIT |
> - INT_2_10_10_10_REV_BIT |
> - UNSIGNED_INT_10F_11F_11F_REV_BIT);
> -
> GET_CURRENT_CONTEXT(ctx);
> ASSERT_OUTSIDE_BEGIN_END(ctx);
>
> @@ -1765,7 +1773,7 @@ _mesa_VertexAttribFormat(GLuint attribIndex, GLint
> size, GLenum type,
> if (ctx->API == API_OPENGL_CORE &&
> ctx->Array.VAO == ctx->Array.DefaultVAO) {
> _mesa_error(ctx, GL_INVALID_OPERATION,
> - "glVertexAttribFormat(No array object bound)");
> + "%s(No array object bound)", func);
> return;
> }
>
> @@ -1776,65 +1784,38 @@ _mesa_VertexAttribFormat(GLuint attribIndex, GLint
> size, GLenum type,
> */
> if (attribIndex >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
> _mesa_error(ctx, GL_INVALID_VALUE,
> - "glVertexAttribFormat(attribindex=%u > "
> + "%s(attribindex=%u > "
> "GL_MAX_VERTEX_ATTRIBS)",
> - attribIndex);
> + func, attribIndex);
> return;
> }
>
> FLUSH_VERTICES(ctx, 0);
>
> - update_array_format(ctx, "glVertexAttribFormat",
> - VERT_ATTRIB_GENERIC(attribIndex),
> - legalTypes, 1, BGRA_OR_4, size, type, normalized,
> - GL_FALSE, relativeOffset);
> + update_array_format(ctx, func, VERT_ATTRIB_GENERIC(attribIndex),
> + legalTypes, 1, maxSize, size, type, normalized,
> + integer, relativeOffset);
> }
>
>
> void GLAPIENTRY
> -_mesa_VertexAttribIFormat(GLuint attribIndex, GLint size, GLenum type,
> - GLuint relativeOffset)
> +_mesa_VertexAttribFormat(GLuint attribIndex, GLint size, GLenum type,
> + GLboolean normalized, GLuint relativeOffset)
> {
> - const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
> - SHORT_BIT | UNSIGNED_SHORT_BIT |
> - INT_BIT | UNSIGNED_INT_BIT);
> -
> - GET_CURRENT_CONTEXT(ctx);
> - ASSERT_OUTSIDE_BEGIN_END(ctx);
> -
> - /* 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);
> - * - ..."
> - */
> - if (ctx->API == API_OPENGL_CORE &&
> - ctx->Array.VAO == ctx->Array.DefaultVAO) {
> - _mesa_error(ctx, GL_INVALID_OPERATION,
> - "glVertexAttribIFormat(No array object bound)");
> - return;
> - }
> -
> - /* The ARB_vertex_attrib_binding spec says:
> - *
> - * "The error INVALID_VALUE is generated if index is greater than
> - * or equal to the value of MAX_VERTEX_ATTRIBS."
> - */
> - if (attribIndex >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
> - _mesa_error(ctx, GL_INVALID_VALUE,
> - "glVertexAttribIFormat(attribindex=%u > "
> - "GL_MAX_VERTEX_ATTRIBS)",
> - attribIndex);
> - return;
> - }
> + vertex_attrib_format(attribIndex, size, type, normalized,
> + GL_FALSE, ATTRIB_FORMAT_TYPES_MASK,
> + BGRA_OR_4, relativeOffset,
> + "glVertexAttribFormat");
> +}
>
> - FLUSH_VERTICES(ctx, 0);
>
> - update_array_format(ctx, "glVertexAttribIFormat",
> - VERT_ATTRIB_GENERIC(attribIndex),
> - legalTypes, 1, 4, size, type, GL_FALSE, GL_TRUE,
> - relativeOffset);
> +void GLAPIENTRY
> +_mesa_VertexAttribIFormat(GLuint attribIndex, GLint size, GLenum type,
> + GLuint relativeOffset)
> +{
> + vertex_attrib_format(attribIndex, size, type, GL_FALSE,
> + GL_TRUE, ATTRIB_IFORMAT_TYPES_MASK, 4,
> + relativeOffset, "glVertexAttribIFormat");
> }
>
>
> @@ -1842,47 +1823,9 @@ void GLAPIENTRY
> _mesa_VertexAttribLFormat(GLuint attribIndex, GLint size, GLenum type,
> GLuint relativeOffset)
> {
> - const GLbitfield legalTypes = DOUBLE_BIT;
> -
> - GET_CURRENT_CONTEXT(ctx);
> - ASSERT_OUTSIDE_BEGIN_END(ctx);
> -
> - /* Page 298 of the PDF of the OpenGL 4.3 (Core Profile) spec says:
> - *
> - * "An INVALID_OPERATION error is generated under any of the
> following
> - * conditions:
> - * • if no vertex array object is currently bound (see section
> 10.4);
> - * • ..."
> - *
>
The comment below is missing in your new version ("we assume that this is
an oversight").
> - * This language is missing from the extension spec, but we assume
> - * that this is an oversight.
> - */
> - if (ctx->API == API_OPENGL_CORE &&
> - ctx->Array.VAO == ctx->Array.DefaultVAO) {
> - _mesa_error(ctx, GL_INVALID_OPERATION,
> - "glVertexAttribLFormat(No array object bound)");
> - return;
> - }
> -
> - /* The ARB_vertex_attrib_binding spec says:
> - *
> - * "The error INVALID_VALUE is generated if <attribindex> is greater
> than
> - * or equal to the value of MAX_VERTEX_ATTRIBS."
> - */
> - if (attribIndex >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
> - _mesa_error(ctx, GL_INVALID_VALUE,
> - "glVertexAttribLFormat(attribindex=%u > "
> - "GL_MAX_VERTEX_ATTRIBS)",
> - attribIndex);
> - return;
> - }
> -
> - FLUSH_VERTICES(ctx, 0);
> -
> - update_array_format(ctx, "glVertexAttribLFormat",
> - VERT_ATTRIB_GENERIC(attribIndex),
> - legalTypes, 1, 4, size, type, GL_FALSE, GL_FALSE,
> - relativeOffset);
> + vertex_attrib_format(attribIndex, size, type, GL_FALSE,
> + GL_FALSE, ATTRIB_LFORMAT_TYPES_MASK, 4,
> + relativeOffset, "glVertexAttribLFormat");
> }
>
>
> --
> 1.8.5.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150320/080ad78d/attachment-0001.html>
More information about the mesa-dev
mailing list