mesa/varray: add KHR_no_error support to some callers of validate_array_format()

The only caller we don't update is update_arrays(), we leave that to the
following commit.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
Timothy Arceri 2017-03-31 15:26:34 +11:00
parent c495c2398c
commit d86dd5963e

View file

@ -2016,48 +2016,51 @@ vertex_attrib_format(GLuint attribIndex, GLint size, GLenum type,
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
* to all three functions.
*/
if ((ctx->API == API_OPENGL_CORE || _mesa_is_gles31(ctx)) &&
ctx->Array.VAO == ctx->Array.DefaultVAO) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"%s(No array object bound)", func);
return;
}
if (!_mesa_is_no_error_enabled(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);
* - ..."
*
* 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
* to all three functions.
*/
if ((ctx->API == API_OPENGL_CORE || _mesa_is_gles31(ctx)) &&
ctx->Array.VAO == ctx->Array.DefaultVAO) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"%s(No array object bound)", func);
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,
"%s(attribindex=%u > "
"GL_MAX_VERTEX_ATTRIBS)",
func, attribIndex);
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,
"%s(attribindex=%u > "
"GL_MAX_VERTEX_ATTRIBS)",
func, attribIndex);
return;
}
if (!validate_array_format(ctx, func, ctx->Array.VAO,
VERT_ATTRIB_GENERIC(attribIndex),
legalTypes, 1, sizeMax, size, type,
normalized, integer, doubles, relativeOffset,
format)) {
return;
}
}
FLUSH_VERTICES(ctx, 0);
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,
@ -2110,37 +2113,44 @@ vertex_array_attrib_format(GLuint vaobj, GLuint attribIndex, GLint size,
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;
if (_mesa_is_no_error_enabled(ctx)) {
vao = _mesa_lookup_vao(ctx, vaobj);
if (!vao)
return;
} else {
/* 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;
/* 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,
"%s(attribindex=%u > GL_MAX_VERTEX_ATTRIBS)",
func, attribIndex);
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,
"%s(attribindex=%u > GL_MAX_VERTEX_ATTRIBS)",
func, attribIndex);
return;
}
if (!validate_array_format(ctx, func, vao,
VERT_ATTRIB_GENERIC(attribIndex),
legalTypes, 1, sizeMax, size, type,
normalized, integer, doubles, relativeOffset,
format)) {
return;
}
}
FLUSH_VERTICES(ctx, 0);
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);