[Mesa-dev] [PATCH 07/14] mesa/varray: create get_array_format() helper
Timothy Arceri
tarceri at itsqueeze.com
Wed Apr 12 23:42:17 UTC 2017
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)
+{
+ 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);
--
2.9.3
More information about the mesa-dev
mailing list