On 04/25/2014 11:23 AM, Anuj Phogat wrote: > In OpenGL 3.1 attribute 0 becomes non-magic, just like in > OpenGL ES 2.0. Earlier versions of OpenGL used attribute 0 > exclusively for vertex position. > > V2: Add a utility function _mesa_attr_zero_aliases_vertex() in > varray.h > > Fixes 4 Khronos OpenGL CTS failures: > glGetVertexAttrib > depth24_basic > depth24_precision > rgb8_rgba8_rgb > > Cc: <mesa-sta...@lists.freedesktop.org> > Signed-off-by: Anuj Phogat <anuj.pho...@gmail.com>
Apologies for not replying to your previous reply (before sending the updated patch). I have two nits below. With those fixed, Reviewed-by: Ian Romanick <ian.d.roman...@intel.com> > --- > src/mesa/main/varray.c | 8 +------- > src/mesa/main/varray.h | 14 ++++++++++++++ > src/mesa/vbo/vbo_attrib_tmp.h | 45 > ++++++++++++++++++++++--------------------- > 3 files changed, 38 insertions(+), 29 deletions(-) > > diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c > index 66a3ef1..81f71f8 100644 > --- a/src/mesa/main/varray.c > +++ b/src/mesa/main/varray.c > @@ -784,13 +784,7 @@ static const GLfloat * > get_current_attrib(struct gl_context *ctx, GLuint index, const char > *function) > { > if (index == 0) { > - /* In OpenGL 3.1 attribute 0 becomes non-magic, just like in OpenGL ES > - * 2.0. Note that we cannot just check for API_OPENGL_CORE here > because > - * that will erroneously allow this usage in a 3.0 forward-compatible > - * context too. > - */ > - if ((ctx->API != API_OPENGL_CORE || ctx->Version < 31) > - && ctx->API != API_OPENGLES2) { > + if (_mesa_attr_zero_aliases_vertex(ctx)) { > _mesa_error(ctx, GL_INVALID_OPERATION, "%s(index==0)", function); > return NULL; > } > diff --git a/src/mesa/main/varray.h b/src/mesa/main/varray.h > index bc820ed..555eb28 100644 > --- a/src/mesa/main/varray.h > +++ b/src/mesa/main/varray.h > @@ -106,6 +106,20 @@ _mesa_update_client_array(struct gl_context *ctx, > _mesa_reference_buffer_object(ctx, &dst->BufferObj, binding->BufferObj); > } > > +static inline bool > +_mesa_attr_zero_aliases_vertex(struct gl_context *ctx) { The { goes on its own line. > + const bool is_forward_compatible_context = > + ctx->Const.ContextFlags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT; Add a blank line here. > + /* In OpenGL 3.1 attribute 0 becomes non-magic, just like in OpenGL ES > + * 2.0. Note that we cannot just check for API_OPENGL_COMPAT here because > + * that will erroneously allow this usage in a 3.0 forward-compatible > + * context too. > + */ > + return (ctx->API == API_OPENGLES > + || (ctx->API == API_OPENGL_COMPAT > + && !is_forward_compatible_context)); > +} > + > extern void GLAPIENTRY > _mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, > const GLvoid *ptr); > diff --git a/src/mesa/vbo/vbo_attrib_tmp.h b/src/mesa/vbo/vbo_attrib_tmp.h > index a2ea6d0..ec66934 100644 > --- a/src/mesa/vbo/vbo_attrib_tmp.h > +++ b/src/mesa/vbo/vbo_attrib_tmp.h > @@ -26,6 +26,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. > **************************************************************************/ > > #include "util/u_format_r11g11b10f.h" > +#include "main/varray.h" > > /* float */ > #define ATTR1FV( A, V ) ATTR( A, 1, GL_FLOAT, (V)[0], 0, 0, 1 ) > @@ -499,7 +500,7 @@ static void GLAPIENTRY > TAG(VertexAttrib1fARB)(GLuint index, GLfloat x) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR1F(0, x); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR1F(VBO_ATTRIB_GENERIC0 + index, x); > @@ -511,7 +512,7 @@ static void GLAPIENTRY > TAG(VertexAttrib1fvARB)(GLuint index, const GLfloat * v) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR1FV(0, v); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR1FV(VBO_ATTRIB_GENERIC0 + index, v); > @@ -523,7 +524,7 @@ static void GLAPIENTRY > TAG(VertexAttrib2fARB)(GLuint index, GLfloat x, GLfloat y) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR2F(0, x, y); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR2F(VBO_ATTRIB_GENERIC0 + index, x, y); > @@ -535,7 +536,7 @@ static void GLAPIENTRY > TAG(VertexAttrib2fvARB)(GLuint index, const GLfloat * v) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR2FV(0, v); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR2FV(VBO_ATTRIB_GENERIC0 + index, v); > @@ -547,7 +548,7 @@ static void GLAPIENTRY > TAG(VertexAttrib3fARB)(GLuint index, GLfloat x, GLfloat y, GLfloat z) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR3F(0, x, y, z); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR3F(VBO_ATTRIB_GENERIC0 + index, x, y, z); > @@ -559,7 +560,7 @@ static void GLAPIENTRY > TAG(VertexAttrib3fvARB)(GLuint index, const GLfloat * v) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR3FV(0, v); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR3FV(VBO_ATTRIB_GENERIC0 + index, v); > @@ -571,7 +572,7 @@ static void GLAPIENTRY > TAG(VertexAttrib4fARB)(GLuint index, GLfloat x, GLfloat y, GLfloat z, > GLfloat w) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR4F(0, x, y, z, w); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR4F(VBO_ATTRIB_GENERIC0 + index, x, y, z, w); > @@ -583,7 +584,7 @@ static void GLAPIENTRY > TAG(VertexAttrib4fvARB)(GLuint index, const GLfloat * v) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR4FV(0, v); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR4FV(VBO_ATTRIB_GENERIC0 + index, v); > @@ -600,7 +601,7 @@ static void GLAPIENTRY > TAG(VertexAttribI1i)(GLuint index, GLint x) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR1I(0, x); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR1I(VBO_ATTRIB_GENERIC0 + index, x); > @@ -612,7 +613,7 @@ static void GLAPIENTRY > TAG(VertexAttribI2i)(GLuint index, GLint x, GLint y) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR2I(0, x, y); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR2I(VBO_ATTRIB_GENERIC0 + index, x, y); > @@ -624,7 +625,7 @@ static void GLAPIENTRY > TAG(VertexAttribI3i)(GLuint index, GLint x, GLint y, GLint z) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR3I(0, x, y, z); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR3I(VBO_ATTRIB_GENERIC0 + index, x, y, z); > @@ -636,7 +637,7 @@ static void GLAPIENTRY > TAG(VertexAttribI4i)(GLuint index, GLint x, GLint y, GLint z, GLint w) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR4I(0, x, y, z, w); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR4I(VBO_ATTRIB_GENERIC0 + index, x, y, z, w); > @@ -648,7 +649,7 @@ static void GLAPIENTRY > TAG(VertexAttribI2iv)(GLuint index, const GLint *v) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR2IV(0, v); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR2IV(VBO_ATTRIB_GENERIC0 + index, v); > @@ -660,7 +661,7 @@ static void GLAPIENTRY > TAG(VertexAttribI3iv)(GLuint index, const GLint *v) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR3IV(0, v); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR3IV(VBO_ATTRIB_GENERIC0 + index, v); > @@ -672,7 +673,7 @@ static void GLAPIENTRY > TAG(VertexAttribI4iv)(GLuint index, const GLint *v) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR4IV(0, v); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR4IV(VBO_ATTRIB_GENERIC0 + index, v); > @@ -689,7 +690,7 @@ static void GLAPIENTRY > TAG(VertexAttribI1ui)(GLuint index, GLuint x) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR1UI(0, x); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR1UI(VBO_ATTRIB_GENERIC0 + index, x); > @@ -701,7 +702,7 @@ static void GLAPIENTRY > TAG(VertexAttribI2ui)(GLuint index, GLuint x, GLuint y) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR2UI(0, x, y); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR2UI(VBO_ATTRIB_GENERIC0 + index, x, y); > @@ -713,7 +714,7 @@ static void GLAPIENTRY > TAG(VertexAttribI3ui)(GLuint index, GLuint x, GLuint y, GLuint z) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR3UI(0, x, y, z); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR3UI(VBO_ATTRIB_GENERIC0 + index, x, y, z); > @@ -725,7 +726,7 @@ static void GLAPIENTRY > TAG(VertexAttribI4ui)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR4UI(0, x, y, z, w); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR4UI(VBO_ATTRIB_GENERIC0 + index, x, y, z, w); > @@ -737,7 +738,7 @@ static void GLAPIENTRY > TAG(VertexAttribI2uiv)(GLuint index, const GLuint *v) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR2UIV(0, v); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR2UIV(VBO_ATTRIB_GENERIC0 + index, v); > @@ -749,7 +750,7 @@ static void GLAPIENTRY > TAG(VertexAttribI3uiv)(GLuint index, const GLuint *v) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR3UIV(0, v); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR3UIV(VBO_ATTRIB_GENERIC0 + index, v); > @@ -761,7 +762,7 @@ static void GLAPIENTRY > TAG(VertexAttribI4uiv)(GLuint index, const GLuint *v) > { > GET_CURRENT_CONTEXT(ctx); > - if (index == 0) > + if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx)) > ATTR4UIV(0, v); > else if (index < MAX_VERTEX_GENERIC_ATTRIBS) > ATTR4UIV(VBO_ATTRIB_GENERIC0 + index, v); > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev