[Mesa-dev] [PATCH 07/14] mesa/varray: create get_array_format() helper
Brian Paul
brianp at vmware.com
Thu Apr 13 02:54:59 UTC 2017
On 04/12/2017 05:42 PM, Timothy Arceri wrote:
> This will help us split array validation from array update.
> ---
> src/mesa/main/varray.c | 31 ++++++++++++++++++++-----------
> 1 file changed, 20 insertions(+), 11 deletions(-)
>
> diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c
> index 65734df..353a614 100644
> --- a/src/mesa/main/varray.c
> +++ b/src/mesa/main/varray.c
> @@ -251,20 +251,38 @@ get_legal_types_mask(const struct gl_context *ctx)
> legalTypesMask &= ~(UNSIGNED_INT_2_10_10_10_REV_BIT |
> INT_2_10_10_10_REV_BIT);
>
> if (!ctx->Extensions.ARB_vertex_type_10f_11f_11f_rev)
> legalTypesMask &= ~UNSIGNED_INT_10F_11F_11F_REV_BIT;
> }
>
> return legalTypesMask;
> }
>
> +static GLenum
> +get_array_format(struct gl_context *ctx, GLint sizeMax, GLint *size)
const ctx
> +{
> + GLenum format = GL_RGBA;
> +
> + /* Do size parameter checking.
> + * If sizeMax = BGRA_OR_4 it means that size = GL_BGRA is legal and
> + * must be handled specially.
> + */
> + if (ctx->Extensions.EXT_vertex_array_bgra && sizeMax == BGRA_OR_4 &&
> + *size == GL_BGRA) {
> + format = GL_BGRA;
> + *size = 4;
> + }
> +
> + return format;
> +}
> +
>
> /**
> * \param attrib The index of the attribute array
> * \param size Components per element (1, 2, 3 or 4)
> * \param type Datatype of each component (GL_FLOAT, GL_INT, etc)
> * \param format Either GL_RGBA or GL_BGRA.
> * \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
> @@ -322,21 +340,21 @@ 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)
> {
> GLbitfield typeBit;
> - GLenum format = GL_RGBA;
> + 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.
> */
> @@ -352,27 +370,21 @@ update_array_format(struct gl_context *ctx,
> sizeMax = 4;
> }
>
> typeBit = type_to_bit(ctx, type);
> if (typeBit == 0x0 || (typeBit & legalTypesMask) == 0x0) {
> _mesa_error(ctx, GL_INVALID_ENUM, "%s(type = %s)",
> func, _mesa_enum_to_string(type));
> return false;
> }
>
> - /* Do size parameter checking.
> - * If sizeMax = BGRA_OR_4 it means that size = GL_BGRA is legal and
> - * must be handled specially.
> - */
> - if (ctx->Extensions.EXT_vertex_array_bgra &&
> - sizeMax == BGRA_OR_4 &&
> - size == GL_BGRA) {
> + if (format == GL_BGRA) {
> /* 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:
> * ...
> * • size is BGRA and type is not UNSIGNED_BYTE, INT_2_10_10_10_REV
> * or UNSIGNED_INT_2_10_10_10_REV;
> * ...
> * • size is BGRA and normalized is FALSE;"
> */
> @@ -390,23 +402,20 @@ update_array_format(struct gl_context *ctx,
> _mesa_error(ctx, GL_INVALID_OPERATION, "%s(size=GL_BGRA and type=%s)",
> func, _mesa_enum_to_string(type));
> return false;
> }
>
> if (!normalized) {
> _mesa_error(ctx, GL_INVALID_OPERATION,
> "%s(size=GL_BGRA and normalized=GL_FALSE)", func);
> return false;
> }
> -
> - format = GL_BGRA;
> - size = 4;
> }
> else if (size < sizeMin || size > sizeMax || size > 4) {
> _mesa_error(ctx, GL_INVALID_VALUE, "%s(size=%d)", func, size);
> return false;
> }
>
> if (ctx->Extensions.ARB_vertex_type_2_10_10_10_rev &&
> (type == GL_UNSIGNED_INT_2_10_10_10_REV ||
> type == GL_INT_2_10_10_10_REV) && size != 4) {
> _mesa_error(ctx, GL_INVALID_OPERATION, "%s(size=%d)", func, size);
>
More information about the mesa-dev
mailing list