X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fvbo%2Fvbo_save_api.c;h=9041f791edd9c7c90ba7010249ce086a76cf913f;hb=4683529048ee133481b2d8f1cae1685aa1736f9a;hp=3f86c68b249c1679688a856e90a65a2e5e3266d7;hpb=ce3801ab87ef6eb29e5b81c2acfdd102f7b9c0ae;p=mesa.git diff --git a/src/mesa/vbo/vbo_save_api.c b/src/mesa/vbo/vbo_save_api.c index 3f86c68b249..9041f791edd 100644 --- a/src/mesa/vbo/vbo_save_api.c +++ b/src/mesa/vbo/vbo_save_api.c @@ -74,15 +74,19 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include "main/enums.h" #include "main/eval.h" #include "main/macros.h" +#include "main/mfeatures.h" #include "main/api_noop.h" #include "main/api_validate.h" #include "main/api_arrayelt.h" #include "main/vtxfmt.h" -#include "glapi/dispatch.h" +#include "main/dispatch.h" #include "vbo_context.h" +#if FEATURE_dlist + + #ifdef ERROR #undef ERROR #endif @@ -96,12 +100,13 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. * NOTE: Old 'parity' issue is gone, but copying can still be * wrong-footed on replay. */ -static GLuint _save_copy_vertices( GLcontext *ctx, - const struct vbo_save_vertex_list *node, - const GLfloat *src_buffer) +static GLuint +_save_copy_vertices(struct gl_context *ctx, + const struct vbo_save_vertex_list *node, + const GLfloat * src_buffer) { - struct vbo_save_context *save = &vbo_context( ctx )->save; - const struct _mesa_prim *prim = &node->prim[node->prim_count-1]; + struct vbo_save_context *save = &vbo_context(ctx)->save; + const struct _mesa_prim *prim = &node->prim[node->prim_count - 1]; GLuint nr = prim->count; GLuint sz = save->vertex_size; const GLfloat *src = src_buffer + prim->start * sz; @@ -110,55 +115,65 @@ static GLuint _save_copy_vertices( GLcontext *ctx, if (prim->end) return 0; - - switch( prim->mode ) - { + + switch (prim->mode) { case GL_POINTS: return 0; case GL_LINES: - ovf = nr&1; - for (i = 0 ; i < ovf ; i++) - _mesa_memcpy( dst+i*sz, src+(nr-ovf+i)*sz, sz*sizeof(GLfloat) ); + ovf = nr & 1; + for (i = 0; i < ovf; i++) + memcpy(dst + i * sz, src + (nr - ovf + i) * sz, + sz * sizeof(GLfloat)); return i; case GL_TRIANGLES: - ovf = nr%3; - for (i = 0 ; i < ovf ; i++) - _mesa_memcpy( dst+i*sz, src+(nr-ovf+i)*sz, sz*sizeof(GLfloat) ); + ovf = nr % 3; + for (i = 0; i < ovf; i++) + memcpy(dst + i * sz, src + (nr - ovf + i) * sz, + sz * sizeof(GLfloat)); return i; case GL_QUADS: - ovf = nr&3; - for (i = 0 ; i < ovf ; i++) - _mesa_memcpy( dst+i*sz, src+(nr-ovf+i)*sz, sz*sizeof(GLfloat) ); + ovf = nr & 3; + for (i = 0; i < ovf; i++) + memcpy(dst + i * sz, src + (nr - ovf + i) * sz, + sz * sizeof(GLfloat)); return i; case GL_LINE_STRIP: - if (nr == 0) - return 0; + if (nr == 0) + return 0; else { - _mesa_memcpy( dst, src+(nr-1)*sz, sz*sizeof(GLfloat) ); - return 1; + memcpy(dst, src + (nr - 1) * sz, sz * sizeof(GLfloat)); + return 1; } case GL_LINE_LOOP: case GL_TRIANGLE_FAN: case GL_POLYGON: - if (nr == 0) - return 0; + if (nr == 0) + return 0; else if (nr == 1) { - _mesa_memcpy( dst, src+0, sz*sizeof(GLfloat) ); - return 1; - } else { - _mesa_memcpy( dst, src+0, sz*sizeof(GLfloat) ); - _mesa_memcpy( dst+sz, src+(nr-1)*sz, sz*sizeof(GLfloat) ); - return 2; + memcpy(dst, src + 0, sz * sizeof(GLfloat)); + return 1; + } + else { + memcpy(dst, src + 0, sz * sizeof(GLfloat)); + memcpy(dst + sz, src + (nr - 1) * sz, sz * sizeof(GLfloat)); + return 2; } case GL_TRIANGLE_STRIP: case GL_QUAD_STRIP: switch (nr) { - case 0: ovf = 0; break; - case 1: ovf = 1; break; - default: ovf = 2 + (nr&1); break; + case 0: + ovf = 0; + break; + case 1: + ovf = 1; + break; + default: + ovf = 2 + (nr & 1); + break; } - for (i = 0 ; i < ovf ; i++) - _mesa_memcpy( dst+i*sz, src+(nr-ovf+i)*sz, sz*sizeof(GLfloat) ); + for (i = 0; i < ovf; i++) + memcpy(dst + i * sz, src + (nr - ovf + i) * sz, + sz * sizeof(GLfloat)); return i; default: assert(0); @@ -167,9 +182,11 @@ static GLuint _save_copy_vertices( GLcontext *ctx, } -static struct vbo_save_vertex_store *alloc_vertex_store( GLcontext *ctx ) +static struct vbo_save_vertex_store * +alloc_vertex_store(struct gl_context *ctx) { - struct vbo_save_vertex_store *vertex_store = CALLOC_STRUCT(vbo_save_vertex_store); + struct vbo_save_vertex_store *vertex_store = + CALLOC_STRUCT(vbo_save_vertex_store); /* obj->Name needs to be non-zero, but won't ever be examined more * closely than that. In particular these buffers won't be entered @@ -181,12 +198,10 @@ static struct vbo_save_vertex_store *alloc_vertex_store( GLcontext *ctx ) VBO_BUF_ID, GL_ARRAY_BUFFER_ARB); - ctx->Driver.BufferData( ctx, - GL_ARRAY_BUFFER_ARB, - VBO_SAVE_BUFFER_SIZE * sizeof(GLfloat), - NULL, - GL_STATIC_DRAW_ARB, - vertex_store->bufferobj); + ctx->Driver.BufferData(ctx, + GL_ARRAY_BUFFER_ARB, + VBO_SAVE_BUFFER_SIZE * sizeof(GLfloat), + NULL, GL_STATIC_DRAW_ARB, vertex_store->bufferobj); vertex_store->buffer = NULL; vertex_store->used = 0; @@ -195,7 +210,10 @@ static struct vbo_save_vertex_store *alloc_vertex_store( GLcontext *ctx ) return vertex_store; } -static void free_vertex_store( GLcontext *ctx, struct vbo_save_vertex_store *vertex_store ) + +static void +free_vertex_store(struct gl_context *ctx, + struct vbo_save_vertex_store *vertex_store) { assert(!vertex_store->buffer); @@ -203,51 +221,62 @@ static void free_vertex_store( GLcontext *ctx, struct vbo_save_vertex_store *ver _mesa_reference_buffer_object(ctx, &vertex_store->bufferobj, NULL); } - FREE( vertex_store ); + FREE(vertex_store); } -static GLfloat *map_vertex_store( GLcontext *ctx, struct vbo_save_vertex_store *vertex_store ) + +static GLfloat * +map_vertex_store(struct gl_context *ctx, + struct vbo_save_vertex_store *vertex_store) { assert(vertex_store->bufferobj); assert(!vertex_store->buffer); - vertex_store->buffer = (GLfloat *)ctx->Driver.MapBuffer(ctx, - GL_ARRAY_BUFFER_ARB, /* not used */ - GL_WRITE_ONLY, /* not used */ - vertex_store->bufferobj); + vertex_store->buffer = + (GLfloat *) ctx->Driver.MapBuffer(ctx, + GL_ARRAY_BUFFER_ARB, /* not used */ + GL_WRITE_ONLY, /* not used */ + vertex_store-> + bufferobj); assert(vertex_store->buffer); return vertex_store->buffer + vertex_store->used; } -static void unmap_vertex_store( GLcontext *ctx, struct vbo_save_vertex_store *vertex_store ) + +static void +unmap_vertex_store(struct gl_context *ctx, + struct vbo_save_vertex_store *vertex_store) { - ctx->Driver.UnmapBuffer( ctx, GL_ARRAY_BUFFER_ARB, vertex_store->bufferobj ); + ctx->Driver.UnmapBuffer(ctx, GL_ARRAY_BUFFER_ARB, vertex_store->bufferobj); vertex_store->buffer = NULL; } -static struct vbo_save_primitive_store *alloc_prim_store( GLcontext *ctx ) +static struct vbo_save_primitive_store * +alloc_prim_store(struct gl_context *ctx) { - struct vbo_save_primitive_store *store = CALLOC_STRUCT(vbo_save_primitive_store); + struct vbo_save_primitive_store *store = + CALLOC_STRUCT(vbo_save_primitive_store); (void) ctx; store->used = 0; store->refcount = 1; return store; } -static void _save_reset_counters( GLcontext *ctx ) + +static void +_save_reset_counters(struct gl_context *ctx) { struct vbo_save_context *save = &vbo_context(ctx)->save; save->prim = save->prim_store->buffer + save->prim_store->used; - save->buffer = (save->vertex_store->buffer + - save->vertex_store->used); + save->buffer = save->vertex_store->buffer + save->vertex_store->used; assert(save->buffer == save->buffer_ptr); if (save->vertex_size) - save->max_vert = ((VBO_SAVE_BUFFER_SIZE - save->vertex_store->used) / - save->vertex_size); + save->max_vert = ((VBO_SAVE_BUFFER_SIZE - save->vertex_store->used) / + save->vertex_size); else save->max_vert = 0; @@ -258,10 +287,12 @@ static void _save_reset_counters( GLcontext *ctx ) } -/* Insert the active immediate struct onto the display list currently +/** + * Insert the active immediate struct onto the display list currently * being built. */ -static void _save_compile_vertex_list( GLcontext *ctx ) +static void +_save_compile_vertex_list(struct gl_context *ctx) { struct vbo_save_context *save = &vbo_context(ctx)->save; struct vbo_save_vertex_list *node; @@ -277,9 +308,10 @@ static void _save_compile_vertex_list( GLcontext *ctx ) /* Duplicate our template, increment refcounts to the storage structs: */ - _mesa_memcpy(node->attrsz, save->attrsz, sizeof(node->attrsz)); + memcpy(node->attrsz, save->attrsz, sizeof(node->attrsz)); node->vertex_size = save->vertex_size; - node->buffer_offset = (save->buffer - save->vertex_store->buffer) * sizeof(GLfloat); + node->buffer_offset = + (save->buffer - save->vertex_store->buffer) * sizeof(GLfloat); node->count = save->vert_count; node->wrap_count = save->copied.nr; node->dangling_attr_ref = save->dangling_attr_ref; @@ -291,33 +323,36 @@ static void _save_compile_vertex_list( GLcontext *ctx ) node->vertex_store->refcount++; node->prim_store->refcount++; + if (node->prim[0].no_current_update) { + node->current_size = 0; + node->current_data = NULL; + } + else { + node->current_size = node->vertex_size - node->attrsz[0]; + node->current_data = NULL; - node->current_size = node->vertex_size - node->attrsz[0]; - node->current_data = NULL; - - if (node->current_size) { - /* If the malloc fails, we just pull the data out of the VBO - * later instead. - */ - node->current_data = MALLOC( node->current_size * sizeof(GLfloat) ); - if (node->current_data) { - const char *buffer = (const char *)save->vertex_store->buffer; - unsigned attr_offset = node->attrsz[0] * sizeof(GLfloat); - unsigned vertex_offset = 0; - - if (node->count) - vertex_offset = (node->count-1) * node->vertex_size * sizeof(GLfloat); - - memcpy( node->current_data, - buffer + node->buffer_offset + vertex_offset + attr_offset, - node->current_size * sizeof(GLfloat) ); + if (node->current_size) { + /* If the malloc fails, we just pull the data out of the VBO + * later instead. + */ + node->current_data = MALLOC(node->current_size * sizeof(GLfloat)); + if (node->current_data) { + const char *buffer = (const char *) save->vertex_store->buffer; + unsigned attr_offset = node->attrsz[0] * sizeof(GLfloat); + unsigned vertex_offset = 0; + + if (node->count) + vertex_offset = + (node->count - 1) * node->vertex_size * sizeof(GLfloat); + + memcpy(node->current_data, + buffer + node->buffer_offset + vertex_offset + attr_offset, + node->current_size * sizeof(GLfloat)); + } } } - - - assert(node->attrsz[VBO_ATTRIB_POS] != 0 || - node->count == 0); + assert(node->attrsz[VBO_ATTRIB_POS] != 0 || node->count == 0); if (save->dangling_attr_ref) ctx->ListState.CurrentList->Flags |= DLIST_DANGLING_REFS; @@ -325,11 +360,9 @@ static void _save_compile_vertex_list( GLcontext *ctx ) save->vertex_store->used += save->vertex_size * node->count; save->prim_store->used += node->prim_count; - /* Copy duplicated vertices */ - save->copied.nr = _save_copy_vertices( ctx, node, save->buffer ); - + save->copied.nr = _save_copy_vertices(ctx, node, save->buffer); /* Deal with GL_COMPILE_AND_EXECUTE: */ @@ -338,95 +371,97 @@ static void _save_compile_vertex_list( GLcontext *ctx ) _glapi_set_dispatch(ctx->Exec); - vbo_loopback_vertex_list( ctx, - (const GLfloat *)((const char *)save->vertex_store->buffer + - node->buffer_offset), - node->attrsz, - node->prim, - node->prim_count, - node->wrap_count, - node->vertex_size); + vbo_loopback_vertex_list(ctx, + (const GLfloat *) ((const char *) save-> + vertex_store->buffer + + node->buffer_offset), + node->attrsz, node->prim, node->prim_count, + node->wrap_count, node->vertex_size); _glapi_set_dispatch(dispatch); } - /* Decide whether the storage structs are full, or can be used for * the next vertex lists as well. */ - if (save->vertex_store->used > + if (save->vertex_store->used > VBO_SAVE_BUFFER_SIZE - 16 * (save->vertex_size + 4)) { /* Unmap old store: */ - unmap_vertex_store( ctx, save->vertex_store ); + unmap_vertex_store(ctx, save->vertex_store); /* Release old reference: */ - save->vertex_store->refcount--; + save->vertex_store->refcount--; assert(save->vertex_store->refcount != 0); save->vertex_store = NULL; /* Allocate and map new store: */ - save->vertex_store = alloc_vertex_store( ctx ); - save->buffer_ptr = map_vertex_store( ctx, save->vertex_store ); - } + save->vertex_store = alloc_vertex_store(ctx); + save->buffer_ptr = map_vertex_store(ctx, save->vertex_store); + } if (save->prim_store->used > VBO_SAVE_PRIM_SIZE - 6) { - save->prim_store->refcount--; + save->prim_store->refcount--; assert(save->prim_store->refcount != 0); - save->prim_store = alloc_prim_store( ctx ); - } + save->prim_store = alloc_prim_store(ctx); + } /* Reset our structures for the next run of vertices: */ - _save_reset_counters( ctx ); + _save_reset_counters(ctx); } -/* TODO -- If no new vertices have been stored, don't bother saving - * it. +/** + * TODO -- If no new vertices have been stored, don't bother saving it. */ -static void _save_wrap_buffers( GLcontext *ctx ) +static void +_save_wrap_buffers(struct gl_context *ctx) { struct vbo_save_context *save = &vbo_context(ctx)->save; GLint i = save->prim_count - 1; GLenum mode; GLboolean weak; + GLboolean no_current_update; assert(i < (GLint) save->prim_max); assert(i >= 0); /* Close off in-progress primitive. */ - save->prim[i].count = (save->vert_count - - save->prim[i].start); + save->prim[i].count = (save->vert_count - save->prim[i].start); mode = save->prim[i].mode; weak = save->prim[i].weak; - + no_current_update = save->prim[i].no_current_update; + /* store the copied vertices, and allocate a new list. */ - _save_compile_vertex_list( ctx ); + _save_compile_vertex_list(ctx); /* Restart interrupted primitive */ save->prim[0].mode = mode; save->prim[0].weak = weak; + save->prim[0].no_current_update = no_current_update; save->prim[0].begin = 0; save->prim[0].end = 0; save->prim[0].pad = 0; save->prim[0].start = 0; save->prim[0].count = 0; + save->prim[0].num_instances = 1; save->prim_count = 1; } - -/* Called only when buffers are wrapped as the result of filling the +/** + * Called only when buffers are wrapped as the result of filling the * vertex_store struct. */ -static void _save_wrap_filled_vertex( GLcontext *ctx ) +static void +_save_wrap_filled_vertex(struct gl_context *ctx) { struct vbo_save_context *save = &vbo_context(ctx)->save; GLfloat *data = save->copied.buffer; @@ -434,14 +469,14 @@ static void _save_wrap_filled_vertex( GLcontext *ctx ) /* Emit a glEnd to close off the last vertex list. */ - _save_wrap_buffers( ctx ); - - /* Copy stored stored vertices to start of new list. + _save_wrap_buffers(ctx); + + /* Copy stored stored vertices to start of new list. */ assert(save->max_vert - save->vert_count > save->copied.nr); - for (i = 0 ; i < save->copied.nr ; i++) { - _mesa_memcpy( save->buffer_ptr, data, save->vertex_size * sizeof(GLfloat)); + for (i = 0; i < save->copied.nr; i++) { + memcpy(save->buffer_ptr, data, save->vertex_size * sizeof(GLfloat)); data += save->vertex_size; save->buffer_ptr += save->vertex_size; save->vert_count++; @@ -449,46 +484,48 @@ static void _save_wrap_filled_vertex( GLcontext *ctx ) } -static void _save_copy_to_current( GLcontext *ctx ) +static void +_save_copy_to_current(struct gl_context *ctx) { - struct vbo_save_context *save = &vbo_context(ctx)->save; + struct vbo_save_context *save = &vbo_context(ctx)->save; GLuint i; - for (i = VBO_ATTRIB_POS+1 ; i < VBO_ATTRIB_MAX ; i++) { + for (i = VBO_ATTRIB_POS + 1; i < VBO_ATTRIB_MAX; i++) { if (save->attrsz[i]) { - save->currentsz[i][0] = save->attrsz[i]; - COPY_CLEAN_4V(save->current[i], - save->attrsz[i], - save->attrptr[i]); + save->currentsz[i][0] = save->attrsz[i]; + COPY_CLEAN_4V(save->current[i], save->attrsz[i], save->attrptr[i]); } } } -static void _save_copy_from_current( GLcontext *ctx ) +static void +_save_copy_from_current(struct gl_context *ctx) { - struct vbo_save_context *save = &vbo_context(ctx)->save; + struct vbo_save_context *save = &vbo_context(ctx)->save; GLint i; - for (i = VBO_ATTRIB_POS+1 ; i < VBO_ATTRIB_MAX ; i++) { + for (i = VBO_ATTRIB_POS + 1; i < VBO_ATTRIB_MAX; i++) { switch (save->attrsz[i]) { - case 4: save->attrptr[i][3] = save->current[i][3]; - case 3: save->attrptr[i][2] = save->current[i][2]; - case 2: save->attrptr[i][1] = save->current[i][1]; - case 1: save->attrptr[i][0] = save->current[i][0]; - case 0: break; + case 4: + save->attrptr[i][3] = save->current[i][3]; + case 3: + save->attrptr[i][2] = save->current[i][2]; + case 2: + save->attrptr[i][1] = save->current[i][1]; + case 1: + save->attrptr[i][0] = save->current[i][0]; + case 0: + break; } } } - - /* Flush existing data, set new attrib size, replay copied vertices. - */ -static void _save_upgrade_vertex( GLcontext *ctx, - GLuint attr, - GLuint newsz ) + */ +static void +_save_upgrade_vertex(struct gl_context *ctx, GLuint attr, GLuint newsz) { struct vbo_save_context *save = &vbo_context(ctx)->save; GLuint oldsz; @@ -498,16 +535,16 @@ static void _save_upgrade_vertex( GLcontext *ctx, /* Store the current run of vertices, and emit a GL_END. Emit a * BEGIN in the new buffer. */ - if (save->vert_count) - _save_wrap_buffers( ctx ); + if (save->vert_count) + _save_wrap_buffers(ctx); else - assert( save->copied.nr == 0 ); + assert(save->copied.nr == 0); /* Do a COPY_TO_CURRENT to ensure back-copying works for the case * when the attribute already exists in the vertex and is having * its size increased. */ - _save_copy_to_current( ctx ); + _save_copy_to_current(ctx); /* Fix up sizes: */ @@ -515,24 +552,25 @@ static void _save_upgrade_vertex( GLcontext *ctx, save->attrsz[attr] = newsz; save->vertex_size += newsz - oldsz; - save->max_vert = ((VBO_SAVE_BUFFER_SIZE - save->vertex_store->used) / - save->vertex_size); + save->max_vert = ((VBO_SAVE_BUFFER_SIZE - save->vertex_store->used) / + save->vertex_size); save->vert_count = 0; /* Recalculate all the attrptr[] values: */ - for (i = 0, tmp = save->vertex ; i < VBO_ATTRIB_MAX ; i++) { + for (i = 0, tmp = save->vertex; i < VBO_ATTRIB_MAX; i++) { if (save->attrsz[i]) { - save->attrptr[i] = tmp; - tmp += save->attrsz[i]; + save->attrptr[i] = tmp; + tmp += save->attrsz[i]; + } + else { + save->attrptr[i] = NULL; /* will not be dereferenced. */ } - else - save->attrptr[i] = NULL; /* will not be dereferenced. */ } /* Copy from current to repopulate the vertex with correct values. */ - _save_copy_from_current( ctx ); + _save_copy_from_current(ctx); /* Replay stored vertices to translate them to new format here. * @@ -540,8 +578,7 @@ static void _save_upgrade_vertex( GLcontext *ctx, * has not been defined before, this list is somewhat degenerate, * and will need fixup at runtime. */ - if (save->copied.nr) - { + if (save->copied.nr) { GLfloat *data = save->copied.buffer; GLfloat *dest = save->buffer; GLuint j; @@ -549,32 +586,32 @@ static void _save_upgrade_vertex( GLcontext *ctx, /* Need to note this and fix up at runtime (or loopback): */ if (attr != VBO_ATTRIB_POS && save->currentsz[attr][0] == 0) { - assert(oldsz == 0); - save->dangling_attr_ref = GL_TRUE; + assert(oldsz == 0); + save->dangling_attr_ref = GL_TRUE; } - for (i = 0 ; i < save->copied.nr ; i++) { - for (j = 0 ; j < VBO_ATTRIB_MAX ; j++) { - if (save->attrsz[j]) { - if (j == attr) { - if (oldsz) { - COPY_CLEAN_4V( dest, oldsz, data ); - data += oldsz; - dest += newsz; - } - else { - COPY_SZ_4V( dest, newsz, save->current[attr] ); - dest += newsz; - } - } - else { - GLint sz = save->attrsz[j]; - COPY_SZ_4V( dest, sz, data ); - data += sz; - dest += sz; - } - } - } + for (i = 0; i < save->copied.nr; i++) { + for (j = 0; j < VBO_ATTRIB_MAX; j++) { + if (save->attrsz[j]) { + if (j == attr) { + if (oldsz) { + COPY_CLEAN_4V(dest, oldsz, data); + data += oldsz; + dest += newsz; + } + else { + COPY_SZ_4V(dest, newsz, save->current[attr]); + dest += newsz; + } + } + else { + GLint sz = save->attrsz[j]; + COPY_SZ_4V(dest, sz, data); + data += sz; + dest += sz; + } + } + } } save->buffer_ptr = dest; @@ -582,15 +619,17 @@ static void _save_upgrade_vertex( GLcontext *ctx, } } -static void save_fixup_vertex( GLcontext *ctx, GLuint attr, GLuint sz ) + +static void +save_fixup_vertex(struct gl_context *ctx, GLuint attr, GLuint sz) { - struct vbo_save_context *save = &vbo_context(ctx)->save; + struct vbo_save_context *save = &vbo_context(ctx)->save; if (sz > save->attrsz[attr]) { /* New size is larger. Need to flush existing vertices and get * an enlarged vertex format. */ - _save_upgrade_vertex( ctx, attr, sz ); + _save_upgrade_vertex(ctx, attr, sz); } else if (sz < save->active_sz[attr]) { static GLfloat id[4] = { 0, 0, 0, 1 }; @@ -599,29 +638,31 @@ static void save_fixup_vertex( GLcontext *ctx, GLuint attr, GLuint sz ) /* New size is equal or smaller - just need to fill in some * zeros. */ - for (i = sz ; i <= save->attrsz[attr] ; i++) - save->attrptr[attr][i-1] = id[i-1]; + for (i = sz; i <= save->attrsz[attr]; i++) + save->attrptr[attr][i - 1] = id[i - 1]; } save->active_sz[attr] = sz; } -static void _save_reset_vertex( GLcontext *ctx ) + +static void +_save_reset_vertex(struct gl_context *ctx) { struct vbo_save_context *save = &vbo_context(ctx)->save; GLuint i; - for (i = 0 ; i < VBO_ATTRIB_MAX ; i++) { + for (i = 0; i < VBO_ATTRIB_MAX; i++) { save->attrsz[i] = 0; save->active_sz[i] = 0; } - + save->vertex_size = 0; } -#define ERROR() _mesa_compile_error( ctx, GL_INVALID_ENUM, __FUNCTION__ ); +#define ERROR(err) _mesa_compile_error(ctx, err, __FUNCTION__); /* Only one size for each attribute may be active at once. Eg. if @@ -630,15 +671,15 @@ static void _save_reset_vertex( GLcontext *ctx ) * 3f version won't otherwise set color[3] to 1.0 -- this is the job * of the chooser function when switching between Color4f and Color3f. */ -#define ATTR( A, N, V0, V1, V2, V3 ) \ +#define ATTR(A, N, V0, V1, V2, V3) \ do { \ struct vbo_save_context *save = &vbo_context(ctx)->save; \ \ - if (save->active_sz[A] != N) \ + if (save->active_sz[A] != N) \ save_fixup_vertex(ctx, A, N); \ \ { \ - GLfloat *dest = save->attrptr[A]; \ + GLfloat *dest = save->attrptr[A]; \ if (N>0) dest[0] = V0; \ if (N>1) dest[1] = V1; \ if (N>2) dest[2] = V2; \ @@ -651,10 +692,10 @@ do { \ for (i = 0; i < save->vertex_size; i++) \ save->buffer_ptr[i] = save->vertex[i]; \ \ - save->buffer_ptr += save->vertex_size; \ + save->buffer_ptr += save->vertex_size; \ \ if (++save->vert_count >= save->max_vert) \ - _save_wrap_filled_vertex( ctx ); \ + _save_wrap_filled_vertex(ctx); \ } \ } while (0) @@ -669,225 +710,284 @@ do { \ * -- Flush current buffer * -- Fallback to opcodes for the rest of the begin/end object. */ -static void DO_FALLBACK( GLcontext *ctx ) +static void +dlist_fallback(struct gl_context *ctx) { struct vbo_save_context *save = &vbo_context(ctx)->save; if (save->vert_count || save->prim_count) { - GLint i = save->prim_count - 1; - - /* Close off in-progress primitive. - */ - save->prim[i].count = (save->vert_count - - save->prim[i].start); + if (save->prim_count > 0) { + /* Close off in-progress primitive. */ + GLint i = save->prim_count - 1; + save->prim[i].count = save->vert_count - save->prim[i].start; + } /* Need to replay this display list with loopback, * unfortunately, otherwise this primitive won't be handled * properly: */ save->dangling_attr_ref = 1; - - _save_compile_vertex_list( ctx ); + + _save_compile_vertex_list(ctx); } - _save_copy_to_current( ctx ); - _save_reset_vertex( ctx ); - _save_reset_counters( ctx ); - _mesa_install_save_vtxfmt( ctx, &ctx->ListState.ListVtxfmt ); + _save_copy_to_current(ctx); + _save_reset_vertex(ctx); + _save_reset_counters(ctx); + _mesa_install_save_vtxfmt(ctx, &ctx->ListState.ListVtxfmt); ctx->Driver.SaveNeedFlush = 0; } -static void GLAPIENTRY _save_EvalCoord1f( GLfloat u ) + +static void GLAPIENTRY +_save_EvalCoord1f(GLfloat u) { GET_CURRENT_CONTEXT(ctx); - DO_FALLBACK(ctx); - ctx->Save->EvalCoord1f( u ); + dlist_fallback(ctx); + CALL_EvalCoord1f(ctx->Save, (u)); } -static void GLAPIENTRY _save_EvalCoord1fv( const GLfloat *v ) +static void GLAPIENTRY +_save_EvalCoord1fv(const GLfloat * v) { GET_CURRENT_CONTEXT(ctx); - DO_FALLBACK(ctx); - ctx->Save->EvalCoord1fv( v ); + dlist_fallback(ctx); + CALL_EvalCoord1fv(ctx->Save, (v)); } -static void GLAPIENTRY _save_EvalCoord2f( GLfloat u, GLfloat v ) +static void GLAPIENTRY +_save_EvalCoord2f(GLfloat u, GLfloat v) { GET_CURRENT_CONTEXT(ctx); - DO_FALLBACK(ctx); - ctx->Save->EvalCoord2f( u, v ); + dlist_fallback(ctx); + CALL_EvalCoord2f(ctx->Save, (u, v)); } -static void GLAPIENTRY _save_EvalCoord2fv( const GLfloat *v ) +static void GLAPIENTRY +_save_EvalCoord2fv(const GLfloat * v) { GET_CURRENT_CONTEXT(ctx); - DO_FALLBACK(ctx); - ctx->Save->EvalCoord2fv( v ); + dlist_fallback(ctx); + CALL_EvalCoord2fv(ctx->Save, (v)); } -static void GLAPIENTRY _save_EvalPoint1( GLint i ) +static void GLAPIENTRY +_save_EvalPoint1(GLint i) { GET_CURRENT_CONTEXT(ctx); - DO_FALLBACK(ctx); - ctx->Save->EvalPoint1( i ); + dlist_fallback(ctx); + CALL_EvalPoint1(ctx->Save, (i)); } -static void GLAPIENTRY _save_EvalPoint2( GLint i, GLint j ) +static void GLAPIENTRY +_save_EvalPoint2(GLint i, GLint j) { GET_CURRENT_CONTEXT(ctx); - DO_FALLBACK(ctx); - ctx->Save->EvalPoint2( i, j ); + dlist_fallback(ctx); + CALL_EvalPoint2(ctx->Save, (i, j)); } -static void GLAPIENTRY _save_CallList( GLuint l ) +static void GLAPIENTRY +_save_CallList(GLuint l) { GET_CURRENT_CONTEXT(ctx); - DO_FALLBACK(ctx); - ctx->Save->CallList( l ); + dlist_fallback(ctx); + CALL_CallList(ctx->Save, (l)); } -static void GLAPIENTRY _save_CallLists( GLsizei n, GLenum type, const GLvoid *v ) +static void GLAPIENTRY +_save_CallLists(GLsizei n, GLenum type, const GLvoid * v) { GET_CURRENT_CONTEXT(ctx); - DO_FALLBACK(ctx); - ctx->Save->CallLists( n, type, v ); + dlist_fallback(ctx); + CALL_CallLists(ctx->Save, (n, type, v)); } - /* This begin is hooked into ... Updating of * ctx->Driver.CurrentSavePrimitive is already taken care of. */ -GLboolean vbo_save_NotifyBegin( GLcontext *ctx, GLenum mode ) +GLboolean +vbo_save_NotifyBegin(struct gl_context *ctx, GLenum mode) { - struct vbo_save_context *save = &vbo_context(ctx)->save; + struct vbo_save_context *save = &vbo_context(ctx)->save; GLuint i = save->prim_count++; assert(i < save->prim_max); - save->prim[i].mode = mode & ~VBO_SAVE_PRIM_WEAK; + save->prim[i].mode = mode & VBO_SAVE_PRIM_MODE_MASK; save->prim[i].begin = 1; save->prim[i].end = 0; save->prim[i].weak = (mode & VBO_SAVE_PRIM_WEAK) ? 1 : 0; + save->prim[i].no_current_update = + (mode & VBO_SAVE_PRIM_NO_CURRENT_UPDATE) ? 1 : 0; save->prim[i].pad = 0; save->prim[i].start = save->vert_count; - save->prim[i].count = 0; + save->prim[i].count = 0; + save->prim[i].num_instances = 1; - _mesa_install_save_vtxfmt( ctx, &save->vtxfmt ); + _mesa_install_save_vtxfmt(ctx, &save->vtxfmt); ctx->Driver.SaveNeedFlush = 1; return GL_TRUE; } - -static void GLAPIENTRY _save_End( void ) +static void GLAPIENTRY +_save_End(void) { - GET_CURRENT_CONTEXT( ctx ); - struct vbo_save_context *save = &vbo_context(ctx)->save; + GET_CURRENT_CONTEXT(ctx); + struct vbo_save_context *save = &vbo_context(ctx)->save; GLint i = save->prim_count - 1; ctx->Driver.CurrentSavePrimitive = PRIM_OUTSIDE_BEGIN_END; save->prim[i].end = 1; - save->prim[i].count = (save->vert_count - - save->prim[i].start); + save->prim[i].count = (save->vert_count - save->prim[i].start); if (i == (GLint) save->prim_max - 1) { - _save_compile_vertex_list( ctx ); + _save_compile_vertex_list(ctx); assert(save->copied.nr == 0); } /* Swap out this vertex format while outside begin/end. Any color, * etc. received between here and the next begin will be compiled * as opcodes. - */ - _mesa_install_save_vtxfmt( ctx, &ctx->ListState.ListVtxfmt ); + */ + _mesa_install_save_vtxfmt(ctx, &ctx->ListState.ListVtxfmt); } /* These are all errors as this vtxfmt is only installed inside * begin/end pairs. */ -static void GLAPIENTRY _save_DrawElements(GLenum mode, GLsizei count, GLenum type, - const GLvoid *indices) +static void GLAPIENTRY +_save_DrawElements(GLenum mode, GLsizei count, GLenum type, + const GLvoid * indices) { GET_CURRENT_CONTEXT(ctx); - (void) mode; (void) count; (void) type; (void) indices; - _mesa_compile_error( ctx, GL_INVALID_OPERATION, "glDrawElements" ); + (void) mode; + (void) count; + (void) type; + (void) indices; + _mesa_compile_error(ctx, GL_INVALID_OPERATION, "glDrawElements"); } -static void GLAPIENTRY _save_DrawRangeElements(GLenum mode, - GLuint start, GLuint end, - GLsizei count, GLenum type, - const GLvoid *indices) +static void GLAPIENTRY +_save_DrawRangeElements(GLenum mode, GLuint start, GLuint end, + GLsizei count, GLenum type, const GLvoid * indices) { GET_CURRENT_CONTEXT(ctx); - (void) mode; (void) start; (void) end; (void) count; (void) type; (void) indices; - _mesa_compile_error( ctx, GL_INVALID_OPERATION, "glDrawRangeElements" ); + (void) mode; + (void) start; + (void) end; + (void) count; + (void) type; + (void) indices; + _mesa_compile_error(ctx, GL_INVALID_OPERATION, "glDrawRangeElements"); } -static void GLAPIENTRY _save_DrawElementsBaseVertex(GLenum mode, - GLsizei count, - GLenum type, - const GLvoid *indices, - GLint basevertex) + +static void GLAPIENTRY +_save_DrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, + const GLvoid * indices, GLint basevertex) { GET_CURRENT_CONTEXT(ctx); - (void) mode; (void) count; (void) type; (void) indices; (void)basevertex; - - _mesa_compile_error( ctx, GL_INVALID_OPERATION, "glDrawElements" ); + (void) mode; + (void) count; + (void) type; + (void) indices; + (void) basevertex; + _mesa_compile_error(ctx, GL_INVALID_OPERATION, "glDrawElements"); } -static void GLAPIENTRY _save_DrawRangeElementsBaseVertex(GLenum mode, - GLuint start, - GLuint end, - GLsizei count, - GLenum type, - const GLvoid *indices, - GLint basevertex) + +static void GLAPIENTRY +_save_DrawRangeElementsBaseVertex(GLenum mode, + GLuint start, + GLuint end, + GLsizei count, + GLenum type, + const GLvoid * indices, GLint basevertex) { GET_CURRENT_CONTEXT(ctx); - (void) mode; (void) start; (void) end; (void) count; (void) type; - (void) indices; (void)basevertex; - - _mesa_compile_error( ctx, GL_INVALID_OPERATION, "glDrawRangeElements" ); + (void) mode; + (void) start; + (void) end; + (void) count; + (void) type; + (void) indices; + (void) basevertex; + _mesa_compile_error(ctx, GL_INVALID_OPERATION, "glDrawRangeElements"); } -static void GLAPIENTRY _save_DrawArrays(GLenum mode, GLint start, GLsizei count) + +static void GLAPIENTRY +_save_DrawArrays(GLenum mode, GLint start, GLsizei count) { GET_CURRENT_CONTEXT(ctx); - (void) mode; (void) start; (void) count; - _mesa_compile_error( ctx, GL_INVALID_OPERATION, "glDrawArrays" ); + (void) mode; + (void) start; + (void) count; + _mesa_compile_error(ctx, GL_INVALID_OPERATION, "glDrawArrays"); } -static void GLAPIENTRY _save_Rectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 ) + +static void GLAPIENTRY +_save_Rectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) { GET_CURRENT_CONTEXT(ctx); - (void) x1; (void) y1; (void) x2; (void) y2; - _mesa_compile_error( ctx, GL_INVALID_OPERATION, "glRectf" ); + (void) x1; + (void) y1; + (void) x2; + (void) y2; + _mesa_compile_error(ctx, GL_INVALID_OPERATION, "glRectf"); } -static void GLAPIENTRY _save_EvalMesh1( GLenum mode, GLint i1, GLint i2 ) + +static void GLAPIENTRY +_save_EvalMesh1(GLenum mode, GLint i1, GLint i2) { GET_CURRENT_CONTEXT(ctx); - (void) mode; (void) i1; (void) i2; - _mesa_compile_error( ctx, GL_INVALID_OPERATION, "glEvalMesh1" ); + (void) mode; + (void) i1; + (void) i2; + _mesa_compile_error(ctx, GL_INVALID_OPERATION, "glEvalMesh1"); } -static void GLAPIENTRY _save_EvalMesh2( GLenum mode, GLint i1, GLint i2, - GLint j1, GLint j2 ) + +static void GLAPIENTRY +_save_EvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2) { GET_CURRENT_CONTEXT(ctx); - (void) mode; (void) i1; (void) i2; (void) j1; (void) j2; - _mesa_compile_error( ctx, GL_INVALID_OPERATION, "glEvalMesh2" ); + (void) mode; + (void) i1; + (void) i2; + (void) j1; + (void) j2; + _mesa_compile_error(ctx, GL_INVALID_OPERATION, "glEvalMesh2"); } -static void GLAPIENTRY _save_Begin( GLenum mode ) + +static void GLAPIENTRY +_save_Begin(GLenum mode) { - GET_CURRENT_CONTEXT( ctx ); + GET_CURRENT_CONTEXT(ctx); (void) mode; - _mesa_compile_error( ctx, GL_INVALID_OPERATION, "Recursive glBegin" ); + _mesa_compile_error(ctx, GL_INVALID_OPERATION, "Recursive glBegin"); +} + + +static void GLAPIENTRY +_save_PrimitiveRestartNV(void) +{ + GLenum curPrim; + GET_CURRENT_CONTEXT(ctx); + + curPrim = ctx->Driver.CurrentSavePrimitive; + + _save_End(); + _save_Begin(curPrim); } @@ -895,96 +995,102 @@ static void GLAPIENTRY _save_Begin( GLenum mode ) * maintained in ctx->ListState, active when the list is known or * suspected to be outside any begin/end primitive. */ -static void GLAPIENTRY _save_OBE_Rectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 ) +static void GLAPIENTRY +_save_OBE_Rectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) { GET_CURRENT_CONTEXT(ctx); - vbo_save_NotifyBegin( ctx, GL_QUADS | VBO_SAVE_PRIM_WEAK ); - CALL_Vertex2f(GET_DISPATCH(), ( x1, y1 )); - CALL_Vertex2f(GET_DISPATCH(), ( x2, y1 )); - CALL_Vertex2f(GET_DISPATCH(), ( x2, y2 )); - CALL_Vertex2f(GET_DISPATCH(), ( x1, y2 )); + vbo_save_NotifyBegin(ctx, GL_QUADS | VBO_SAVE_PRIM_WEAK); + CALL_Vertex2f(GET_DISPATCH(), (x1, y1)); + CALL_Vertex2f(GET_DISPATCH(), (x2, y1)); + CALL_Vertex2f(GET_DISPATCH(), (x2, y2)); + CALL_Vertex2f(GET_DISPATCH(), (x1, y2)); CALL_End(GET_DISPATCH(), ()); } -static void GLAPIENTRY _save_OBE_DrawArrays(GLenum mode, GLint start, GLsizei count) +static void GLAPIENTRY +_save_OBE_DrawArrays(GLenum mode, GLint start, GLsizei count) { GET_CURRENT_CONTEXT(ctx); GLint i; - if (!_mesa_validate_DrawArrays( ctx, mode, start, count )) + if (!_mesa_validate_DrawArrays(ctx, mode, start, count)) return; - _ae_map_vbos( ctx ); + _ae_map_vbos(ctx); - vbo_save_NotifyBegin( ctx, mode | VBO_SAVE_PRIM_WEAK ); + vbo_save_NotifyBegin(ctx, (mode | VBO_SAVE_PRIM_WEAK + | VBO_SAVE_PRIM_NO_CURRENT_UPDATE)); for (i = 0; i < count; i++) - CALL_ArrayElement(GET_DISPATCH(), (start + i)); + CALL_ArrayElement(GET_DISPATCH(), (start + i)); CALL_End(GET_DISPATCH(), ()); - _ae_unmap_vbos( ctx ); + _ae_unmap_vbos(ctx); } + /* Could do better by copying the arrays and element list intact and * then emitting an indexed prim at runtime. */ -static void GLAPIENTRY _save_OBE_DrawElements(GLenum mode, GLsizei count, GLenum type, - const GLvoid *indices) +static void GLAPIENTRY +_save_OBE_DrawElements(GLenum mode, GLsizei count, GLenum type, + const GLvoid * indices) { GET_CURRENT_CONTEXT(ctx); GLint i; - if (!_mesa_validate_DrawElements( ctx, mode, count, type, indices, 0 )) + if (!_mesa_validate_DrawElements(ctx, mode, count, type, indices, 0)) return; - _ae_map_vbos( ctx ); + _ae_map_vbos(ctx); if (_mesa_is_bufferobj(ctx->Array.ElementArrayBufferObj)) - indices = ADD_POINTERS(ctx->Array.ElementArrayBufferObj->Pointer, indices); + indices = + ADD_POINTERS(ctx->Array.ElementArrayBufferObj->Pointer, indices); - vbo_save_NotifyBegin( ctx, mode | VBO_SAVE_PRIM_WEAK ); + vbo_save_NotifyBegin(ctx, (mode | VBO_SAVE_PRIM_WEAK | + VBO_SAVE_PRIM_NO_CURRENT_UPDATE)); switch (type) { case GL_UNSIGNED_BYTE: - for (i = 0 ; i < count ; i++) - CALL_ArrayElement(GET_DISPATCH(), ( ((GLubyte *)indices)[i] )); + for (i = 0; i < count; i++) + CALL_ArrayElement(GET_DISPATCH(), (((GLubyte *) indices)[i])); break; case GL_UNSIGNED_SHORT: - for (i = 0 ; i < count ; i++) - CALL_ArrayElement(GET_DISPATCH(), ( ((GLushort *)indices)[i] )); + for (i = 0; i < count; i++) + CALL_ArrayElement(GET_DISPATCH(), (((GLushort *) indices)[i])); break; case GL_UNSIGNED_INT: - for (i = 0 ; i < count ; i++) - CALL_ArrayElement(GET_DISPATCH(), ( ((GLuint *)indices)[i] )); + for (i = 0; i < count; i++) + CALL_ArrayElement(GET_DISPATCH(), (((GLuint *) indices)[i])); break; default: - _mesa_error( ctx, GL_INVALID_ENUM, "glDrawElements(type)" ); + _mesa_error(ctx, GL_INVALID_ENUM, "glDrawElements(type)"); break; } CALL_End(GET_DISPATCH(), ()); - _ae_unmap_vbos( ctx ); + _ae_unmap_vbos(ctx); } -static void GLAPIENTRY _save_OBE_DrawRangeElements(GLenum mode, - GLuint start, GLuint end, - GLsizei count, GLenum type, - const GLvoid *indices) + +static void GLAPIENTRY +_save_OBE_DrawRangeElements(GLenum mode, GLuint start, GLuint end, + GLsizei count, GLenum type, + const GLvoid * indices) { GET_CURRENT_CONTEXT(ctx); - if (_mesa_validate_DrawRangeElements( ctx, mode, - start, end, - count, type, indices, 0 )) - _save_OBE_DrawElements( mode, count, type, indices ); + if (_mesa_validate_DrawRangeElements(ctx, mode, + start, end, count, type, indices, 0)) { + _save_OBE_DrawElements(mode, count, type, indices); + } } - - - -static void _save_vtxfmt_init( GLcontext *ctx ) +static void +_save_vtxfmt_init(struct gl_context *ctx) { struct vbo_save_context *save = &vbo_context(ctx)->save; GLvertexformat *vfmt = &save->vtxfmt; @@ -998,6 +1104,7 @@ static void _save_vtxfmt_init( GLcontext *ctx ) vfmt->Color4fv = _save_Color4fv; vfmt->EdgeFlag = _save_EdgeFlag; vfmt->End = _save_End; + vfmt->PrimitiveRestartNV = _save_PrimitiveRestartNV; vfmt->FogCoordfEXT = _save_FogCoordfEXT; vfmt->FogCoordfvEXT = _save_FogCoordfvEXT; vfmt->Indexf = _save_Indexf; @@ -1046,10 +1153,28 @@ static void _save_vtxfmt_init( GLcontext *ctx ) vfmt->VertexAttrib3fvNV = _save_VertexAttrib3fvNV; vfmt->VertexAttrib4fNV = _save_VertexAttrib4fNV; vfmt->VertexAttrib4fvNV = _save_VertexAttrib4fvNV; - + + /* integer-valued */ + vfmt->VertexAttribI1i = _save_VertexAttribI1i; + vfmt->VertexAttribI2i = _save_VertexAttribI2i; + vfmt->VertexAttribI3i = _save_VertexAttribI3i; + vfmt->VertexAttribI4i = _save_VertexAttribI4i; + vfmt->VertexAttribI2iv = _save_VertexAttribI2iv; + vfmt->VertexAttribI3iv = _save_VertexAttribI3iv; + vfmt->VertexAttribI4iv = _save_VertexAttribI4iv; + + /* unsigned integer-valued */ + vfmt->VertexAttribI1ui = _save_VertexAttribI1ui; + vfmt->VertexAttribI2ui = _save_VertexAttribI2ui; + vfmt->VertexAttribI3ui = _save_VertexAttribI3ui; + vfmt->VertexAttribI4ui = _save_VertexAttribI4ui; + vfmt->VertexAttribI2uiv = _save_VertexAttribI2uiv; + vfmt->VertexAttribI3uiv = _save_VertexAttribI3uiv; + vfmt->VertexAttribI4uiv = _save_VertexAttribI4uiv; + /* This will all require us to fallback to saving the list as opcodes: - */ - _MESA_INIT_DLIST_VTXFMT(vfmt, _save_); /* inside begin/end */ + */ + _MESA_INIT_DLIST_VTXFMT(vfmt, _save_); /* inside begin/end */ _MESA_INIT_EVAL_VTXFMT(vfmt, _save_); @@ -1069,7 +1194,8 @@ static void _save_vtxfmt_init( GLcontext *ctx ) } -void vbo_save_SaveFlushVertices( GLcontext *ctx ) +void +vbo_save_SaveFlushVertices(struct gl_context *ctx) { struct vbo_save_context *save = &vbo_context(ctx)->save; @@ -1079,36 +1205,40 @@ void vbo_save_SaveFlushVertices( GLcontext *ctx ) ctx->Driver.CurrentSavePrimitive <= GL_POLYGON) return; - if (save->vert_count || - save->prim_count) - _save_compile_vertex_list( ctx ); - - _save_copy_to_current( ctx ); - _save_reset_vertex( ctx ); - _save_reset_counters( ctx ); + if (save->vert_count || save->prim_count) + _save_compile_vertex_list(ctx); + + _save_copy_to_current(ctx); + _save_reset_vertex(ctx); + _save_reset_counters(ctx); ctx->Driver.SaveNeedFlush = 0; } -void vbo_save_NewList( GLcontext *ctx, GLuint list, GLenum mode ) + +void +vbo_save_NewList(struct gl_context *ctx, GLuint list, GLenum mode) { struct vbo_save_context *save = &vbo_context(ctx)->save; - (void) list; (void) mode; + (void) list; + (void) mode; if (!save->prim_store) - save->prim_store = alloc_prim_store( ctx ); - - if (!save->vertex_store) - save->vertex_store = alloc_vertex_store( ctx ); - - save->buffer_ptr = map_vertex_store( ctx, save->vertex_store ); - - _save_reset_vertex( ctx ); - _save_reset_counters( ctx ); + save->prim_store = alloc_prim_store(ctx); + + if (!save->vertex_store) + save->vertex_store = alloc_vertex_store(ctx); + + save->buffer_ptr = map_vertex_store(ctx, save->vertex_store); + + _save_reset_vertex(ctx); + _save_reset_counters(ctx); ctx->Driver.SaveNeedFlush = 0; } -void vbo_save_EndList( GLcontext *ctx ) + +void +vbo_save_EndList(struct gl_context *ctx) { struct vbo_save_context *save = &vbo_context(ctx)->save; @@ -1120,38 +1250,41 @@ void vbo_save_EndList( GLcontext *ctx ) GLint i = save->prim_count - 1; ctx->Driver.CurrentSavePrimitive = PRIM_OUTSIDE_BEGIN_END; save->prim[i].end = 0; - save->prim[i].count = (save->vert_count - - save->prim[i].start); + save->prim[i].count = (save->vert_count - save->prim[i].start); } /* Make sure this vertex list gets replayed by the "loopback" * mechanism: */ save->dangling_attr_ref = 1; - vbo_save_SaveFlushVertices( ctx ); + vbo_save_SaveFlushVertices(ctx); /* Swap out this vertex format while outside begin/end. Any color, * etc. received between here and the next begin will be compiled * as opcodes. - */ - _mesa_install_save_vtxfmt( ctx, &ctx->ListState.ListVtxfmt ); + */ + _mesa_install_save_vtxfmt(ctx, &ctx->ListState.ListVtxfmt); } - unmap_vertex_store( ctx, save->vertex_store ); + unmap_vertex_store(ctx, save->vertex_store); assert(save->vertex_size == 0); } - -void vbo_save_BeginCallList( GLcontext *ctx, struct gl_display_list *dlist ) + + +void +vbo_save_BeginCallList(struct gl_context *ctx, struct gl_display_list *dlist) { struct vbo_save_context *save = &vbo_context(ctx)->save; save->replay_flags |= dlist->Flags; } -void vbo_save_EndCallList( GLcontext *ctx ) + +void +vbo_save_EndCallList(struct gl_context *ctx) { struct vbo_save_context *save = &vbo_context(ctx)->save; - + if (ctx->ListState.CallDepth == 1) { /* This is correct: want to keep only the VBO_SAVE_FALLBACK * flag, if it is set: @@ -1161,16 +1294,17 @@ void vbo_save_EndCallList( GLcontext *ctx ) } -static void vbo_destroy_vertex_list( GLcontext *ctx, void *data ) +static void +vbo_destroy_vertex_list(struct gl_context *ctx, void *data) { - struct vbo_save_vertex_list *node = (struct vbo_save_vertex_list *)data; + struct vbo_save_vertex_list *node = (struct vbo_save_vertex_list *) data; (void) ctx; - if ( --node->vertex_store->refcount == 0 ) - free_vertex_store( ctx, node->vertex_store ); + if (--node->vertex_store->refcount == 0) + free_vertex_store(ctx, node->vertex_store); - if ( --node->prim_store->refcount == 0 ) - FREE( node->prim_store ); + if (--node->prim_store->refcount == 0) + FREE(node->prim_store); if (node->current_data) { FREE(node->current_data); @@ -1179,32 +1313,32 @@ static void vbo_destroy_vertex_list( GLcontext *ctx, void *data ) } -static void vbo_print_vertex_list( GLcontext *ctx, void *data ) +static void +vbo_print_vertex_list(struct gl_context *ctx, void *data) { - struct vbo_save_vertex_list *node = (struct vbo_save_vertex_list *)data; + struct vbo_save_vertex_list *node = (struct vbo_save_vertex_list *) data; GLuint i; (void) ctx; - _mesa_printf("VBO-VERTEX-LIST, %u vertices %d primitives, %d vertsize\n", - node->count, - node->prim_count, - node->vertex_size); + printf("VBO-VERTEX-LIST, %u vertices %d primitives, %d vertsize\n", + node->count, node->prim_count, node->vertex_size); - for (i = 0 ; i < node->prim_count ; i++) { + for (i = 0; i < node->prim_count; i++) { struct _mesa_prim *prim = &node->prim[i]; _mesa_debug(NULL, " prim %d: %s%s %d..%d %s %s\n", - i, - _mesa_lookup_prim_by_nr(prim->mode), - prim->weak ? " (weak)" : "", - prim->start, - prim->start + prim->count, - (prim->begin) ? "BEGIN" : "(wrap)", - (prim->end) ? "END" : "(wrap)"); + i, + _mesa_lookup_prim_by_nr(prim->mode), + prim->weak ? " (weak)" : "", + prim->start, + prim->start + prim->count, + (prim->begin) ? "BEGIN" : "(wrap)", + (prim->end) ? "END" : "(wrap)"); } } -static void _save_current_init( GLcontext *ctx ) +static void +_save_current_init(struct gl_context *ctx) { struct vbo_save_context *save = &vbo_context(ctx)->save; GLint i; @@ -1224,25 +1358,27 @@ static void _save_current_init( GLcontext *ctx ) } } + /** * Initialize the display list compiler */ -void vbo_save_api_init( struct vbo_save_context *save ) +void +vbo_save_api_init(struct vbo_save_context *save) { - GLcontext *ctx = save->ctx; + struct gl_context *ctx = save->ctx; GLuint i; save->opcode_vertex_list = - _mesa_dlist_alloc_opcode( ctx, - sizeof(struct vbo_save_vertex_list), - vbo_save_playback_vertex_list, - vbo_destroy_vertex_list, - vbo_print_vertex_list ); + _mesa_dlist_alloc_opcode(ctx, + sizeof(struct vbo_save_vertex_list), + vbo_save_playback_vertex_list, + vbo_destroy_vertex_list, + vbo_print_vertex_list); ctx->Driver.NotifySaveBegin = vbo_save_NotifyBegin; - _save_vtxfmt_init( ctx ); - _save_current_init( ctx ); + _save_vtxfmt_init(ctx); + _save_current_init(ctx); /* These will actually get set again when binding/drawing */ for (i = 0; i < VBO_ATTRIB_MAX; i++) @@ -1256,8 +1392,12 @@ void vbo_save_api_init( struct vbo_save_context *save ) ctx->ListState.ListVtxfmt.DrawElements = _save_OBE_DrawElements; ctx->ListState.ListVtxfmt.DrawRangeElements = _save_OBE_DrawRangeElements; /* loops back into _save_OBE_DrawElements */ - ctx->ListState.ListVtxfmt.MultiDrawElementsEXT = _mesa_noop_MultiDrawElements; - ctx->ListState.ListVtxfmt.MultiDrawElementsBaseVertex = _mesa_noop_MultiDrawElementsBaseVertex; - _mesa_install_save_vtxfmt( ctx, &ctx->ListState.ListVtxfmt ); + ctx->ListState.ListVtxfmt.MultiDrawElementsEXT = + _mesa_noop_MultiDrawElements; + ctx->ListState.ListVtxfmt.MultiDrawElementsBaseVertex = + _mesa_noop_MultiDrawElementsBaseVertex; + _mesa_install_save_vtxfmt(ctx, &ctx->ListState.ListVtxfmt); } + +#endif /* FEATURE_dlist */