Make use of dispatch KHR_no_error support for varray functions. --- src/mapi/glapi/gen/ARB_vertex_attrib_64bit.xml | 2 +- src/mapi/glapi/gen/GL3x.xml | 3 +- src/mapi/glapi/gen/es_EXT.xml | 3 +- src/mapi/glapi/gen/gl_API.xml | 9 + src/mesa/main/varray.c | 492 ++++++++++++++++--------- src/mesa/main/varray.h | 40 +- 6 files changed, 369 insertions(+), 180 deletions(-)
diff --git a/src/mapi/glapi/gen/ARB_vertex_attrib_64bit.xml b/src/mapi/glapi/gen/ARB_vertex_attrib_64bit.xml index 211642f..6d76003 100644 --- a/src/mapi/glapi/gen/ARB_vertex_attrib_64bit.xml +++ b/src/mapi/glapi/gen/ARB_vertex_attrib_64bit.xml @@ -44,21 +44,21 @@ <function name="VertexAttribL3dv"> <param name="index" type="GLuint"/> <param name="v" type="const GLdouble *"/> </function> <function name="VertexAttribL4dv"> <param name="index" type="GLuint"/> <param name="v" type="const GLdouble *"/> </function> - <function name="VertexAttribLPointer"> + <function name="VertexAttribLPointer" no_error="true"> <param name="index" type="GLuint"/> <param name="size" type="GLint"/> <param name="type" type="GLenum"/> <param name="stride" type="GLsizei"/> <param name="pointer" type="const GLvoid *"/> </function> <function name="GetVertexAttribLdv"> <param name="index" type="GLuint"/> <param name="pname" type="GLenum"/> diff --git a/src/mapi/glapi/gen/GL3x.xml b/src/mapi/glapi/gen/GL3x.xml index f38a287..d2c768d 100644 --- a/src/mapi/glapi/gen/GL3x.xml +++ b/src/mapi/glapi/gen/GL3x.xml @@ -250,20 +250,21 @@ <param name="query" type="GLuint"/> <param name="mode" type="GLenum"/> </function> <function name="EndConditionalRender"> </function> <!-- These functions alias ones from GL_EXT_gpu_shader4 --> <function name="VertexAttribIPointer" es2="3.0" marshal="async" + no_error="true" marshal_fail="_mesa_glthread_is_non_vbo_vertex_attrib_pointer(ctx)"> <param name="index" type="GLuint"/> <param name="size" type="GLint"/> <param name="type" type="GLenum"/> <param name="stride" type="GLsizei"/> <param name="pointer" type="const GLvoid *"/> </function> <function name="GetVertexAttribIiv" es2="3.0"> <param name="index" type="GLuint"/> @@ -617,18 +618,18 @@ <category name="3.3"> <!-- There are other new functions and tokens defined by other extensions --> <enum name="TEXTURE_SWIZZLE_R" value="0x8E42"/> <enum name="TEXTURE_SWIZZLE_G" value="0x8E43"/> <enum name="TEXTURE_SWIZZLE_B" value="0x8E44"/> <enum name="TEXTURE_SWIZZLE_A" value="0x8E45"/> <enum name="TEXTURE_SWIZZLE_RGBA" value="0x8E46"/> - <function name="VertexAttribDivisor" es2="3.0"> + <function name="VertexAttribDivisor" es2="3.0" no_error="true"> <param name="index" type="GLuint"/> <param name="divisor" type="GLuint"/> </function> </category> </OpenGLAPI> diff --git a/src/mapi/glapi/gen/es_EXT.xml b/src/mapi/glapi/gen/es_EXT.xml index 3e705eb..271f0c0 100644 --- a/src/mapi/glapi/gen/es_EXT.xml +++ b/src/mapi/glapi/gen/es_EXT.xml @@ -311,21 +311,22 @@ </category> <!-- required for es1.1 --> <category name="GL_OES_point_size_array" number="14"> <enum name="POINT_SIZE_ARRAY_TYPE_OES" value="0x898A"/> <enum name="POINT_SIZE_ARRAY_STRIDE_OES" value="0x898B"/> <enum name="POINT_SIZE_ARRAY_POINTER_OES" value="0x898C"/> <enum name="POINT_SIZE_ARRAY_OES" value="0x8B9C"/> <enum name="POINT_SIZE_ARRAY_BUFFER_BINDING_OES" value="0x8B9F"/> - <function name="PointSizePointerOES" es1="1.0" desktop="false"> + <function name="PointSizePointerOES" es1="1.0" desktop="false" + no_error="true"> <param name="type" type="GLenum"/> <param name="stride" type="GLsizei"/> <param name="pointer" type="const GLvoid *"/> </function> </category> <!-- required for es1.1 --> <category name="GL_OES_point_sprite" number="15"> <enum name="POINT_SPRITE_OES" value="0x8861"/> <enum name="COORD_REPLACE_OES" value="0x8862"/> diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml index d19cfd2..83f4c01 100644 --- a/src/mapi/glapi/gen/gl_API.xml +++ b/src/mapi/glapi/gen/gl_API.xml @@ -3147,20 +3147,21 @@ <enum name="CLIENT_PIXEL_STORE_BIT" value="0x00000001"/> <enum name="CLIENT_VERTEX_ARRAY_BIT" value="0x00000002"/> <enum name="CLIENT_ALL_ATTRIB_BITS" value="0xFFFFFFFF"/> <function name="ArrayElement" deprecated="3.1" exec="dynamic" marshal="draw"> <param name="i" type="GLint"/> <glx handcode="true"/> </function> <function name="ColorPointer" es1="1.0" deprecated="3.1" marshal="async" + no_error="true" marshal_fail="_mesa_glthread_is_non_vbo_vertex_attrib_pointer(ctx)"> <param name="size" type="GLint"/> <param name="type" type="GLenum"/> <param name="stride" type="GLsizei"/> <param name="pointer" type="const GLvoid *"/> <glx handcode="true"/> </function> <function name="DisableClientState" es1="1.0" deprecated="3.1"> <param name="array" type="GLenum"/> @@ -3177,70 +3178,75 @@ <function name="DrawElements" es1="1.0" es2="2.0" exec="dynamic" marshal="draw" marshal_fail="_mesa_glthread_is_non_vbo_draw_elements(ctx)"> <param name="mode" type="GLenum"/> <param name="count" type="GLsizei"/> <param name="type" type="GLenum"/> <param name="indices" type="const GLvoid *"/> <glx handcode="true"/> </function> <function name="EdgeFlagPointer" deprecated="3.1" marshal="async" + no_error="true" marshal_fail="_mesa_glthread_is_non_vbo_vertex_attrib_pointer(ctx)"> <param name="stride" type="GLsizei"/> <param name="pointer" type="const GLvoid *"/> <glx handcode="true"/> </function> <function name="EnableClientState" es1="1.0" deprecated="3.1"> <param name="array" type="GLenum"/> <glx handcode="true"/> </function> <function name="GetPointerv" es1="1.1" es2="3.2"> <param name="pname" type="GLenum"/> <param name="params" type="GLvoid **" output="true"/> <glx handcode="true"/> </function> <function name="IndexPointer" deprecated="3.1" marshal="async" + no_error="true" marshal_fail="_mesa_glthread_is_non_vbo_vertex_attrib_pointer(ctx)"> <param name="type" type="GLenum"/> <param name="stride" type="GLsizei"/> <param name="pointer" type="const GLvoid *"/> <glx handcode="true"/> </function> <function name="InterleavedArrays" deprecated="3.1"> <param name="format" type="GLenum"/> <param name="stride" type="GLsizei"/> <param name="pointer" type="const GLvoid *"/> <glx handcode="true"/> </function> <function name="NormalPointer" es1="1.0" deprecated="3.1" marshal="async" + no_error="true" marshal_fail="_mesa_glthread_is_non_vbo_vertex_attrib_pointer(ctx)"> <param name="type" type="GLenum"/> <param name="stride" type="GLsizei"/> <param name="pointer" type="const GLvoid *"/> <glx handcode="true"/> </function> <function name="TexCoordPointer" es1="1.0" deprecated="3.1" marshal="async" + no_error="true" marshal_fail="_mesa_glthread_is_non_vbo_vertex_attrib_pointer(ctx)"> <param name="size" type="GLint"/> <param name="type" type="GLenum"/> <param name="stride" type="GLsizei"/> <param name="pointer" type="const GLvoid *"/> <glx handcode="true"/> </function> <function name="VertexPointer" es1="1.0" deprecated="3.1" marshal="async" + no_error="true" marshal_fail="_mesa_glthread_is_non_vbo_vertex_attrib_pointer(ctx)"> <param name="size" type="GLint"/> <param name="type" type="GLenum"/> <param name="stride" type="GLsizei"/> <param name="pointer" type="const GLvoid *"/> <glx handcode="true"/> </function> <function name="PolygonOffset" es1="1.0" es2="2.0"> <param name="factor" type="GLfloat"/> @@ -4718,20 +4724,21 @@ <function name="FogCoordd" deprecated="3.1"> <param name="coord" type="GLdouble"/> </function> <function name="FogCoorddv" deprecated="3.1"> <param name="coord" type="const GLdouble *" count="1"/> <glx rop="4125"/> </function> <function name="FogCoordPointer" deprecated="3.1" marshal="async" + no_error="true" marshal_fail="_mesa_glthread_is_non_vbo_vertex_attrib_pointer(ctx)"> <param name="type" type="GLenum"/> <param name="stride" type="GLsizei"/> <param name="pointer" type="const GLvoid *"/> <glx handcode="true"/> </function> <function name="MultiDrawArrays" marshal="draw"> <param name="mode" type="GLenum"/> <param name="first" type="const GLint *"/> @@ -4855,20 +4862,21 @@ <param name="green" type="GLushort"/> <param name="blue" type="GLushort"/> </function> <function name="SecondaryColor3usv" deprecated="3.1"> <param name="v" type="const GLushort *" count="3"/> <glx rop="4132"/> </function> <function name="SecondaryColorPointer" deprecated="3.1" marshal="async" + no_error="true" marshal_fail="_mesa_glthread_is_non_vbo_vertex_attrib_pointer(ctx)"> <param name="size" type="GLint"/> <param name="type" type="GLenum"/> <param name="stride" type="GLsizei"/> <param name="pointer" type="const GLvoid *"/> <glx handcode="true"/> </function> <function name="WindowPos2d" deprecated="3.1"> <param name="x" type="GLdouble"/> @@ -5810,20 +5818,21 @@ <param name="v" type="const GLuint *" count="4"/> <glx rop="4234"/> </function> <function name="VertexAttrib4usv"> <param name="index" type="GLuint"/> <param name="v" type="const GLushort *" count="4"/> <glx rop="4233"/> </function> <function name="VertexAttribPointer" es2="2.0" marshal="async" + no_error="true" marshal_fail="_mesa_glthread_is_non_vbo_vertex_attrib_pointer(ctx)"> <param name="index" type="GLuint"/> <param name="size" type="GLint"/> <param name="type" type="GLenum"/> <param name="normalized" type="GLboolean"/> <param name="stride" type="GLsizei"/> <param name="pointer" type="const GLvoid *"/> <glx handcode="true"/> </function> diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c index 709f6d4..eda86ec 100644 --- a/src/mesa/main/varray.c +++ b/src/mesa/main/varray.c @@ -570,374 +570,496 @@ update_array(struct gl_context *ctx, array->Stride = stride; array->Ptr = ptr; /* Update the vertex buffer binding */ GLsizei effectiveStride = stride != 0 ? stride : array->_ElementSize; _mesa_bind_vertex_buffer(ctx, vao, attrib, ctx->Array.ArrayBufferObj, (GLintptr) ptr, effectiveStride); } +void GLAPIENTRY +_mesa_VertexPointer_no_error(GLint size, GLenum type, GLsizei stride, + const GLvoid *ptr) +{ + GET_CURRENT_CONTEXT(ctx); + FLUSH_VERTICES(ctx, 0); + + update_array(ctx, VERT_ATTRIB_POS, GL_RGBA, 4, size, type, stride, + GL_FALSE, GL_FALSE, GL_FALSE, ptr); +} + void GLAPIENTRY _mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); GLenum format = GL_RGBA; - if (!_mesa_is_no_error_enabled(ctx)) { - GLbitfield legalTypes = (ctx->API == API_OPENGLES) - ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT) - : (SHORT_BIT | INT_BIT | FLOAT_BIT | - DOUBLE_BIT | HALF_BIT | - UNSIGNED_INT_2_10_10_10_REV_BIT | - INT_2_10_10_10_REV_BIT); - - if (!validate_array_and_format(ctx, "glVertexPointer", VERT_ATTRIB_POS, - legalTypes, 2, 4, size, type, stride, - GL_FALSE, GL_FALSE, GL_FALSE, format, - ptr, ctx->Array.VAO)) - return; - } + GLbitfield legalTypes = (ctx->API == API_OPENGLES) + ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT) + : (SHORT_BIT | INT_BIT | FLOAT_BIT | + DOUBLE_BIT | HALF_BIT | + UNSIGNED_INT_2_10_10_10_REV_BIT | + INT_2_10_10_10_REV_BIT); + + if (!validate_array_and_format(ctx, "glVertexPointer", VERT_ATTRIB_POS, + legalTypes, 2, 4, size, type, stride, + GL_FALSE, GL_FALSE, GL_FALSE, format, + ptr, ctx->Array.VAO)) + return; update_array(ctx, VERT_ATTRIB_POS, format, 4, size, type, stride, GL_FALSE, GL_FALSE, GL_FALSE, ptr); } void GLAPIENTRY +_mesa_NormalPointer_no_error(GLenum type, GLsizei stride, const GLvoid *ptr ) +{ + GET_CURRENT_CONTEXT(ctx); + FLUSH_VERTICES(ctx, 0); + + update_array(ctx, VERT_ATTRIB_NORMAL, GL_RGBA, 3, 3, type, stride, GL_TRUE, + GL_FALSE, GL_FALSE, ptr); +} + + +void GLAPIENTRY _mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); GLenum format = GL_RGBA; - if (!_mesa_is_no_error_enabled(ctx)) { - const GLbitfield legalTypes = (ctx->API == API_OPENGLES) - ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT) - : (BYTE_BIT | SHORT_BIT | INT_BIT | - HALF_BIT | FLOAT_BIT | DOUBLE_BIT | - UNSIGNED_INT_2_10_10_10_REV_BIT | - INT_2_10_10_10_REV_BIT); - - if (!validate_array_and_format(ctx, "glNormalPointer", - VERT_ATTRIB_NORMAL, legalTypes, 3, 3, 3, - type, stride, GL_TRUE, GL_FALSE, - GL_FALSE, format, ptr, ctx->Array.VAO)) - return; - } + const GLbitfield legalTypes = (ctx->API == API_OPENGLES) + ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT) + : (BYTE_BIT | SHORT_BIT | INT_BIT | + HALF_BIT | FLOAT_BIT | DOUBLE_BIT | + UNSIGNED_INT_2_10_10_10_REV_BIT | + INT_2_10_10_10_REV_BIT); + + if (!validate_array_and_format(ctx, "glNormalPointer", + VERT_ATTRIB_NORMAL, legalTypes, 3, 3, 3, + type, stride, GL_TRUE, GL_FALSE, + GL_FALSE, format, ptr, ctx->Array.VAO)) + return; update_array(ctx, VERT_ATTRIB_NORMAL, format, 3, 3, type, stride, GL_TRUE, GL_FALSE, GL_FALSE, ptr); } void GLAPIENTRY +_mesa_ColorPointer_no_error(GLint size, GLenum type, GLsizei stride, + const GLvoid *ptr) +{ + GET_CURRENT_CONTEXT(ctx); + FLUSH_VERTICES(ctx, 0); + + GLenum format = get_array_format(ctx, BGRA_OR_4, &size); + update_array(ctx, VERT_ATTRIB_COLOR0, format, BGRA_OR_4, size, + type, stride, GL_TRUE, GL_FALSE, GL_FALSE, ptr); +} + + +void GLAPIENTRY _mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); const GLint sizeMin = (ctx->API == API_OPENGLES) ? 4 : 3; FLUSH_VERTICES(ctx, 0); GLenum format = get_array_format(ctx, BGRA_OR_4, &size); - if (!_mesa_is_no_error_enabled(ctx)) { - const GLbitfield legalTypes = (ctx->API == API_OPENGLES) - ? (UNSIGNED_BYTE_BIT | HALF_BIT | FLOAT_BIT | FIXED_ES_BIT) - : (BYTE_BIT | UNSIGNED_BYTE_BIT | - SHORT_BIT | UNSIGNED_SHORT_BIT | - INT_BIT | UNSIGNED_INT_BIT | - HALF_BIT | FLOAT_BIT | DOUBLE_BIT | - UNSIGNED_INT_2_10_10_10_REV_BIT | - INT_2_10_10_10_REV_BIT); - - if (!validate_array_and_format(ctx, "glColorPointer", - VERT_ATTRIB_COLOR0, legalTypes, sizeMin, - BGRA_OR_4, size, type, stride, GL_TRUE, - GL_FALSE, GL_FALSE, format, ptr, - ctx->Array.VAO)) - return; - } + const GLbitfield legalTypes = (ctx->API == API_OPENGLES) + ? (UNSIGNED_BYTE_BIT | HALF_BIT | FLOAT_BIT | FIXED_ES_BIT) + : (BYTE_BIT | UNSIGNED_BYTE_BIT | + SHORT_BIT | UNSIGNED_SHORT_BIT | + INT_BIT | UNSIGNED_INT_BIT | + HALF_BIT | FLOAT_BIT | DOUBLE_BIT | + UNSIGNED_INT_2_10_10_10_REV_BIT | + INT_2_10_10_10_REV_BIT); + + if (!validate_array_and_format(ctx, "glColorPointer", + VERT_ATTRIB_COLOR0, legalTypes, sizeMin, + BGRA_OR_4, size, type, stride, GL_TRUE, + GL_FALSE, GL_FALSE, format, ptr, + ctx->Array.VAO)) + return; update_array(ctx, VERT_ATTRIB_COLOR0, format, BGRA_OR_4, size, type, stride, GL_TRUE, GL_FALSE, GL_FALSE, ptr); } void GLAPIENTRY +_mesa_FogCoordPointer_no_error(GLenum type, GLsizei stride, const GLvoid *ptr) +{ + GET_CURRENT_CONTEXT(ctx); + FLUSH_VERTICES(ctx, 0); + + update_array(ctx, VERT_ATTRIB_FOG, GL_RGBA, 1, 1, type, stride, GL_FALSE, + GL_FALSE, GL_FALSE, ptr); +} + + +void GLAPIENTRY _mesa_FogCoordPointer(GLenum type, GLsizei stride, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); GLenum format = GL_RGBA; - if (!_mesa_is_no_error_enabled(ctx)) { - const GLbitfield legalTypes = (HALF_BIT | FLOAT_BIT | DOUBLE_BIT); + const GLbitfield legalTypes = (HALF_BIT | FLOAT_BIT | DOUBLE_BIT); - if (!validate_array_and_format(ctx, "glFogCoordPointer", - VERT_ATTRIB_FOG, legalTypes, 1, 1, 1, - type, stride, GL_FALSE, GL_FALSE, - GL_FALSE, format, ptr, ctx->Array.VAO)) - return; - } + if (!validate_array_and_format(ctx, "glFogCoordPointer", + VERT_ATTRIB_FOG, legalTypes, 1, 1, 1, + type, stride, GL_FALSE, GL_FALSE, + GL_FALSE, format, ptr, ctx->Array.VAO)) + return; update_array(ctx, VERT_ATTRIB_FOG, format, 1, 1, type, stride, GL_FALSE, GL_FALSE, GL_FALSE, ptr); } void GLAPIENTRY +_mesa_IndexPointer_no_error(GLenum type, GLsizei stride, const GLvoid *ptr) +{ + GET_CURRENT_CONTEXT(ctx); + FLUSH_VERTICES(ctx, 0); + + update_array(ctx, VERT_ATTRIB_COLOR_INDEX, GL_RGBA, 1, 1, type, stride, + GL_FALSE, GL_FALSE, GL_FALSE, ptr); +} + + +void GLAPIENTRY _mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); GLenum format = GL_RGBA; - if (!_mesa_is_no_error_enabled(ctx)) { - const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT | INT_BIT | + const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT | INT_BIT | FLOAT_BIT | DOUBLE_BIT); - if (!validate_array_and_format(ctx, "glIndexPointer", - VERT_ATTRIB_COLOR_INDEX, - legalTypes, 1, 1, 1, type, stride, - GL_FALSE, GL_FALSE, GL_FALSE, format, - ptr, ctx->Array.VAO)) - return; - } + if (!validate_array_and_format(ctx, "glIndexPointer", + VERT_ATTRIB_COLOR_INDEX, + legalTypes, 1, 1, 1, type, stride, + GL_FALSE, GL_FALSE, GL_FALSE, format, + ptr, ctx->Array.VAO)) + return; update_array(ctx, VERT_ATTRIB_COLOR_INDEX, format, 1, 1, type, stride, GL_FALSE, GL_FALSE, GL_FALSE, ptr); } void GLAPIENTRY +_mesa_SecondaryColorPointer_no_error(GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr) +{ + GET_CURRENT_CONTEXT(ctx); + FLUSH_VERTICES(ctx, 0); + + GLenum format = get_array_format(ctx, BGRA_OR_4, &size); + update_array(ctx, VERT_ATTRIB_COLOR1, format, BGRA_OR_4, size, type, + stride, GL_TRUE, GL_FALSE, GL_FALSE, ptr); +} + + +void GLAPIENTRY _mesa_SecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); GLenum format = get_array_format(ctx, BGRA_OR_4, &size); - if (!_mesa_is_no_error_enabled(ctx)) { - const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | - SHORT_BIT | UNSIGNED_SHORT_BIT | - INT_BIT | UNSIGNED_INT_BIT | - HALF_BIT | FLOAT_BIT | DOUBLE_BIT | - UNSIGNED_INT_2_10_10_10_REV_BIT | - INT_2_10_10_10_REV_BIT); - - if (!validate_array_and_format(ctx, "glSecondaryColorPointer", - VERT_ATTRIB_COLOR1, legalTypes, 3, - BGRA_OR_4, size, type, stride, - GL_TRUE, GL_FALSE, GL_FALSE, format, ptr, - ctx->Array.VAO)) - return; - } + const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | + SHORT_BIT | UNSIGNED_SHORT_BIT | + INT_BIT | UNSIGNED_INT_BIT | + HALF_BIT | FLOAT_BIT | DOUBLE_BIT | + UNSIGNED_INT_2_10_10_10_REV_BIT | + INT_2_10_10_10_REV_BIT); + + if (!validate_array_and_format(ctx, "glSecondaryColorPointer", + VERT_ATTRIB_COLOR1, legalTypes, 3, + BGRA_OR_4, size, type, stride, + GL_TRUE, GL_FALSE, GL_FALSE, format, ptr, + ctx->Array.VAO)) + return; update_array(ctx, VERT_ATTRIB_COLOR1, format, BGRA_OR_4, size, type, stride, GL_TRUE, GL_FALSE, GL_FALSE, ptr); } void GLAPIENTRY +_mesa_TexCoordPointer_no_error(GLint size, GLenum type, GLsizei stride, + const GLvoid *ptr) +{ + GET_CURRENT_CONTEXT(ctx); + const GLuint unit = ctx->Array.ActiveTexture; + FLUSH_VERTICES(ctx, 0); + + update_array(ctx, VERT_ATTRIB_TEX(unit), GL_RGBA, 4, size, type, + stride, GL_FALSE, GL_FALSE, GL_FALSE, ptr); +} + + +void GLAPIENTRY _mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); const GLint sizeMin = (ctx->API == API_OPENGLES) ? 2 : 1; const GLuint unit = ctx->Array.ActiveTexture; FLUSH_VERTICES(ctx, 0); GLenum format = GL_RGBA; - if (!_mesa_is_no_error_enabled(ctx)) { - const GLbitfield legalTypes = (ctx->API == API_OPENGLES) - ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT) - : (SHORT_BIT | INT_BIT | - HALF_BIT | FLOAT_BIT | DOUBLE_BIT | - UNSIGNED_INT_2_10_10_10_REV_BIT | - INT_2_10_10_10_REV_BIT); - - if (!validate_array_and_format(ctx, "glTexCoordPointer", - VERT_ATTRIB_TEX(unit), legalTypes, - sizeMin, 4, size, type, stride, - GL_FALSE, GL_FALSE, GL_FALSE, format, ptr, - ctx->Array.VAO)) - return; - } + const GLbitfield legalTypes = (ctx->API == API_OPENGLES) + ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT) + : (SHORT_BIT | INT_BIT | + HALF_BIT | FLOAT_BIT | DOUBLE_BIT | + UNSIGNED_INT_2_10_10_10_REV_BIT | + INT_2_10_10_10_REV_BIT); + + if (!validate_array_and_format(ctx, "glTexCoordPointer", + VERT_ATTRIB_TEX(unit), legalTypes, + sizeMin, 4, size, type, stride, + GL_FALSE, GL_FALSE, GL_FALSE, format, ptr, + ctx->Array.VAO)) + return; update_array(ctx, VERT_ATTRIB_TEX(unit), format, 4, size, type, stride, GL_FALSE, GL_FALSE, GL_FALSE, ptr); } void GLAPIENTRY +_mesa_EdgeFlagPointer_no_error(GLsizei stride, const GLvoid *ptr) +{ + /* this is the same type that glEdgeFlag uses */ + const GLboolean integer = GL_FALSE; + GET_CURRENT_CONTEXT(ctx); + FLUSH_VERTICES(ctx, 0); + + update_array(ctx, VERT_ATTRIB_EDGEFLAG, GL_RGBA, 1, 1, GL_UNSIGNED_BYTE, + stride, GL_FALSE, integer, GL_FALSE, ptr); +} + + +void GLAPIENTRY _mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr) { /* this is the same type that glEdgeFlag uses */ const GLboolean integer = GL_FALSE; GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); GLenum format = GL_RGBA; - if (!_mesa_is_no_error_enabled(ctx)) { - const GLbitfield legalTypes = UNSIGNED_BYTE_BIT; + const GLbitfield legalTypes = UNSIGNED_BYTE_BIT; - if (!validate_array_and_format(ctx, "glEdgeFlagPointer", - VERT_ATTRIB_EDGEFLAG, legalTypes, - 1, 1, 1, GL_UNSIGNED_BYTE, stride, - GL_FALSE, integer, GL_FALSE, format, ptr, - ctx->Array.VAO)) - return; - } + if (!validate_array_and_format(ctx, "glEdgeFlagPointer", + VERT_ATTRIB_EDGEFLAG, legalTypes, + 1, 1, 1, GL_UNSIGNED_BYTE, stride, + GL_FALSE, integer, GL_FALSE, format, ptr, + ctx->Array.VAO)) + return; update_array(ctx, VERT_ATTRIB_EDGEFLAG, format, 1, 1, GL_UNSIGNED_BYTE, stride, GL_FALSE, integer, GL_FALSE, ptr); } void GLAPIENTRY +_mesa_PointSizePointerOES_no_error(GLenum type, GLsizei stride, + const GLvoid *ptr) +{ + GET_CURRENT_CONTEXT(ctx); + FLUSH_VERTICES(ctx, 0); + + update_array(ctx, VERT_ATTRIB_POINT_SIZE, GL_RGBA, 1, 1, type, stride, + GL_FALSE, GL_FALSE, GL_FALSE, ptr); +} + + +void GLAPIENTRY _mesa_PointSizePointerOES(GLenum type, GLsizei stride, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); GLenum format = GL_RGBA; - if (!_mesa_is_no_error_enabled(ctx)) { - if (ctx->API != API_OPENGLES) { - _mesa_error(ctx, GL_INVALID_OPERATION, - "glPointSizePointer(ES 1.x only)"); - return; - } + if (ctx->API != API_OPENGLES) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glPointSizePointer(ES 1.x only)"); + return; + } - const GLbitfield legalTypes = (FLOAT_BIT | FIXED_ES_BIT); + const GLbitfield legalTypes = (FLOAT_BIT | FIXED_ES_BIT); - if (!validate_array_and_format(ctx, "glPointSizePointer", - VERT_ATTRIB_POINT_SIZE, legalTypes, - 1, 1, 1, type, stride, GL_FALSE, GL_FALSE, - GL_FALSE, format, ptr, ctx->Array.VAO)) - return; - } + if (!validate_array_and_format(ctx, "glPointSizePointer", + VERT_ATTRIB_POINT_SIZE, legalTypes, + 1, 1, 1, type, stride, GL_FALSE, GL_FALSE, + GL_FALSE, format, ptr, ctx->Array.VAO)) + return; update_array(ctx, VERT_ATTRIB_POINT_SIZE, format, 1, 1, type, stride, GL_FALSE, GL_FALSE, GL_FALSE, ptr); } +void GLAPIENTRY +_mesa_VertexAttribPointer_no_error(GLuint index, GLint size, GLenum type, + GLboolean normalized, + GLsizei stride, const GLvoid *ptr) +{ + GET_CURRENT_CONTEXT(ctx); + + GLenum format = get_array_format(ctx, BGRA_OR_4, &size); + update_array(ctx, VERT_ATTRIB_GENERIC(index), format, BGRA_OR_4, + size, type, stride, normalized, GL_FALSE, GL_FALSE, ptr); +} + + /** * Set a generic vertex attribute array. * Note that these arrays DO NOT alias the conventional GL vertex arrays * (position, normal, color, fog, texcoord, etc). */ void GLAPIENTRY _mesa_VertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); GLenum format = get_array_format(ctx, BGRA_OR_4, &size); - if (!_mesa_is_no_error_enabled(ctx)) { - if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) { - _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(idx)"); - return; - } - - 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_ES_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); - - if (!validate_array_and_format(ctx, "glVertexAttribPointer", - VERT_ATTRIB_GENERIC(index), legalTypes, - 1, BGRA_OR_4, size, type, stride, - normalized, GL_FALSE, GL_FALSE, format, - ptr, ctx->Array.VAO)) - return; + if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) { + _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(idx)"); + return; } + 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_ES_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); + + if (!validate_array_and_format(ctx, "glVertexAttribPointer", + VERT_ATTRIB_GENERIC(index), legalTypes, + 1, BGRA_OR_4, size, type, stride, + normalized, GL_FALSE, GL_FALSE, format, + ptr, ctx->Array.VAO)) + return; + update_array(ctx, VERT_ATTRIB_GENERIC(index), format, BGRA_OR_4, size, type, stride, normalized, GL_FALSE, GL_FALSE, ptr); } +void GLAPIENTRY +_mesa_VertexAttribIPointer_no_error(GLuint index, GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr) +{ + const GLboolean normalized = GL_FALSE; + const GLboolean integer = GL_TRUE; + GET_CURRENT_CONTEXT(ctx); + + update_array(ctx, VERT_ATTRIB_GENERIC(index), GL_RGBA, 4, size, type, + stride, normalized, integer, GL_FALSE, ptr); +} + + /** * GL_EXT_gpu_shader4 / GL 3.0. * Set an integer-valued vertex attribute array. * Note that these arrays DO NOT alias the conventional GL vertex arrays * (position, normal, color, fog, texcoord, etc). */ void GLAPIENTRY _mesa_VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) { const GLboolean normalized = GL_FALSE; const GLboolean integer = GL_TRUE; GET_CURRENT_CONTEXT(ctx); GLenum format = GL_RGBA; - if (!_mesa_is_no_error_enabled(ctx)) { - if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) { - _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribIPointer(index)"); - return; - } + if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) { + _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribIPointer(index)"); + return; + } - const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | - SHORT_BIT | UNSIGNED_SHORT_BIT | - INT_BIT | UNSIGNED_INT_BIT); + const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | + SHORT_BIT | UNSIGNED_SHORT_BIT | + INT_BIT | UNSIGNED_INT_BIT); - if (!validate_array_and_format(ctx, "glVertexAttribIPointer", - VERT_ATTRIB_GENERIC(index), legalTypes, - 1, 4, size, type, stride, - normalized, integer, GL_FALSE, format, - ptr, ctx->Array.VAO)) - return; - } + if (!validate_array_and_format(ctx, "glVertexAttribIPointer", + VERT_ATTRIB_GENERIC(index), legalTypes, + 1, 4, size, type, stride, + normalized, integer, GL_FALSE, format, + ptr, ctx->Array.VAO)) + return; update_array(ctx, VERT_ATTRIB_GENERIC(index), format, 4, size, type, stride, normalized, integer, GL_FALSE, ptr); } + +void GLAPIENTRY +_mesa_VertexAttribLPointer_no_error(GLuint index, GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr) +{ + GET_CURRENT_CONTEXT(ctx); + + update_array(ctx, VERT_ATTRIB_GENERIC(index), GL_RGBA, 4, size, type, + stride, GL_FALSE, GL_FALSE, GL_TRUE, ptr); +} + + void GLAPIENTRY _mesa_VertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); GLenum format = GL_RGBA; - if (!_mesa_is_no_error_enabled(ctx)) { - if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) { - _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribLPointer(index)"); - return; - } + if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) { + _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribLPointer(index)"); + return; + } - const GLbitfield legalTypes = DOUBLE_BIT; + const GLbitfield legalTypes = DOUBLE_BIT; - if (!validate_array_and_format(ctx, "glVertexAttribLPointer", - VERT_ATTRIB_GENERIC(index), legalTypes, - 1, 4, size, type, stride, - GL_FALSE, GL_FALSE, GL_TRUE, format, - ptr, ctx->Array.VAO)) - return; - } + if (!validate_array_and_format(ctx, "glVertexAttribLPointer", + VERT_ATTRIB_GENERIC(index), legalTypes, + 1, 4, size, type, stride, + GL_FALSE, GL_FALSE, GL_TRUE, format, + ptr, ctx->Array.VAO)) + return; update_array(ctx, VERT_ATTRIB_GENERIC(index), format, 4, size, type, stride, GL_FALSE, GL_FALSE, GL_TRUE, ptr); } void _mesa_enable_vertex_array_attrib(struct gl_context *ctx, struct gl_vertex_array_object *vao, unsigned attrib) @@ -1752,44 +1874,68 @@ _mesa_PrimitiveRestartIndex(GLuint index) return; } if (ctx->Array.RestartIndex != index) { FLUSH_VERTICES(ctx, _NEW_TRANSFORM); ctx->Array.RestartIndex = index; } } +void GLAPIENTRY +_mesa_VertexAttribDivisor_no_error(GLuint index, GLuint divisor) +{ + GET_CURRENT_CONTEXT(ctx); + + const GLuint genericIndex = VERT_ATTRIB_GENERIC(index); + struct gl_vertex_array_object * const vao = ctx->Array.VAO; + + assert(genericIndex < ARRAY_SIZE(vao->VertexAttrib)); + + /* The ARB_vertex_attrib_binding spec says: + * + * "The command + * + * void VertexAttribDivisor(uint index, uint divisor); + * + * is equivalent to (assuming no errors are generated): + * + * VertexAttribBinding(index, index); + * VertexBindingDivisor(index, divisor);" + */ + vertex_attrib_binding(ctx, vao, genericIndex, genericIndex); + vertex_binding_divisor(ctx, vao, genericIndex, divisor); +} + + /** * See GL_ARB_instanced_arrays. * Note that the instance divisor only applies to generic arrays, not * the legacy vertex arrays. */ void GLAPIENTRY _mesa_VertexAttribDivisor(GLuint index, GLuint divisor) { GET_CURRENT_CONTEXT(ctx); const GLuint genericIndex = VERT_ATTRIB_GENERIC(index); struct gl_vertex_array_object * const vao = ctx->Array.VAO; - if (!_mesa_is_no_error_enabled(ctx)) { - if (!ctx->Extensions.ARB_instanced_arrays) { - _mesa_error(ctx, GL_INVALID_OPERATION, "glVertexAttribDivisor()"); - return; - } + if (!ctx->Extensions.ARB_instanced_arrays) { + _mesa_error(ctx, GL_INVALID_OPERATION, "glVertexAttribDivisor()"); + return; + } - if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) { - _mesa_error(ctx, GL_INVALID_VALUE, - "glVertexAttribDivisor(index = %u)", index); - return; - } + if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) { + _mesa_error(ctx, GL_INVALID_VALUE, + "glVertexAttribDivisor(index = %u)", index); + return; } assert(genericIndex < ARRAY_SIZE(vao->VertexAttrib)); /* The ARB_vertex_attrib_binding spec says: * * "The command * * void VertexAttribDivisor(uint index, uint divisor); * diff --git a/src/mesa/main/varray.h b/src/mesa/main/varray.h index d274ec5..ac49434 100644 --- a/src/mesa/main/varray.h +++ b/src/mesa/main/varray.h @@ -102,42 +102,55 @@ _mesa_enable_vertex_array_attrib(struct gl_context *ctx, unsigned attrib); extern void _mesa_bind_vertex_buffer(struct gl_context *ctx, struct gl_vertex_array_object *vao, GLuint index, struct gl_buffer_object *vbo, GLintptr offset, GLsizei stride); extern void GLAPIENTRY +_mesa_VertexPointer_no_error(GLint size, GLenum type, GLsizei stride, + const GLvoid *ptr); +extern void GLAPIENTRY _mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr); - +extern void GLAPIENTRY +_mesa_NormalPointer_no_error(GLenum type, GLsizei stride, const GLvoid *ptr); extern void GLAPIENTRY _mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr); - +extern void GLAPIENTRY +_mesa_ColorPointer_no_error(GLint size, GLenum type, GLsizei stride, + const GLvoid *ptr); extern void GLAPIENTRY _mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr); extern void GLAPIENTRY +_mesa_IndexPointer_no_error(GLenum type, GLsizei stride, const GLvoid *ptr); +extern void GLAPIENTRY _mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr); extern void GLAPIENTRY +_mesa_TexCoordPointer_no_error(GLint size, GLenum type, GLsizei stride, + const GLvoid *ptr); +extern void GLAPIENTRY _mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr); extern void GLAPIENTRY +_mesa_EdgeFlagPointer_no_error(GLsizei stride, const GLvoid *ptr); +extern void GLAPIENTRY _mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr); extern void GLAPIENTRY _mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr); extern void GLAPIENTRY _mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, @@ -155,44 +168,62 @@ _mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count, extern void GLAPIENTRY _mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr); extern void GLAPIENTRY _mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr); - +extern void GLAPIENTRY +_mesa_FogCoordPointer_no_error(GLenum type, GLsizei stride, + const GLvoid *ptr); extern void GLAPIENTRY _mesa_FogCoordPointer(GLenum type, GLsizei stride, const GLvoid *ptr); extern void GLAPIENTRY +_mesa_SecondaryColorPointer_no_error(GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr); +extern void GLAPIENTRY _mesa_SecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr); extern void GLAPIENTRY +_mesa_PointSizePointerOES_no_error(GLenum type, GLsizei stride, + const GLvoid *ptr); +extern void GLAPIENTRY _mesa_PointSizePointerOES(GLenum type, GLsizei stride, const GLvoid *ptr); extern void GLAPIENTRY +_mesa_VertexAttribPointer_no_error(GLuint index, GLint size, GLenum type, + GLboolean normalized, GLsizei stride, + const GLvoid *pointer); +extern void GLAPIENTRY _mesa_VertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); void GLAPIENTRY +_mesa_VertexAttribIPointer_no_error(GLuint index, GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr); +void GLAPIENTRY _mesa_VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *ptr); extern void GLAPIENTRY +_mesa_VertexAttribLPointer_no_error(GLuint index, GLint size, GLenum type, + GLsizei stride, const GLvoid *pointer); +extern void GLAPIENTRY _mesa_VertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); extern void GLAPIENTRY _mesa_EnableVertexAttribArray(GLuint index); extern void GLAPIENTRY _mesa_EnableVertexArrayAttrib(GLuint vaobj, GLuint index); @@ -300,21 +331,22 @@ _mesa_DrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); extern void GLAPIENTRY _mesa_DrawTransformFeedback(GLenum mode, GLuint name); extern void GLAPIENTRY _mesa_PrimitiveRestartIndex(GLuint index); - +extern void GLAPIENTRY +_mesa_VertexAttribDivisor_no_error(GLuint index, GLuint divisor); extern void GLAPIENTRY _mesa_VertexAttribDivisor(GLuint index, GLuint divisor); extern unsigned _mesa_primitive_restart_index(const struct gl_context *ctx, unsigned index_size); extern void GLAPIENTRY _mesa_BindVertexBuffer(GLuint bindingIndex, GLuint buffer, GLintptr offset, GLsizei stride); -- 2.9.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev