**************************************************************************/
-#include "util/u_format_r11g11b10f.h"
+#include "util/format_r11g11b10f.h"
#include "main/varray.h"
FLOAT_AS_UNION(V2), FLOAT_AS_UNION(V3))
#define ATTRD( A, N, V0, V1, V2, V3 ) \
ATTR_UNION(A, N, GL_DOUBLE, double, V0, V1, V2, V3)
+#define ATTRUI64( A, N, V0, V1, V2, V3 ) \
+ ATTR_UNION(A, N, GL_UNSIGNED_INT64_ARB, uint64_t, V0, V1, V2, V3)
/* float */
* is used in every case. They remove equation 2.2 completely.
*/
if (_mesa_is_gles3(ctx) ||
- (ctx->API == API_OPENGL_CORE && ctx->Version >= 42)) {
+ (_mesa_is_desktop_gl(ctx) && ctx->Version >= 42)) {
/* Equation 2.3 above. */
float f = ((float) val.x) / 511.0F;
return MAX2(f, -1.0f);
val.x = i2;
if (_mesa_is_gles3(ctx) ||
- (ctx->API == API_OPENGL_CORE && ctx->Version >= 42)) {
+ (_mesa_is_desktop_gl(ctx) && ctx->Version >= 42)) {
/* Equation 2.3 above. */
float f = (float) val.x;
return MAX2(f, -1.0f);
} while(0)
#define ATTR_UI_INDEX(ctx, val, type, normalized, index, arg) do { \
- if ((index) == 0) { \
+ if ((index) == 0 && _mesa_attr_zero_aliases_vertex(ctx)) { \
ATTR_UI(ctx, val, (type), normalized, 0, (arg)); \
} else if ((index) < MAX_VERTEX_GENERIC_ATTRIBS) { \
ATTR_UI(ctx, val, (type), normalized, VBO_ATTRIB_GENERIC0 + (index), (arg)); \
#define ATTR3D( A, X, Y, Z ) ATTRD( A, 3, X, Y, Z, 1 )
#define ATTR4D( A, X, Y, Z, W ) ATTRD( A, 4, X, Y, Z, W )
+#define ATTR1UIV64( A, V ) ATTRUI64( A, 1, (V)[0], 0, 0, 0 )
+#define ATTR1UI64( A, X ) ATTRUI64( A, 1, X, 0, 0, 0 )
+
static void GLAPIENTRY
TAG(Vertex2f)(GLfloat x, GLfloat y)
TAG(Indexf)(GLfloat f)
{
GET_CURRENT_CONTEXT(ctx);
- ATTR1F(VBO_ATTRIB_INDEX, f);
+ ATTR1F(VBO_ATTRIB_COLOR_INDEX, f);
}
static void GLAPIENTRY
TAG(Indexfv)(const GLfloat * f)
{
GET_CURRENT_CONTEXT(ctx);
- ATTR1FV(VBO_ATTRIB_INDEX, f);
+ ATTR1FV(VBO_ATTRIB_COLOR_INDEX, f);
}
}
+/**
+ * If index=0, does glVertexAttrib*() alias glVertex() to emit a vertex?
+ * It depends on a few things, including whether we're inside or outside
+ * of glBegin/glEnd.
+ */
+static inline bool
+is_vertex_position(const struct gl_context *ctx, GLuint index)
+{
+ return (index == 0 &&
+ _mesa_attr_zero_aliases_vertex(ctx) &&
+ _mesa_inside_begin_end(ctx));
+}
+
static void GLAPIENTRY
TAG(VertexAttrib1fARB)(GLuint index, GLfloat x)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR1F(0, x);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR1F(VBO_ATTRIB_GENERIC0 + index, x);
TAG(VertexAttrib1fvARB)(GLuint index, const GLfloat * v)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR1FV(0, v);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR1FV(VBO_ATTRIB_GENERIC0 + index, v);
TAG(VertexAttrib2fARB)(GLuint index, GLfloat x, GLfloat y)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR2F(0, x, y);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR2F(VBO_ATTRIB_GENERIC0 + index, x, y);
TAG(VertexAttrib2fvARB)(GLuint index, const GLfloat * v)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR2FV(0, v);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR2FV(VBO_ATTRIB_GENERIC0 + index, v);
TAG(VertexAttrib3fARB)(GLuint index, GLfloat x, GLfloat y, GLfloat z)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR3F(0, x, y, z);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR3F(VBO_ATTRIB_GENERIC0 + index, x, y, z);
TAG(VertexAttrib3fvARB)(GLuint index, const GLfloat * v)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR3FV(0, v);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR3FV(VBO_ATTRIB_GENERIC0 + index, v);
TAG(VertexAttrib4fARB)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR4F(0, x, y, z, w);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR4F(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
TAG(VertexAttrib4fvARB)(GLuint index, const GLfloat * v)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR4FV(0, v);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR4FV(VBO_ATTRIB_GENERIC0 + index, v);
TAG(VertexAttribI1i)(GLuint index, GLint x)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR1I(0, x);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR1I(VBO_ATTRIB_GENERIC0 + index, x);
TAG(VertexAttribI2i)(GLuint index, GLint x, GLint y)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR2I(0, x, y);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR2I(VBO_ATTRIB_GENERIC0 + index, x, y);
TAG(VertexAttribI3i)(GLuint index, GLint x, GLint y, GLint z)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR3I(0, x, y, z);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR3I(VBO_ATTRIB_GENERIC0 + index, x, y, z);
TAG(VertexAttribI4i)(GLuint index, GLint x, GLint y, GLint z, GLint w)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR4I(0, x, y, z, w);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR4I(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
TAG(VertexAttribI2iv)(GLuint index, const GLint *v)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR2IV(0, v);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR2IV(VBO_ATTRIB_GENERIC0 + index, v);
TAG(VertexAttribI3iv)(GLuint index, const GLint *v)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR3IV(0, v);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR3IV(VBO_ATTRIB_GENERIC0 + index, v);
TAG(VertexAttribI4iv)(GLuint index, const GLint *v)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR4IV(0, v);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR4IV(VBO_ATTRIB_GENERIC0 + index, v);
TAG(VertexAttribI1ui)(GLuint index, GLuint x)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR1UI(0, x);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR1UI(VBO_ATTRIB_GENERIC0 + index, x);
TAG(VertexAttribI2ui)(GLuint index, GLuint x, GLuint y)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR2UI(0, x, y);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR2UI(VBO_ATTRIB_GENERIC0 + index, x, y);
TAG(VertexAttribI3ui)(GLuint index, GLuint x, GLuint y, GLuint z)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR3UI(0, x, y, z);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR3UI(VBO_ATTRIB_GENERIC0 + index, x, y, z);
TAG(VertexAttribI4ui)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR4UI(0, x, y, z, w);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR4UI(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
TAG(VertexAttribI2uiv)(GLuint index, const GLuint *v)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR2UIV(0, v);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR2UIV(VBO_ATTRIB_GENERIC0 + index, v);
TAG(VertexAttribI3uiv)(GLuint index, const GLuint *v)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR3UIV(0, v);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR3UIV(VBO_ATTRIB_GENERIC0 + index, v);
TAG(VertexAttribI4uiv)(GLuint index, const GLuint *v)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR4UIV(0, v);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR4UIV(VBO_ATTRIB_GENERIC0 + index, v);
-/* In addition to supporting NV_vertex_program, these entrypoints are
- * used by the display list and other code specifically because of
- * their property of aliasing with other attributes. (See
- * vbo_save_loopback.c)
+/* These entrypoints are no longer used for NV_vertex_program but they are
+ * used by the display list and other code specifically because of their
+ * property of aliasing with the legacy Vertex, TexCoord, Normal, etc
+ * attributes. (See vbo_save_loopback.c)
*/
static void GLAPIENTRY
TAG(VertexAttrib1fNV)(GLuint index, GLfloat x)
TAG(VertexAttribL1d)(GLuint index, GLdouble x)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR1D(0, x);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR1D(VBO_ATTRIB_GENERIC0 + index, x);
TAG(VertexAttribL1dv)(GLuint index, const GLdouble * v)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR1DV(0, v);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR1DV(VBO_ATTRIB_GENERIC0 + index, v);
TAG(VertexAttribL2d)(GLuint index, GLdouble x, GLdouble y)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR2D(0, x, y);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR2D(VBO_ATTRIB_GENERIC0 + index, x, y);
TAG(VertexAttribL2dv)(GLuint index, const GLdouble * v)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR2DV(0, v);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR2DV(VBO_ATTRIB_GENERIC0 + index, v);
TAG(VertexAttribL3d)(GLuint index, GLdouble x, GLdouble y, GLdouble z)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR3D(0, x, y, z);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR3D(VBO_ATTRIB_GENERIC0 + index, x, y, z);
TAG(VertexAttribL3dv)(GLuint index, const GLdouble * v)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR3DV(0, v);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR3DV(VBO_ATTRIB_GENERIC0 + index, v);
TAG(VertexAttribL4d)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR4D(0, x, y, z, w);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR4D(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
TAG(VertexAttribL4dv)(GLuint index, const GLdouble * v)
{
GET_CURRENT_CONTEXT(ctx);
- if (index == 0 && _mesa_attr_zero_aliases_vertex(ctx))
+ if (is_vertex_position(ctx, index))
ATTR4DV(0, v);
else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
ATTR4DV(VBO_ATTRIB_GENERIC0 + index, v);
ERROR(GL_INVALID_VALUE);
}
+static void GLAPIENTRY
+TAG(VertexAttribL1ui64ARB)(GLuint index, GLuint64EXT x)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ if (is_vertex_position(ctx, index))
+ ATTR1UI64(0, x);
+ else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
+ ATTR1UI64(VBO_ATTRIB_GENERIC0 + index, x);
+ else
+ ERROR(GL_INVALID_VALUE);
+}
+
+static void GLAPIENTRY
+TAG(VertexAttribL1ui64vARB)(GLuint index, const GLuint64EXT *v)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ if (is_vertex_position(ctx, index))
+ ATTR1UIV64(0, v);
+ else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
+ ATTR1UIV64(VBO_ATTRIB_GENERIC0 + index, v);
+ else
+ ERROR(GL_INVALID_VALUE);
+}
#undef ATTR1FV
#undef ATTR2FV