From 98d11972334186b1b5ede148e32ac7758be56ce4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sun, 8 Mar 2020 18:47:56 -0400 Subject: [PATCH] mesa: use vbo_attrib_tmp.h to generate display list vertex attrib functions This removes about 1150 lines of code. The diff is messy, but the new code really starts with save_Attr32bit and below. Ignore false Eval/Material/Begin changes etc. Git can't figure out what was really changed. I didn't change them. Acked-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/mesa/main/dlist.c | 1771 +++++++--------------------------------- src/mesa/main/macros.h | 10 + src/mesa/main/mtypes.h | 2 +- src/mesa/main/vtxfmt.c | 2 +- 4 files changed, 322 insertions(+), 1463 deletions(-) diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c index f1aee16d587..0fe027f0afc 100644 --- a/src/mesa/main/dlist.c +++ b/src/mesa/main/dlist.c @@ -5900,188 +5900,6 @@ save_SetFragmentShaderConstantATI(GLuint dst, const GLfloat *value) } } -static void GLAPIENTRY -save_Attr1fNV(GLenum attr, GLfloat x) -{ - GET_CURRENT_CONTEXT(ctx); - Node *n; - SAVE_FLUSH_VERTICES(ctx); - n = alloc_instruction(ctx, OPCODE_ATTR_1F_NV, 2); - if (n) { - n[1].e = attr; - n[2].f = x; - } - - assert(attr < MAX_VERTEX_GENERIC_ATTRIBS); - ctx->ListState.ActiveAttribSize[attr] = 1; - ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, 0, 0, 1); - - if (ctx->ExecuteFlag) { - CALL_VertexAttrib1fNV(ctx->Exec, (attr, x)); - } -} - -static void GLAPIENTRY -save_Attr2fNV(GLenum attr, GLfloat x, GLfloat y) -{ - GET_CURRENT_CONTEXT(ctx); - Node *n; - SAVE_FLUSH_VERTICES(ctx); - n = alloc_instruction(ctx, OPCODE_ATTR_2F_NV, 3); - if (n) { - n[1].e = attr; - n[2].f = x; - n[3].f = y; - } - - assert(attr < MAX_VERTEX_GENERIC_ATTRIBS); - ctx->ListState.ActiveAttribSize[attr] = 2; - ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, 0, 1); - - if (ctx->ExecuteFlag) { - CALL_VertexAttrib2fNV(ctx->Exec, (attr, x, y)); - } -} - -static void GLAPIENTRY -save_Attr3fNV(GLenum attr, GLfloat x, GLfloat y, GLfloat z) -{ - GET_CURRENT_CONTEXT(ctx); - Node *n; - SAVE_FLUSH_VERTICES(ctx); - n = alloc_instruction(ctx, OPCODE_ATTR_3F_NV, 4); - if (n) { - n[1].e = attr; - n[2].f = x; - n[3].f = y; - n[4].f = z; - } - - assert(attr < MAX_VERTEX_GENERIC_ATTRIBS); - ctx->ListState.ActiveAttribSize[attr] = 3; - ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, z, 1); - - if (ctx->ExecuteFlag) { - CALL_VertexAttrib3fNV(ctx->Exec, (attr, x, y, z)); - } -} - -static void GLAPIENTRY -save_Attr4fNV(GLenum attr, GLfloat x, GLfloat y, GLfloat z, GLfloat w) -{ - GET_CURRENT_CONTEXT(ctx); - Node *n; - SAVE_FLUSH_VERTICES(ctx); - n = alloc_instruction(ctx, OPCODE_ATTR_4F_NV, 5); - if (n) { - n[1].e = attr; - n[2].f = x; - n[3].f = y; - n[4].f = z; - n[5].f = w; - } - - assert(attr < MAX_VERTEX_GENERIC_ATTRIBS); - ctx->ListState.ActiveAttribSize[attr] = 4; - ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, z, w); - - if (ctx->ExecuteFlag) { - CALL_VertexAttrib4fNV(ctx->Exec, (attr, x, y, z, w)); - } -} - - -static void GLAPIENTRY -save_Attr1fARB(GLenum attr, GLfloat x) -{ - GET_CURRENT_CONTEXT(ctx); - Node *n; - SAVE_FLUSH_VERTICES(ctx); - n = alloc_instruction(ctx, OPCODE_ATTR_1F_ARB, 2); - if (n) { - n[1].e = attr; - n[2].f = x; - } - - assert(attr < MAX_VERTEX_GENERIC_ATTRIBS); - ctx->ListState.ActiveAttribSize[attr] = 1; - ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, 0, 0, 1); - - if (ctx->ExecuteFlag) { - CALL_VertexAttrib1fARB(ctx->Exec, (attr, x)); - } -} - -static void GLAPIENTRY -save_Attr2fARB(GLenum attr, GLfloat x, GLfloat y) -{ - GET_CURRENT_CONTEXT(ctx); - Node *n; - SAVE_FLUSH_VERTICES(ctx); - n = alloc_instruction(ctx, OPCODE_ATTR_2F_ARB, 3); - if (n) { - n[1].e = attr; - n[2].f = x; - n[3].f = y; - } - - assert(attr < MAX_VERTEX_GENERIC_ATTRIBS); - ctx->ListState.ActiveAttribSize[attr] = 2; - ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, 0, 1); - - if (ctx->ExecuteFlag) { - CALL_VertexAttrib2fARB(ctx->Exec, (attr, x, y)); - } -} - -static void GLAPIENTRY -save_Attr3fARB(GLenum attr, GLfloat x, GLfloat y, GLfloat z) -{ - GET_CURRENT_CONTEXT(ctx); - Node *n; - SAVE_FLUSH_VERTICES(ctx); - n = alloc_instruction(ctx, OPCODE_ATTR_3F_ARB, 4); - if (n) { - n[1].e = attr; - n[2].f = x; - n[3].f = y; - n[4].f = z; - } - - assert(attr < MAX_VERTEX_GENERIC_ATTRIBS); - ctx->ListState.ActiveAttribSize[attr] = 3; - ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, z, 1); - - if (ctx->ExecuteFlag) { - CALL_VertexAttrib3fARB(ctx->Exec, (attr, x, y, z)); - } -} - -static void GLAPIENTRY -save_Attr4fARB(GLenum attr, GLfloat x, GLfloat y, GLfloat z, GLfloat w) -{ - GET_CURRENT_CONTEXT(ctx); - Node *n; - SAVE_FLUSH_VERTICES(ctx); - n = alloc_instruction(ctx, OPCODE_ATTR_4F_ARB, 5); - if (n) { - n[1].e = attr; - n[2].f = x; - n[3].f = y; - n[4].f = z; - n[5].f = w; - } - - assert(attr < MAX_VERTEX_GENERIC_ATTRIBS); - ctx->ListState.ActiveAttribSize[attr] = 4; - ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, z, w); - - if (ctx->ExecuteFlag) { - CALL_VertexAttrib4fARB(ctx->Exec, (attr, x, y, z, w)); - } -} - - static void GLAPIENTRY save_EvalCoord1f(GLfloat x) { @@ -6100,1339 +5918,205 @@ save_EvalCoord1f(GLfloat x) static void GLAPIENTRY save_EvalCoord1fv(const GLfloat * v) { - save_EvalCoord1f(v[0]); -} - -static void GLAPIENTRY -save_EvalCoord2f(GLfloat x, GLfloat y) -{ - GET_CURRENT_CONTEXT(ctx); - Node *n; - SAVE_FLUSH_VERTICES(ctx); - n = alloc_instruction(ctx, OPCODE_EVAL_C2, 2); - if (n) { - n[1].f = x; - n[2].f = y; - } - if (ctx->ExecuteFlag) { - CALL_EvalCoord2f(ctx->Exec, (x, y)); - } -} - -static void GLAPIENTRY -save_EvalCoord2fv(const GLfloat * v) -{ - save_EvalCoord2f(v[0], v[1]); -} - - -static void GLAPIENTRY -save_EvalPoint1(GLint x) -{ - GET_CURRENT_CONTEXT(ctx); - Node *n; - SAVE_FLUSH_VERTICES(ctx); - n = alloc_instruction(ctx, OPCODE_EVAL_P1, 1); - if (n) { - n[1].i = x; - } - if (ctx->ExecuteFlag) { - CALL_EvalPoint1(ctx->Exec, (x)); - } -} - -static void GLAPIENTRY -save_EvalPoint2(GLint x, GLint y) -{ - GET_CURRENT_CONTEXT(ctx); - Node *n; - SAVE_FLUSH_VERTICES(ctx); - n = alloc_instruction(ctx, OPCODE_EVAL_P2, 2); - if (n) { - n[1].i = x; - n[2].i = y; - } - if (ctx->ExecuteFlag) { - CALL_EvalPoint2(ctx->Exec, (x, y)); - } -} - -static void GLAPIENTRY -save_Indexf(GLfloat x) -{ - save_Attr1fNV(VERT_ATTRIB_COLOR_INDEX, x); -} - -static void GLAPIENTRY -save_Indexfv(const GLfloat * v) -{ - save_Attr1fNV(VERT_ATTRIB_COLOR_INDEX, v[0]); -} - -static void GLAPIENTRY -save_EdgeFlag(GLboolean x) -{ - save_Attr1fNV(VERT_ATTRIB_EDGEFLAG, x ? 1.0f : 0.0f); -} - - -/** - * Compare 'count' elements of vectors 'a' and 'b'. - * \return GL_TRUE if equal, GL_FALSE if different. - */ -static inline GLboolean -compare_vec(const GLfloat *a, const GLfloat *b, GLuint count) -{ - return memcmp( a, b, count * sizeof(GLfloat) ) == 0; -} - - -/** - * This glMaterial function is used for glMaterial calls that are outside - * a glBegin/End pair. For glMaterial inside glBegin/End, see the VBO code. - */ -static void GLAPIENTRY -save_Materialfv(GLenum face, GLenum pname, const GLfloat * param) -{ - GET_CURRENT_CONTEXT(ctx); - Node *n; - int args, i; - GLuint bitmask; - - switch (face) { - case GL_BACK: - case GL_FRONT: - case GL_FRONT_AND_BACK: - break; - default: - _mesa_compile_error(ctx, GL_INVALID_ENUM, "glMaterial(face)"); - return; - } - - switch (pname) { - case GL_EMISSION: - case GL_AMBIENT: - case GL_DIFFUSE: - case GL_SPECULAR: - case GL_AMBIENT_AND_DIFFUSE: - args = 4; - break; - case GL_SHININESS: - args = 1; - break; - case GL_COLOR_INDEXES: - args = 3; - break; - default: - _mesa_compile_error(ctx, GL_INVALID_ENUM, "glMaterial(pname)"); - return; - } - - if (ctx->ExecuteFlag) { - CALL_Materialfv(ctx->Exec, (face, pname, param)); - } - - bitmask = _mesa_material_bitmask(ctx, face, pname, ~0, NULL); - - /* Try to eliminate redundant statechanges. Because it is legal to - * call glMaterial even inside begin/end calls, don't need to worry - * about ctx->Driver.CurrentSavePrimitive here. - */ - for (i = 0; i < MAT_ATTRIB_MAX; i++) { - if (bitmask & (1 << i)) { - if (ctx->ListState.ActiveMaterialSize[i] == args && - compare_vec(ctx->ListState.CurrentMaterial[i], param, args)) { - /* no change in material value */ - bitmask &= ~(1 << i); - } - else { - ctx->ListState.ActiveMaterialSize[i] = args; - COPY_SZ_4V(ctx->ListState.CurrentMaterial[i], args, param); - } - } - } - - /* If this call has no effect, return early */ - if (bitmask == 0) - return; - - SAVE_FLUSH_VERTICES(ctx); - - n = alloc_instruction(ctx, OPCODE_MATERIAL, 6); - if (n) { - n[1].e = face; - n[2].e = pname; - for (i = 0; i < args; i++) - n[3 + i].f = param[i]; - } -} - -static void GLAPIENTRY -save_Begin(GLenum mode) -{ - GET_CURRENT_CONTEXT(ctx); - - if (!_mesa_is_valid_prim_mode(ctx, mode)) { - /* compile this error into the display list */ - _mesa_compile_error(ctx, GL_INVALID_ENUM, "glBegin(mode)"); - } - else if (_mesa_inside_dlist_begin_end(ctx)) { - /* compile this error into the display list */ - _mesa_compile_error(ctx, GL_INVALID_OPERATION, "recursive glBegin"); - } - else { - ctx->Driver.CurrentSavePrimitive = mode; - - vbo_save_NotifyBegin(ctx, mode, false); - } -} - -static void GLAPIENTRY -save_End(void) -{ - GET_CURRENT_CONTEXT(ctx); - SAVE_FLUSH_VERTICES(ctx); - (void) alloc_instruction(ctx, OPCODE_END, 0); - ctx->Driver.CurrentSavePrimitive = PRIM_OUTSIDE_BEGIN_END; - if (ctx->ExecuteFlag) { - CALL_End(ctx->Exec, ()); - } -} - -static void GLAPIENTRY -save_Rectf(GLfloat a, GLfloat b, GLfloat c, GLfloat d) -{ - GET_CURRENT_CONTEXT(ctx); - Node *n; - ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); - n = alloc_instruction(ctx, OPCODE_RECTF, 4); - if (n) { - n[1].f = a; - n[2].f = b; - n[3].f = c; - n[4].f = d; - } - if (ctx->ExecuteFlag) { - CALL_Rectf(ctx->Exec, (a, b, c, d)); - } -} - - -static void GLAPIENTRY -save_Vertex2f(GLfloat x, GLfloat y) -{ - save_Attr2fNV(VERT_ATTRIB_POS, x, y); -} - -static void GLAPIENTRY -save_Vertex2fv(const GLfloat * v) -{ - save_Attr2fNV(VERT_ATTRIB_POS, v[0], v[1]); -} - -static void GLAPIENTRY -save_Vertex3f(GLfloat x, GLfloat y, GLfloat z) -{ - save_Attr3fNV(VERT_ATTRIB_POS, x, y, z); -} - -static void GLAPIENTRY -save_Vertex3fv(const GLfloat * v) -{ - save_Attr3fNV(VERT_ATTRIB_POS, v[0], v[1], v[2]); -} - -static void GLAPIENTRY -save_Vertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) -{ - save_Attr4fNV(VERT_ATTRIB_POS, x, y, z, w); -} - -static void GLAPIENTRY -save_Vertex4fv(const GLfloat * v) -{ - save_Attr4fNV(VERT_ATTRIB_POS, v[0], v[1], v[2], v[3]); -} - -static void GLAPIENTRY -save_TexCoord1f(GLfloat x) -{ - save_Attr1fNV(VERT_ATTRIB_TEX0, x); -} - -static void GLAPIENTRY -save_TexCoord1fv(const GLfloat * v) -{ - save_Attr1fNV(VERT_ATTRIB_TEX0, v[0]); -} - -static void GLAPIENTRY -save_TexCoord2f(GLfloat x, GLfloat y) -{ - save_Attr2fNV(VERT_ATTRIB_TEX0, x, y); -} - -static void GLAPIENTRY -save_TexCoord2fv(const GLfloat * v) -{ - save_Attr2fNV(VERT_ATTRIB_TEX0, v[0], v[1]); -} - -static void GLAPIENTRY -save_TexCoord3f(GLfloat x, GLfloat y, GLfloat z) -{ - save_Attr3fNV(VERT_ATTRIB_TEX0, x, y, z); -} - -static void GLAPIENTRY -save_TexCoord3fv(const GLfloat * v) -{ - save_Attr3fNV(VERT_ATTRIB_TEX0, v[0], v[1], v[2]); -} - -static void GLAPIENTRY -save_TexCoord4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) -{ - save_Attr4fNV(VERT_ATTRIB_TEX0, x, y, z, w); -} - -static void GLAPIENTRY -save_TexCoord4fv(const GLfloat * v) -{ - save_Attr4fNV(VERT_ATTRIB_TEX0, v[0], v[1], v[2], v[3]); -} - -static void GLAPIENTRY -save_Normal3f(GLfloat x, GLfloat y, GLfloat z) -{ - save_Attr3fNV(VERT_ATTRIB_NORMAL, x, y, z); -} - -static void GLAPIENTRY -save_Normal3fv(const GLfloat * v) -{ - save_Attr3fNV(VERT_ATTRIB_NORMAL, v[0], v[1], v[2]); -} - -static void GLAPIENTRY -save_FogCoordfEXT(GLfloat x) -{ - save_Attr1fNV(VERT_ATTRIB_FOG, x); -} - -static void GLAPIENTRY -save_FogCoordfvEXT(const GLfloat * v) -{ - save_Attr1fNV(VERT_ATTRIB_FOG, v[0]); -} - -static void GLAPIENTRY -save_Color3f(GLfloat x, GLfloat y, GLfloat z) -{ - save_Attr3fNV(VERT_ATTRIB_COLOR0, x, y, z); -} - -static void GLAPIENTRY -save_Color3fv(const GLfloat * v) -{ - save_Attr3fNV(VERT_ATTRIB_COLOR0, v[0], v[1], v[2]); -} - -static void GLAPIENTRY -save_Color4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) -{ - save_Attr4fNV(VERT_ATTRIB_COLOR0, x, y, z, w); -} - -static void GLAPIENTRY -save_Color4fv(const GLfloat * v) -{ - save_Attr4fNV(VERT_ATTRIB_COLOR0, v[0], v[1], v[2], v[3]); -} - -static void GLAPIENTRY -save_SecondaryColor3fEXT(GLfloat x, GLfloat y, GLfloat z) -{ - save_Attr3fNV(VERT_ATTRIB_COLOR1, x, y, z); -} - -static void GLAPIENTRY -save_SecondaryColor3fvEXT(const GLfloat * v) -{ - save_Attr3fNV(VERT_ATTRIB_COLOR1, v[0], v[1], v[2]); -} - - -/** - * Record a GL_INVALID_VALUE error when an invalid vertex attribute - * index is found. - */ -static void -index_error(void) -{ - GET_CURRENT_CONTEXT(ctx); - _mesa_error(ctx, GL_INVALID_VALUE, "VertexAttribf(index)"); -} - -#define ATTR1F( A, X ) save_Attr1fNV(A, X) -#define ATTR2F( A, X, Y ) save_Attr2fNV(A, X, Y) -#define ATTR3F( A, X, Y, Z ) save_Attr3fNV(A, X, Y, Z) -#define ATTR4F( A, X, Y, Z, W ) save_Attr4fNV(A, X, Y, Z, W) - -#define ATTR1FV( A, V ) save_Attr1fNV(A, V[0]) -#define ATTR2FV( A, V ) save_Attr2fNV(A, V[0], V[1]) -#define ATTR3FV( A, V ) save_Attr3fNV(A, V[0], V[0], V[2]) -#define ATTR4FV( A, V ) save_Attr4fNV(A, V[0], V[1], V[2], V[3]) - -#define ATTRUI10_1( A, UI ) ATTR1F( A, (UI) & 0x3ff) -#define ATTRUI10_2( A, UI ) ATTR2F( A, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff) -#define ATTRUI10_3( A, UI ) ATTR3F( A, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, ((UI) >> 20) & 0x3ff) -#define ATTRUI10_4( A, UI ) ATTR4F( A, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, ((UI) >> 20) & 0x3ff, ((UI) >> 30) & 0x3 ) - -#define ATTRUI10N_1( A, UI ) ATTR1F( A, conv_ui10_to_norm_float((UI) & 0x3ff)) -#define ATTRUI10N_2( A, UI ) ATTR2F( A, \ - conv_ui10_to_norm_float((UI) & 0x3ff), \ - conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff)) -#define ATTRUI10N_3( A, UI ) ATTR3F( A, \ - conv_ui10_to_norm_float((UI) & 0x3ff), \ - conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), \ - conv_ui10_to_norm_float(((UI) >> 20) & 0x3ff)) -#define ATTRUI10N_4( A, UI ) ATTR4F( A, \ - conv_ui10_to_norm_float((UI) & 0x3ff), \ - conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), \ - conv_ui10_to_norm_float(((UI) >> 20) & 0x3ff), \ - conv_ui2_to_norm_float(((UI) >> 30) & 0x3) ) - -#define ATTRI10_1( A, I10 ) ATTR1F( A, conv_i10_to_i((I10) & 0x3ff)) -#define ATTRI10_2( A, I10 ) ATTR2F( A, \ - conv_i10_to_i((I10) & 0x3ff), \ - conv_i10_to_i(((I10) >> 10) & 0x3ff)) -#define ATTRI10_3( A, I10 ) ATTR3F( A, \ - conv_i10_to_i((I10) & 0x3ff), \ - conv_i10_to_i(((I10) >> 10) & 0x3ff), \ - conv_i10_to_i(((I10) >> 20) & 0x3ff)) -#define ATTRI10_4( A, I10 ) ATTR4F( A, \ - conv_i10_to_i((I10) & 0x3ff), \ - conv_i10_to_i(((I10) >> 10) & 0x3ff), \ - conv_i10_to_i(((I10) >> 20) & 0x3ff), \ - conv_i2_to_i(((I10) >> 30) & 0x3)) - -#define ATTRI10N_1(ctx, A, I10) ATTR1F(A, conv_i10_to_norm_float(ctx, (I10) & 0x3ff)) -#define ATTRI10N_2(ctx, A, I10) ATTR2F(A, \ - conv_i10_to_norm_float(ctx, (I10) & 0x3ff), \ - conv_i10_to_norm_float(ctx, ((I10) >> 10) & 0x3ff)) -#define ATTRI10N_3(ctx, A, I10) ATTR3F(A, \ - conv_i10_to_norm_float(ctx, (I10) & 0x3ff), \ - conv_i10_to_norm_float(ctx, ((I10) >> 10) & 0x3ff), \ - conv_i10_to_norm_float(ctx, ((I10) >> 20) & 0x3ff)) -#define ATTRI10N_4(ctx, A, I10) ATTR4F(A, \ - conv_i10_to_norm_float(ctx, (I10) & 0x3ff), \ - conv_i10_to_norm_float(ctx, ((I10) >> 10) & 0x3ff), \ - conv_i10_to_norm_float(ctx, ((I10) >> 20) & 0x3ff), \ - conv_i2_to_norm_float(ctx, ((I10) >> 30) & 0x3)) - -#define ATTR_UI(ctx, val, type, normalized, attr, arg) do { \ - if ((type) == GL_UNSIGNED_INT_2_10_10_10_REV) { \ - if (normalized) { \ - ATTRUI10N_##val((attr), (arg)); \ - } else { \ - ATTRUI10_##val((attr), (arg)); \ - } \ - } else if ((type) == GL_INT_2_10_10_10_REV) { \ - if (normalized) { \ - ATTRI10N_##val(ctx, (attr), (arg)); \ - } else { \ - ATTRI10_##val((attr), (arg)); \ - } \ - } else if ((type) == GL_UNSIGNED_INT_10F_11F_11F_REV) { \ - float res[4]; \ - res[3] = 1; \ - r11g11b10f_to_float3((arg), res); \ - ATTR##val##FV((attr), res); \ - } \ -} while(0) - -#define ATTR_UI_INDEX(ctx, val, type, normalized, index, arg) do { \ - 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, VERT_ATTRIB_GENERIC0 + (index), (arg)); \ - } else \ - index_error(); \ - } while(0) - -static void GLAPIENTRY -save_VertexP2ui(GLenum type, GLuint value) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP2ui"); - ATTR_UI(ctx, 2, type, 0, VERT_ATTRIB_POS, value); -} - -static void GLAPIENTRY -save_VertexP2uiv(GLenum type, const GLuint *value) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP2uiv"); - ATTR_UI(ctx, 2, type, 0, VERT_ATTRIB_POS, value[0]); -} - -static void GLAPIENTRY -save_VertexP3ui(GLenum type, GLuint value) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP3ui"); - ATTR_UI(ctx, 3, type, 0, VERT_ATTRIB_POS, value); -} - -static void GLAPIENTRY -save_VertexP3uiv(GLenum type, const GLuint *value) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP3uiv"); - ATTR_UI(ctx, 3, type, 0, VERT_ATTRIB_POS, value[0]); -} - -static void GLAPIENTRY -save_VertexP4ui(GLenum type, GLuint value) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP4ui"); - ATTR_UI(ctx, 4, type, 0, VERT_ATTRIB_POS, value); -} - -static void GLAPIENTRY -save_VertexP4uiv(GLenum type, const GLuint *value) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP4uiv"); - ATTR_UI(ctx, 4, type, 0, VERT_ATTRIB_POS, value[0]); -} - -static void GLAPIENTRY -save_TexCoordP1ui(GLenum type, GLuint coords) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP1ui"); - ATTR_UI(ctx, 1, type, 0, VERT_ATTRIB_TEX0, coords); -} - -static void GLAPIENTRY -save_TexCoordP1uiv(GLenum type, const GLuint *coords) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP1uiv"); - ATTR_UI(ctx, 1, type, 0, VERT_ATTRIB_TEX0, coords[0]); -} - -static void GLAPIENTRY -save_TexCoordP2ui(GLenum type, GLuint coords) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP2ui"); - ATTR_UI(ctx, 2, type, 0, VERT_ATTRIB_TEX0, coords); -} - -static void GLAPIENTRY -save_TexCoordP2uiv(GLenum type, const GLuint *coords) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP2uiv"); - ATTR_UI(ctx, 2, type, 0, VERT_ATTRIB_TEX0, coords[0]); -} - -static void GLAPIENTRY -save_TexCoordP3ui(GLenum type, GLuint coords) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP3ui"); - ATTR_UI(ctx, 3, type, 0, VERT_ATTRIB_TEX0, coords); -} - -static void GLAPIENTRY -save_TexCoordP3uiv(GLenum type, const GLuint *coords) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP3uiv"); - ATTR_UI(ctx, 3, type, 0, VERT_ATTRIB_TEX0, coords[0]); -} - -static void GLAPIENTRY -save_TexCoordP4ui(GLenum type, GLuint coords) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP4ui"); - ATTR_UI(ctx, 4, type, 0, VERT_ATTRIB_TEX0, coords); -} - -static void GLAPIENTRY -save_TexCoordP4uiv(GLenum type, const GLuint *coords) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP4uiv"); - ATTR_UI(ctx, 4, type, 0, VERT_ATTRIB_TEX0, coords[0]); -} - -static void GLAPIENTRY -save_MultiTexCoordP1ui(GLenum target, GLenum type, GLuint coords) -{ - GET_CURRENT_CONTEXT(ctx); - GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP1ui"); - ATTR_UI(ctx, 1, type, 0, attr, coords); -} - -static void GLAPIENTRY -save_MultiTexCoordP1uiv(GLenum target, GLenum type, const GLuint *coords) -{ - GET_CURRENT_CONTEXT(ctx); - GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP1uiv"); - ATTR_UI(ctx, 1, type, 0, attr, coords[0]); -} - -static void GLAPIENTRY -save_MultiTexCoordP2ui(GLenum target, GLenum type, GLuint coords) -{ - GET_CURRENT_CONTEXT(ctx); - GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP2ui"); - ATTR_UI(ctx, 2, type, 0, attr, coords); -} - -static void GLAPIENTRY -save_MultiTexCoordP2uiv(GLenum target, GLenum type, const GLuint *coords) -{ - GET_CURRENT_CONTEXT(ctx); - GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP2uiv"); - ATTR_UI(ctx, 2, type, 0, attr, coords[0]); -} - -static void GLAPIENTRY -save_MultiTexCoordP3ui(GLenum target, GLenum type, GLuint coords) -{ - GET_CURRENT_CONTEXT(ctx); - GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP3ui"); - ATTR_UI(ctx, 3, type, 0, attr, coords); -} - -static void GLAPIENTRY -save_MultiTexCoordP3uiv(GLenum target, GLenum type, const GLuint *coords) -{ - GET_CURRENT_CONTEXT(ctx); - GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP3uiv"); - ATTR_UI(ctx, 3, type, 0, attr, coords[0]); -} - -static void GLAPIENTRY -save_MultiTexCoordP4ui(GLenum target, GLenum type, GLuint coords) -{ - GET_CURRENT_CONTEXT(ctx); - GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP4ui"); - ATTR_UI(ctx, 4, type, 0, attr, coords); -} - -static void GLAPIENTRY -save_MultiTexCoordP4uiv(GLenum target, GLenum type, const GLuint *coords) -{ - GET_CURRENT_CONTEXT(ctx); - GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP4uiv"); - ATTR_UI(ctx, 4, type, 0, attr, coords[0]); -} - -static void GLAPIENTRY -save_NormalP3ui(GLenum type, GLuint coords) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glNormalP3ui"); - ATTR_UI(ctx, 3, type, 1, VERT_ATTRIB_NORMAL, coords); -} - -static void GLAPIENTRY -save_NormalP3uiv(GLenum type, const GLuint *coords) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glNormalP3uiv"); - ATTR_UI(ctx, 3, type, 1, VERT_ATTRIB_NORMAL, coords[0]); -} - -static void GLAPIENTRY -save_ColorP3ui(GLenum type, GLuint color) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glColorP3ui"); - ATTR_UI(ctx, 3, type, 1, VERT_ATTRIB_COLOR0, color); -} - -static void GLAPIENTRY -save_ColorP3uiv(GLenum type, const GLuint *color) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glColorP3uiv"); - ATTR_UI(ctx, 3, type, 1, VERT_ATTRIB_COLOR0, color[0]); -} - -static void GLAPIENTRY -save_ColorP4ui(GLenum type, GLuint color) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glColorP4ui"); - ATTR_UI(ctx, 4, type, 1, VERT_ATTRIB_COLOR0, color); -} - -static void GLAPIENTRY -save_ColorP4uiv(GLenum type, const GLuint *color) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glColorP4uiv"); - ATTR_UI(ctx, 4, type, 1, VERT_ATTRIB_COLOR0, color[0]); -} - -static void GLAPIENTRY -save_SecondaryColorP3ui(GLenum type, GLuint color) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glSecondaryColorP3ui"); - ATTR_UI(ctx, 3, type, 1, VERT_ATTRIB_COLOR1, color); -} - -static void GLAPIENTRY -save_SecondaryColorP3uiv(GLenum type, const GLuint *color) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glSecondaryColorP3uiv"); - ATTR_UI(ctx, 3, type, 1, VERT_ATTRIB_COLOR1, color[0]); -} - -static void GLAPIENTRY -save_VertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, - GLuint value) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP1ui"); - ATTR_UI_INDEX(ctx, 1, type, normalized, index, value); -} - -static void GLAPIENTRY -save_VertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, - GLuint value) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP2ui"); - ATTR_UI_INDEX(ctx, 2, type, normalized, index, value); -} - -static void GLAPIENTRY -save_VertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, - GLuint value) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP3ui"); - ATTR_UI_INDEX(ctx, 3, type, normalized, index, value); -} - -static void GLAPIENTRY -save_VertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, - GLuint value) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexAttribP4ui"); - ATTR_UI_INDEX(ctx, 4, type, normalized, index, value); -} - -static void GLAPIENTRY -save_VertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, - const GLuint *value) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP1uiv"); - ATTR_UI_INDEX(ctx, 1, type, normalized, index, *value); -} - -static void GLAPIENTRY -save_VertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, - const GLuint *value) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP2uiv"); - ATTR_UI_INDEX(ctx, 2, type, normalized, index, *value); -} - -static void GLAPIENTRY -save_VertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, - const GLuint *value) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP3uiv"); - ATTR_UI_INDEX(ctx, 3, type, normalized, index, *value); -} - -static void GLAPIENTRY -save_VertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, - const GLuint *value) -{ - GET_CURRENT_CONTEXT(ctx); - ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexAttribP4uiv"); - ATTR_UI_INDEX(ctx, 4, type, normalized, index, *value); -} - - -/* Just call the respective ATTR for texcoord - */ -static void GLAPIENTRY -save_MultiTexCoord1f(GLenum target, GLfloat x) -{ - GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; - save_Attr1fNV(attr, x); -} - -static void GLAPIENTRY -save_MultiTexCoord1fv(GLenum target, const GLfloat * v) -{ - GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; - save_Attr1fNV(attr, v[0]); -} - -static void GLAPIENTRY -save_MultiTexCoord2f(GLenum target, GLfloat x, GLfloat y) -{ - GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; - save_Attr2fNV(attr, x, y); -} - -static void GLAPIENTRY -save_MultiTexCoord2fv(GLenum target, const GLfloat * v) -{ - GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; - save_Attr2fNV(attr, v[0], v[1]); -} - -static void GLAPIENTRY -save_MultiTexCoord3f(GLenum target, GLfloat x, GLfloat y, GLfloat z) -{ - GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; - save_Attr3fNV(attr, x, y, z); -} - -static void GLAPIENTRY -save_MultiTexCoord3fv(GLenum target, const GLfloat * v) -{ - GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; - save_Attr3fNV(attr, v[0], v[1], v[2]); -} - -static void GLAPIENTRY -save_MultiTexCoord4f(GLenum target, GLfloat x, GLfloat y, - GLfloat z, GLfloat w) -{ - GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; - save_Attr4fNV(attr, x, y, z, w); -} - -static void GLAPIENTRY -save_MultiTexCoord4fv(GLenum target, const GLfloat * v) -{ - GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; - save_Attr4fNV(attr, v[0], v[1], v[2], v[3]); -} - -static void GLAPIENTRY -save_VertexAttrib1fNV(GLuint index, GLfloat x) -{ - if (index < MAX_VERTEX_GENERIC_ATTRIBS) - save_Attr1fNV(index, x); - else - index_error(); -} - -static void GLAPIENTRY -save_VertexAttrib1fvNV(GLuint index, const GLfloat * v) -{ - if (index < MAX_VERTEX_GENERIC_ATTRIBS) - save_Attr1fNV(index, v[0]); - else - index_error(); -} - -static void GLAPIENTRY -save_VertexAttrib2fNV(GLuint index, GLfloat x, GLfloat y) -{ - if (index < MAX_VERTEX_GENERIC_ATTRIBS) - save_Attr2fNV(index, x, y); - else - index_error(); -} - -static void GLAPIENTRY -save_VertexAttrib2fvNV(GLuint index, const GLfloat * v) -{ - if (index < MAX_VERTEX_GENERIC_ATTRIBS) - save_Attr2fNV(index, v[0], v[1]); - else - index_error(); -} - -static void GLAPIENTRY -save_VertexAttrib3fNV(GLuint index, GLfloat x, GLfloat y, GLfloat z) -{ - if (index < MAX_VERTEX_GENERIC_ATTRIBS) - save_Attr3fNV(index, x, y, z); - else - index_error(); -} - -static void GLAPIENTRY -save_VertexAttrib3fvNV(GLuint index, const GLfloat * v) -{ - if (index < MAX_VERTEX_GENERIC_ATTRIBS) - save_Attr3fNV(index, v[0], v[1], v[2]); - else - index_error(); -} - -static void GLAPIENTRY -save_VertexAttrib4fNV(GLuint index, GLfloat x, GLfloat y, - GLfloat z, GLfloat w) -{ - if (index < MAX_VERTEX_GENERIC_ATTRIBS) - save_Attr4fNV(index, x, y, z, w); - else - index_error(); -} - -static void GLAPIENTRY -save_VertexAttrib4fvNV(GLuint index, const GLfloat * v) -{ - if (index < MAX_VERTEX_GENERIC_ATTRIBS) - save_Attr4fNV(index, v[0], v[1], v[2], v[3]); - else - index_error(); -} - -static void GLAPIENTRY -save_VertexAttrib1fARB(GLuint index, GLfloat x) -{ - if (index < MAX_VERTEX_GENERIC_ATTRIBS) - save_Attr1fARB(index, x); - else - index_error(); -} - -static void GLAPIENTRY -save_VertexAttrib1fvARB(GLuint index, const GLfloat * v) -{ - if (index < MAX_VERTEX_GENERIC_ATTRIBS) - save_Attr1fARB(index, v[0]); - else - index_error(); -} - -static void GLAPIENTRY -save_VertexAttrib2fARB(GLuint index, GLfloat x, GLfloat y) -{ - if (index < MAX_VERTEX_GENERIC_ATTRIBS) - save_Attr2fARB(index, x, y); - else - index_error(); -} - -static void GLAPIENTRY -save_VertexAttrib2fvARB(GLuint index, const GLfloat * v) -{ - if (index < MAX_VERTEX_GENERIC_ATTRIBS) - save_Attr2fARB(index, v[0], v[1]); - else - index_error(); -} - -static void GLAPIENTRY -save_VertexAttrib3fARB(GLuint index, GLfloat x, GLfloat y, GLfloat z) -{ - if (index < MAX_VERTEX_GENERIC_ATTRIBS) - save_Attr3fARB(index, x, y, z); - else - index_error(); -} - -static void GLAPIENTRY -save_VertexAttrib3fvARB(GLuint index, const GLfloat * v) -{ - if (index < MAX_VERTEX_GENERIC_ATTRIBS) - save_Attr3fARB(index, v[0], v[1], v[2]); - else - index_error(); -} - -static void GLAPIENTRY -save_VertexAttrib4fARB(GLuint index, GLfloat x, GLfloat y, GLfloat z, - GLfloat w) -{ - if (index < MAX_VERTEX_GENERIC_ATTRIBS) - save_Attr4fARB(index, x, y, z, w); - else - index_error(); -} - -static void GLAPIENTRY -save_VertexAttrib4fvARB(GLuint index, const GLfloat * v) -{ - if (index < MAX_VERTEX_GENERIC_ATTRIBS) - save_Attr4fARB(index, v[0], v[1], v[2], v[3]); - else - index_error(); -} - -static void GLAPIENTRY -save_VertexAttribL1d(GLuint index, GLdouble x) -{ - GET_CURRENT_CONTEXT(ctx); - - if (index < MAX_VERTEX_GENERIC_ATTRIBS) { - Node *n; - SAVE_FLUSH_VERTICES(ctx); - n = alloc_instruction(ctx, OPCODE_ATTR_1D, 3); - if (n) { - n[1].ui = index; - ASSIGN_DOUBLE_TO_NODES(n, 2, x); - } - - ctx->ListState.ActiveAttribSize[index] = 1; - memcpy(ctx->ListState.CurrentAttrib[index], &n[2], sizeof(GLdouble)); - - if (ctx->ExecuteFlag) { - CALL_VertexAttribL1d(ctx->Exec, (index, x)); - } - } else { - index_error(); - } -} - -static void GLAPIENTRY -save_VertexAttribL1dv(GLuint index, const GLdouble *v) -{ - if (index < MAX_VERTEX_GENERIC_ATTRIBS) - save_VertexAttribL1d(index, v[0]); - else - index_error(); -} - -static void GLAPIENTRY -save_VertexAttribL2d(GLuint index, GLdouble x, GLdouble y) -{ - GET_CURRENT_CONTEXT(ctx); - - if (index < MAX_VERTEX_GENERIC_ATTRIBS) { - Node *n; - SAVE_FLUSH_VERTICES(ctx); - n = alloc_instruction(ctx, OPCODE_ATTR_2D, 5); - if (n) { - n[1].ui = index; - ASSIGN_DOUBLE_TO_NODES(n, 2, x); - ASSIGN_DOUBLE_TO_NODES(n, 4, y); - } - - ctx->ListState.ActiveAttribSize[index] = 2; - memcpy(ctx->ListState.CurrentAttrib[index], &n[2], - 2 * sizeof(GLdouble)); - - if (ctx->ExecuteFlag) { - CALL_VertexAttribL2d(ctx->Exec, (index, x, y)); - } - } else { - index_error(); - } -} - -static void GLAPIENTRY -save_VertexAttribL2dv(GLuint index, const GLdouble *v) -{ - if (index < MAX_VERTEX_GENERIC_ATTRIBS) - save_VertexAttribL2d(index, v[0], v[1]); - else - index_error(); -} - -static void GLAPIENTRY -save_VertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z) -{ - GET_CURRENT_CONTEXT(ctx); - - if (index < MAX_VERTEX_GENERIC_ATTRIBS) { - Node *n; - SAVE_FLUSH_VERTICES(ctx); - n = alloc_instruction(ctx, OPCODE_ATTR_3D, 7); - if (n) { - n[1].ui = index; - ASSIGN_DOUBLE_TO_NODES(n, 2, x); - ASSIGN_DOUBLE_TO_NODES(n, 4, y); - ASSIGN_DOUBLE_TO_NODES(n, 6, z); - } - - ctx->ListState.ActiveAttribSize[index] = 3; - memcpy(ctx->ListState.CurrentAttrib[index], &n[2], - 3 * sizeof(GLdouble)); - - if (ctx->ExecuteFlag) { - CALL_VertexAttribL3d(ctx->Exec, (index, x, y, z)); - } - } else { - index_error(); - } -} - -static void GLAPIENTRY -save_VertexAttribL3dv(GLuint index, const GLdouble *v) -{ - if (index < MAX_VERTEX_GENERIC_ATTRIBS) - save_VertexAttribL3d(index, v[0], v[1], v[2]); - else - index_error(); -} - -static void GLAPIENTRY -save_VertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, - GLdouble w) -{ - GET_CURRENT_CONTEXT(ctx); - - if (index < MAX_VERTEX_GENERIC_ATTRIBS) { - Node *n; - SAVE_FLUSH_VERTICES(ctx); - n = alloc_instruction(ctx, OPCODE_ATTR_4D, 9); - if (n) { - n[1].ui = index; - ASSIGN_DOUBLE_TO_NODES(n, 2, x); - ASSIGN_DOUBLE_TO_NODES(n, 4, y); - ASSIGN_DOUBLE_TO_NODES(n, 6, z); - ASSIGN_DOUBLE_TO_NODES(n, 8, w); - } - - ctx->ListState.ActiveAttribSize[index] = 4; - memcpy(ctx->ListState.CurrentAttrib[index], &n[2], - 4 * sizeof(GLdouble)); - - if (ctx->ExecuteFlag) { - CALL_VertexAttribL4d(ctx->Exec, (index, x, y, z, w)); - } - } else { - index_error(); - } -} - -static void GLAPIENTRY -save_VertexAttribL4dv(GLuint index, const GLdouble *v) -{ - if (index < MAX_VERTEX_GENERIC_ATTRIBS) - save_VertexAttribL4d(index, v[0], v[1], v[2], v[3]); - else - index_error(); + save_EvalCoord1f(v[0]); } static void GLAPIENTRY -save_VertexAttribI1i(GLuint index, GLint x) +save_EvalCoord2f(GLfloat x, GLfloat y) { GET_CURRENT_CONTEXT(ctx); - - if (index < MAX_VERTEX_GENERIC_ATTRIBS) { - Node *n; - SAVE_FLUSH_VERTICES(ctx); - n = alloc_instruction(ctx, OPCODE_ATTR_1I, 2); - if (n) { - n[1].ui = index; - n[2].i = x; - } - - ctx->ListState.ActiveAttribSize[index] = 1; - memcpy(ctx->ListState.CurrentAttrib[index], &n[2], sizeof(GLint)); - - if (ctx->ExecuteFlag) { - CALL_VertexAttribI1iEXT(ctx->Exec, (index, x)); - } - } else { - index_error(); + Node *n; + SAVE_FLUSH_VERTICES(ctx); + n = alloc_instruction(ctx, OPCODE_EVAL_C2, 2); + if (n) { + n[1].f = x; + n[2].f = y; + } + if (ctx->ExecuteFlag) { + CALL_EvalCoord2f(ctx->Exec, (x, y)); } } static void GLAPIENTRY -save_VertexAttribI2i(GLuint index, GLint x, GLint y) +save_EvalCoord2fv(const GLfloat * v) { - GET_CURRENT_CONTEXT(ctx); - - if (index < MAX_VERTEX_GENERIC_ATTRIBS) { - Node *n; - SAVE_FLUSH_VERTICES(ctx); - n = alloc_instruction(ctx, OPCODE_ATTR_2I, 3); - if (n) { - n[1].ui = index; - n[2].i = x; - n[3].i = y; - } - - ctx->ListState.ActiveAttribSize[index] = 1; - memcpy(ctx->ListState.CurrentAttrib[index], &n[2], sizeof(GLint)); - - if (ctx->ExecuteFlag) { - CALL_VertexAttribI2iEXT(ctx->Exec, (index, x, y)); - } - } else { - index_error(); - } + save_EvalCoord2f(v[0], v[1]); } + static void GLAPIENTRY -save_VertexAttribI3i(GLuint index, GLint x, GLint y, GLint z) +save_EvalPoint1(GLint x) { GET_CURRENT_CONTEXT(ctx); - - if (index < MAX_VERTEX_GENERIC_ATTRIBS) { - Node *n; - SAVE_FLUSH_VERTICES(ctx); - n = alloc_instruction(ctx, OPCODE_ATTR_3I, 4); - if (n) { - n[1].ui = index; - n[2].i = x; - n[3].i = y; - n[4].i = z; - } - - ctx->ListState.ActiveAttribSize[index] = 1; - memcpy(ctx->ListState.CurrentAttrib[index], &n[2], sizeof(GLint)); - - if (ctx->ExecuteFlag) { - CALL_VertexAttribI3iEXT(ctx->Exec, (index, x, y, z)); - } - } else { - index_error(); + Node *n; + SAVE_FLUSH_VERTICES(ctx); + n = alloc_instruction(ctx, OPCODE_EVAL_P1, 1); + if (n) { + n[1].i = x; + } + if (ctx->ExecuteFlag) { + CALL_EvalPoint1(ctx->Exec, (x)); } } static void GLAPIENTRY -save_VertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w) +save_EvalPoint2(GLint x, GLint y) { GET_CURRENT_CONTEXT(ctx); - - if (index < MAX_VERTEX_GENERIC_ATTRIBS) { - Node *n; - SAVE_FLUSH_VERTICES(ctx); - n = alloc_instruction(ctx, OPCODE_ATTR_3I, 5); - if (n) { - n[1].ui = index; - n[2].i = x; - n[3].i = y; - n[4].i = z; - n[5].i = w; - } - - ctx->ListState.ActiveAttribSize[index] = 1; - memcpy(ctx->ListState.CurrentAttrib[index], &n[2], sizeof(GLint)); - - if (ctx->ExecuteFlag) { - CALL_VertexAttribI4iEXT(ctx->Exec, (index, x, y, z, w)); - } - } else { - index_error(); + Node *n; + SAVE_FLUSH_VERTICES(ctx); + n = alloc_instruction(ctx, OPCODE_EVAL_P2, 2); + if (n) { + n[1].i = x; + n[2].i = y; + } + if (ctx->ExecuteFlag) { + CALL_EvalPoint2(ctx->Exec, (x, y)); } } -static void GLAPIENTRY -save_VertexAttribI2iv(GLuint index, const GLint *v) -{ - save_VertexAttribI2i(index, v[0], v[1]); -} -static void GLAPIENTRY -save_VertexAttribI3iv(GLuint index, const GLint *v) +/** + * Compare 'count' elements of vectors 'a' and 'b'. + * \return GL_TRUE if equal, GL_FALSE if different. + */ +static inline GLboolean +compare_vec(const GLfloat *a, const GLfloat *b, GLuint count) { - save_VertexAttribI3i(index, v[0], v[1], v[2]); + return memcmp( a, b, count * sizeof(GLfloat) ) == 0; } + +/** + * This glMaterial function is used for glMaterial calls that are outside + * a glBegin/End pair. For glMaterial inside glBegin/End, see the VBO code. + */ static void GLAPIENTRY -save_VertexAttribI4iv(GLuint index, const GLint *v) +save_Materialfv(GLenum face, GLenum pname, const GLfloat * param) { - save_VertexAttribI4i(index, v[0], v[1], v[2], v[3]); -} + GET_CURRENT_CONTEXT(ctx); + Node *n; + int args, i; + GLuint bitmask; + switch (face) { + case GL_BACK: + case GL_FRONT: + case GL_FRONT_AND_BACK: + break; + default: + _mesa_compile_error(ctx, GL_INVALID_ENUM, "glMaterial(face)"); + return; + } + switch (pname) { + case GL_EMISSION: + case GL_AMBIENT: + case GL_DIFFUSE: + case GL_SPECULAR: + case GL_AMBIENT_AND_DIFFUSE: + args = 4; + break; + case GL_SHININESS: + args = 1; + break; + case GL_COLOR_INDEXES: + args = 3; + break; + default: + _mesa_compile_error(ctx, GL_INVALID_ENUM, "glMaterial(pname)"); + return; + } -static void GLAPIENTRY -save_VertexAttribI1ui(GLuint index, GLuint x) -{ - save_VertexAttribI1i(index, x); -} + if (ctx->ExecuteFlag) { + CALL_Materialfv(ctx->Exec, (face, pname, param)); + } -static void GLAPIENTRY -save_VertexAttribI2ui(GLuint index, GLuint x, GLuint y) -{ - save_VertexAttribI2i(index, x, y); -} + bitmask = _mesa_material_bitmask(ctx, face, pname, ~0, NULL); -static void GLAPIENTRY -save_VertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z) -{ - save_VertexAttribI3i(index, x, y, z); -} + /* Try to eliminate redundant statechanges. Because it is legal to + * call glMaterial even inside begin/end calls, don't need to worry + * about ctx->Driver.CurrentSavePrimitive here. + */ + for (i = 0; i < MAT_ATTRIB_MAX; i++) { + if (bitmask & (1 << i)) { + if (ctx->ListState.ActiveMaterialSize[i] == args && + compare_vec(ctx->ListState.CurrentMaterial[i], param, args)) { + /* no change in material value */ + bitmask &= ~(1 << i); + } + else { + ctx->ListState.ActiveMaterialSize[i] = args; + COPY_SZ_4V(ctx->ListState.CurrentMaterial[i], args, param); + } + } + } -static void GLAPIENTRY -save_VertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) -{ - save_VertexAttribI4i(index, x, y, z, w); -} + /* If this call has no effect, return early */ + if (bitmask == 0) + return; -static void GLAPIENTRY -save_VertexAttribI2uiv(GLuint index, const GLuint *v) -{ - save_VertexAttribI2i(index, v[0], v[1]); -} + SAVE_FLUSH_VERTICES(ctx); -static void GLAPIENTRY -save_VertexAttribI3uiv(GLuint index, const GLuint *v) -{ - save_VertexAttribI3i(index, v[0], v[1], v[2]); + n = alloc_instruction(ctx, OPCODE_MATERIAL, 6); + if (n) { + n[1].e = face; + n[2].e = pname; + for (i = 0; i < args; i++) + n[3 + i].f = param[i]; + } } static void GLAPIENTRY -save_VertexAttribI4uiv(GLuint index, const GLuint *v) +save_Begin(GLenum mode) { - save_VertexAttribI4i(index, v[0], v[1], v[2], v[3]); + GET_CURRENT_CONTEXT(ctx); + + if (!_mesa_is_valid_prim_mode(ctx, mode)) { + /* compile this error into the display list */ + _mesa_compile_error(ctx, GL_INVALID_ENUM, "glBegin(mode)"); + } + else if (_mesa_inside_dlist_begin_end(ctx)) { + /* compile this error into the display list */ + _mesa_compile_error(ctx, GL_INVALID_OPERATION, "recursive glBegin"); + } + else { + ctx->Driver.CurrentSavePrimitive = mode; + + vbo_save_NotifyBegin(ctx, mode, false); + } } static void GLAPIENTRY -save_VertexAttribL1ui64ARB(GLuint index, GLuint64EXT x) +save_End(void) { GET_CURRENT_CONTEXT(ctx); - - if (index < MAX_VERTEX_GENERIC_ATTRIBS) { - Node *n; - SAVE_FLUSH_VERTICES(ctx); - n = alloc_instruction(ctx, OPCODE_ATTR_1UI64, 3); - if (n) { - n[1].ui = index; - ASSIGN_UINT64_TO_NODES(n, 2, x); - } - - ctx->ListState.ActiveAttribSize[index] = 1; - memcpy(ctx->ListState.CurrentAttrib[index], &n[2], sizeof(GLdouble)); - - if (ctx->ExecuteFlag) { - CALL_VertexAttribL1ui64ARB(ctx->Exec, (index, x)); - } - } else { - index_error(); + SAVE_FLUSH_VERTICES(ctx); + (void) alloc_instruction(ctx, OPCODE_END, 0); + ctx->Driver.CurrentSavePrimitive = PRIM_OUTSIDE_BEGIN_END; + if (ctx->ExecuteFlag) { + CALL_End(ctx->Exec, ()); } } static void GLAPIENTRY -save_VertexAttribL1ui64vARB(GLuint index, const GLuint64EXT *v) +save_Rectf(GLfloat a, GLfloat b, GLfloat c, GLfloat d) { - save_VertexAttribL1ui64ARB(index, v[0]); + GET_CURRENT_CONTEXT(ctx); + Node *n; + ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); + n = alloc_instruction(ctx, OPCODE_RECTF, 4); + if (n) { + n[1].f = a; + n[2].f = b; + n[3].f = c; + n[4].f = d; + } + if (ctx->ExecuteFlag) { + CALL_Rectf(ctx->Exec, (a, b, c, d)); + } } - static void GLAPIENTRY save_PrimitiveRestartNV(void) { @@ -7658,6 +6342,171 @@ save_DispatchComputeIndirect(GLintptr indirect) "glDispatchComputeIndirect() during display list compile"); } +static void ALWAYS_INLINE +save_Attr32bit(struct gl_context *ctx, unsigned attr, unsigned size, + GLenum type, uint32_t x, uint32_t y, uint32_t z, uint32_t w) +{ + Node *n; + SAVE_FLUSH_VERTICES(ctx); + unsigned base_op; + unsigned index = attr; + + /* We don't care about GL_INT vs GL_UNSIGNED_INT. The idea is to get W=1 + * right for 3 or lower number of components, so only distinguish between + * FLOAT and INT. + */ + if (type == GL_FLOAT) { + if (attr >= VERT_ATTRIB_GENERIC0) { + base_op = OPCODE_ATTR_1F_ARB; + attr -= VERT_ATTRIB_GENERIC0; + } else { + base_op = OPCODE_ATTR_1F_NV; + } + } else { + base_op = OPCODE_ATTR_1I; + attr -= VERT_ATTRIB_GENERIC0; + } + + n = alloc_instruction(ctx, base_op + size - 1, 1 + size); + if (n) { + n[1].ui = attr; + n[2].ui = x; + if (size >= 2) n[3].ui = y; + if (size >= 3) n[4].ui = z; + if (size >= 4) n[5].ui = w; + } + + ctx->ListState.ActiveAttribSize[index] = size; + ASSIGN_4V(ctx->ListState.CurrentAttrib[index], x, y, z, w); + + if (ctx->ExecuteFlag) { + if (type == GL_FLOAT) { + if (base_op == OPCODE_ATTR_1F_NV) { + if (size == 4) + CALL_VertexAttrib4fNV(ctx->Exec, (attr, uif(x), uif(y), uif(z), uif(w))); + else if (size == 3) + CALL_VertexAttrib3fNV(ctx->Exec, (attr, uif(x), uif(y), uif(z))); + else if (size == 2) + CALL_VertexAttrib2fNV(ctx->Exec, (attr, uif(x), uif(y))); + else + CALL_VertexAttrib1fNV(ctx->Exec, (attr, uif(x))); + } else { + if (size == 4) + CALL_VertexAttrib4fARB(ctx->Exec, (attr, uif(x), uif(y), uif(z), uif(w))); + else if (size == 3) + CALL_VertexAttrib3fARB(ctx->Exec, (attr, uif(x), uif(y), uif(z))); + else if (size == 2) + CALL_VertexAttrib2fARB(ctx->Exec, (attr, uif(x), uif(y))); + else + CALL_VertexAttrib1fARB(ctx->Exec, (attr, uif(x))); + } + } else { + if (size == 4) + CALL_VertexAttribI4iEXT(ctx->Exec, (attr, x, y, z, w)); + else if (size == 3) + CALL_VertexAttribI3iEXT(ctx->Exec, (attr, x, y, z)); + else if (size == 2) + CALL_VertexAttribI2iEXT(ctx->Exec, (attr, x, y)); + else + CALL_VertexAttribI1iEXT(ctx->Exec, (attr, x)); + } + } +} + +static void ALWAYS_INLINE +save_Attr64bit(struct gl_context *ctx, unsigned attr, unsigned size, + GLenum type, uint64_t x, uint64_t y, uint64_t z, uint64_t w) +{ + Node *n; + SAVE_FLUSH_VERTICES(ctx); + unsigned base_op; + unsigned index = attr; + + if (type == GL_DOUBLE) { + base_op = OPCODE_ATTR_1D; + } else { + base_op = OPCODE_ATTR_1UI64; + assert(size == 1); + } + + attr -= VERT_ATTRIB_GENERIC0; + n = alloc_instruction(ctx, base_op + size - 1, 1 + size * 2); + if (n) { + n[1].ui = attr; + ASSIGN_UINT64_TO_NODES(n, 2, x); + if (size >= 2) ASSIGN_UINT64_TO_NODES(n, 4, y); + if (size >= 3) ASSIGN_UINT64_TO_NODES(n, 6, z); + if (size >= 4) ASSIGN_UINT64_TO_NODES(n, 8, w); + } + + ctx->ListState.ActiveAttribSize[index] = size; + memcpy(ctx->ListState.CurrentAttrib[index], &n[2], size * sizeof(uint64_t)); + + if (ctx->ExecuteFlag) { + uint64_t v[] = {x, y, z, w}; + if (type == GL_DOUBLE) { + if (size == 4) + CALL_VertexAttribL4dv(ctx->Exec, (attr, (GLdouble*)v)); + else if (size == 3) + CALL_VertexAttribL3dv(ctx->Exec, (attr, (GLdouble*)v)); + else if (size == 2) + CALL_VertexAttribL2dv(ctx->Exec, (attr, (GLdouble*)v)); + else + CALL_VertexAttribL1d(ctx->Exec, (attr, UINT64_AS_DOUBLE(x))); + } else { + CALL_VertexAttribL1ui64ARB(ctx->Exec, (attr, x)); + } + } +} + +/** + * 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_dlist_begin_end(ctx)); +} + +/** + * This macro is used to implement all the glVertex, glColor, glTexCoord, + * glVertexAttrib, etc functions. + * \param A VBO_ATTRIB_x attribute index + * \param N attribute size (1..4) + * \param T type (GL_FLOAT, GL_DOUBLE, GL_INT, GL_UNSIGNED_INT) + * \param C cast type (uint32_t or uint64_t) + * \param V0, V1, v2, V3 attribute value + */ +#define ATTR_UNION(A, N, T, C, V0, V1, V2, V3) \ +do { \ + if (sizeof(C) == 4) { \ + save_Attr32bit(ctx, A, N, T, V0, V1, V2, V3); \ + } else { \ + save_Attr64bit(ctx, A, N, T, V0, V1, V2, V3); \ + } \ +} while (0) + +#undef ERROR +#define ERROR(err) _mesa_error(ctx, err, __func__) +#define TAG(x) save_##x + +#define VBO_ATTRIB_POS VERT_ATTRIB_POS +#define VBO_ATTRIB_NORMAL VERT_ATTRIB_NORMAL +#define VBO_ATTRIB_COLOR0 VERT_ATTRIB_COLOR0 +#define VBO_ATTRIB_COLOR1 VERT_ATTRIB_COLOR1 +#define VBO_ATTRIB_FOG VERT_ATTRIB_FOG +#define VBO_ATTRIB_COLOR_INDEX VERT_ATTRIB_COLOR_INDEX +#define VBO_ATTRIB_EDGEFLAG VERT_ATTRIB_EDGEFLAG +#define VBO_ATTRIB_TEX0 VERT_ATTRIB_TEX0 +#define VBO_ATTRIB_GENERIC0 VERT_ATTRIB_GENERIC0 +#define VBO_ATTRIB_MAX VERT_ATTRIB_MAX + +#include "vbo/vbo_attrib_tmp.h" + static void GLAPIENTRY save_UseProgram(GLuint program) { diff --git a/src/mesa/main/macros.h b/src/mesa/main/macros.h index 8b09e7b20e9..efdb0a09570 100644 --- a/src/mesa/main/macros.h +++ b/src/mesa/main/macros.h @@ -204,6 +204,16 @@ static inline uint64_t DOUBLE_AS_UINT64(double d) return tmp.u64; } +static inline double UINT64_AS_DOUBLE(uint64_t u) +{ + union { + double d; + uint64_t u64; + } tmp; + tmp.u64 = u; + return tmp.d; +} + /* First sign-extend x, then return uint32_t. */ #define INT_AS_UINT(x) ((uint32_t)((int32_t)(x))) #define FLOAT_AS_UINT(x) (FLOAT_AS_UNION(x).u) diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index c7889668f58..f267bb723ca 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -4584,7 +4584,7 @@ struct gl_dlist_state GLvertexformat ListVtxfmt; GLubyte ActiveAttribSize[VERT_ATTRIB_MAX]; - GLfloat CurrentAttrib[VERT_ATTRIB_MAX][8]; + uint32_t CurrentAttrib[VERT_ATTRIB_MAX][8]; GLubyte ActiveMaterialSize[MAT_ATTRIB_MAX]; GLfloat CurrentMaterial[MAT_ATTRIB_MAX][4]; diff --git a/src/mesa/main/vtxfmt.c b/src/mesa/main/vtxfmt.c index 3e96c7d2fba..f5ef0ac56c3 100644 --- a/src/mesa/main/vtxfmt.c +++ b/src/mesa/main/vtxfmt.c @@ -111,7 +111,7 @@ install_vtxfmt(struct gl_context *ctx, struct _glapi_table *tab, SET_PrimitiveRestartNV(tab, vfmt->PrimitiveRestartNV); } - /* Originally for GL_NV_vertex_program, this is also used by dlist.c */ + /* Originally for GL_NV_vertex_program, this is now only used by dlist.c */ if (ctx->API == API_OPENGL_COMPAT) { SET_VertexAttrib1fNV(tab, vfmt->VertexAttrib1fNV); SET_VertexAttrib1fvNV(tab, vfmt->VertexAttrib1fvNV); -- 2.30.2