-static void
-_ae_update_state(struct gl_context *ctx)
-{
- AEcontext *actx = AE_CONTEXT(ctx);
- AEarray *aa = actx->arrays; /* non-indexed arrays (ex: glNormal) */
- AEattrib *at = actx->attribs; /* indexed arrays (ex: glMultiTexCoord) */
- GLuint i;
- struct gl_vertex_array_object *vao = ctx->Array.VAO;
-
- actx->nr_vbos = 0;
-
- /* conventional vertex arrays */
- if (vao->VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Enabled) {
- aa->array = &vao->VertexAttrib[VERT_ATTRIB_COLOR_INDEX];
- aa->binding = &vao->VertexBinding[aa->array->VertexBinding];
- aa->offset = IndexFuncs[TYPE_IDX(aa->array->Type)];
- check_vbo(actx, aa->binding->BufferObj);
- aa++;
- }
-
- if (vao->VertexAttrib[VERT_ATTRIB_EDGEFLAG].Enabled) {
- aa->array = &vao->VertexAttrib[VERT_ATTRIB_EDGEFLAG];
- aa->binding = &vao->VertexBinding[aa->array->VertexBinding];
- aa->offset = _gloffset_EdgeFlagv;
- check_vbo(actx, aa->binding->BufferObj);
- aa++;
- }
-
- if (vao->VertexAttrib[VERT_ATTRIB_NORMAL].Enabled) {
- aa->array = &vao->VertexAttrib[VERT_ATTRIB_NORMAL];
- aa->binding = &vao->VertexBinding[aa->array->VertexBinding];
- aa->offset = NormalFuncs[TYPE_IDX(aa->array->Type)];
- check_vbo(actx, aa->binding->BufferObj);
- aa++;
- }
-
- if (vao->VertexAttrib[VERT_ATTRIB_COLOR0].Enabled) {
- aa->array = &vao->VertexAttrib[VERT_ATTRIB_COLOR0];
- aa->binding = &vao->VertexBinding[aa->array->VertexBinding];
- aa->offset = ColorFuncs[aa->array->Size-3][TYPE_IDX(aa->array->Type)];
- check_vbo(actx, aa->binding->BufferObj);
- aa++;
- }
-
- if (vao->VertexAttrib[VERT_ATTRIB_COLOR1].Enabled) {
- aa->array = &vao->VertexAttrib[VERT_ATTRIB_COLOR1];
- aa->binding = &vao->VertexBinding[aa->array->VertexBinding];
- aa->offset = SecondaryColorFuncs[TYPE_IDX(aa->array->Type)];
- check_vbo(actx, aa->binding->BufferObj);
- aa++;
- }
-
- if (vao->VertexAttrib[VERT_ATTRIB_FOG].Enabled) {
- aa->array = &vao->VertexAttrib[VERT_ATTRIB_FOG];
- aa->binding = &vao->VertexBinding[aa->array->VertexBinding];
- aa->offset = FogCoordFuncs[TYPE_IDX(aa->array->Type)];
- check_vbo(actx, aa->binding->BufferObj);
- aa++;
- }
-
- for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) {
- struct gl_vertex_attrib_array *attribArray =
- &vao->VertexAttrib[VERT_ATTRIB_TEX(i)];
- if (attribArray->Enabled) {
- /* NOTE: we use generic glVertexAttribNV functions here.
- * If we ever remove GL_NV_vertex_program this will have to change.
- */
- at->array = attribArray;
- at->binding = &vao->VertexBinding[attribArray->VertexBinding];
- assert(!at->array->Normalized);
- at->func = AttribFuncsNV[at->array->Normalized]
- [at->array->Size-1]
- [TYPE_IDX(at->array->Type)];
- at->index = VERT_ATTRIB_TEX0 + i;
- check_vbo(actx, at->binding->BufferObj);
- at++;
- }
- }
-
- /* generic vertex attribute arrays */
- for (i = 1; i < VERT_ATTRIB_GENERIC_MAX; i++) { /* skip zero! */
- struct gl_vertex_attrib_array *attribArray =
- &vao->VertexAttrib[VERT_ATTRIB_GENERIC(i)];
- if (attribArray->Enabled) {
- GLint intOrNorm;
- at->array = attribArray;
- at->binding = &vao->VertexBinding[attribArray->VertexBinding];
- /* Note: we can't grab the _glapi_Dispatch->VertexAttrib1fvNV
- * function pointer here (for float arrays) since the pointer may
- * change from one execution of _ae_ArrayElement() to
- * the next. Doing so caused UT to break.
- */
- if (at->array->Doubles)
- intOrNorm = 3;
- else if (at->array->Integer)
- intOrNorm = 2;
- else if (at->array->Normalized)
- intOrNorm = 1;
- else
- intOrNorm = 0;
-
- at->func = AttribFuncsARB[intOrNorm]
- [at->array->Size-1]
- [TYPE_IDX(at->array->Type)];
-
- at->index = i;
- check_vbo(actx, at->binding->BufferObj);
- at++;
- }
- }
-
- /* finally, vertex position */
- if (vao->VertexAttrib[VERT_ATTRIB_GENERIC0].Enabled) {
- /* Use glVertex(v) instead of glVertexAttrib(0, v) to be sure it's
- * issued as the last (provoking) attribute).
- */
- aa->array = &vao->VertexAttrib[VERT_ATTRIB_GENERIC0];
- aa->binding = &vao->VertexBinding[aa->array->VertexBinding];
- assert(aa->array->Size >= 2); /* XXX fix someday? */
- aa->offset = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)];
- check_vbo(actx, aa->binding->BufferObj);
- aa++;
- }
- else if (vao->VertexAttrib[VERT_ATTRIB_POS].Enabled) {
- aa->array = &vao->VertexAttrib[VERT_ATTRIB_POS];
- aa->binding = &vao->VertexBinding[aa->array->VertexBinding];
- aa->offset = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)];
- check_vbo(actx, aa->binding->BufferObj);
- aa++;
- }
-
- check_vbo(actx, vao->IndexBufferObj);
-
- assert(at - actx->attribs <= VERT_ATTRIB_MAX);
- assert(aa - actx->arrays < 32);
- at->func = NULL; /* terminate the list */
- aa->offset = -1; /* terminate the list */
-
- actx->NewState = 0;