vbo_save.h revision c1f859d4
1/**************************************************************************
2
3Copyright 2002 Tungsten Graphics Inc., Cedar Park, Texas.
4
5All Rights Reserved.
6
7Permission is hereby granted, free of charge, to any person obtaining a
8copy of this software and associated documentation files (the "Software"),
9to deal in the Software without restriction, including without limitation
10on the rights to use, copy, modify, merge, publish, distribute, sub
11license, and/or sell copies of the Software, and to permit persons to whom
12the Software is furnished to do so, subject to the following conditions:
13
14The above copyright notice and this permission notice (including the next
15paragraph) shall be included in all copies or substantial portions of the
16Software.
17
18THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21TUNGSTEN GRAPHICS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
22DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24USE OR OTHER DEALINGS IN THE SOFTWARE.
25
26**************************************************************************/
27
28/*
29 * Authors:
30 *   Keith Whitwell <keith@tungstengraphics.com>
31 *
32 */
33
34#ifndef VBO_SAVE_H
35#define VBO_SAVE_H
36
37#include "main/mtypes.h"
38#include "vbo.h"
39#include "vbo_attrib.h"
40
41
42struct vbo_save_copied_vtx {
43   GLfloat buffer[VBO_ATTRIB_MAX * 4 * VBO_MAX_COPIED_VERTS];
44   GLuint nr;
45};
46
47
48/* For display lists, this structure holds a run of vertices of the
49 * same format, and a strictly well-formed set of begin/end pairs,
50 * starting on the first vertex and ending at the last.  Vertex
51 * copying on buffer breaks is precomputed according to these
52 * primitives, though there are situations where the copying will need
53 * correction at execute-time, perhaps by replaying the list as
54 * immediate mode commands.
55 *
56 * On executing this list, the 'current' values may be updated with
57 * the values of the final vertex, and often no fixup of the start of
58 * the vertex list is required.
59 *
60 * Eval and other commands that don't fit into these vertex lists are
61 * compiled using the fallback opcode mechanism provided by dlist.c.
62 */
63struct vbo_save_vertex_list {
64   GLubyte attrsz[VBO_ATTRIB_MAX];
65   GLuint vertex_size;
66
67   GLuint buffer_offset;
68   GLuint count;
69   GLuint wrap_count;		/* number of copied vertices at start */
70   GLboolean dangling_attr_ref;	/* current attr implicitly referenced
71				   outside the list */
72
73   struct _mesa_prim *prim;
74   GLuint prim_count;
75
76   struct vbo_save_vertex_store *vertex_store;
77   struct vbo_save_primitive_store *prim_store;
78};
79
80/* These buffers should be a reasonable size to support upload to
81 * hardware.  Current vbo implementation will re-upload on any
82 * changes, so don't make too big or apps which dynamically create
83 * dlists and use only a few times will suffer.
84 *
85 * Consider stategy of uploading regions from the VBO on demand in the
86 * case of dynamic vbos.  Then make the dlist code signal that
87 * likelyhood as it occurs.  No reason we couldn't change usage
88 * internally even though this probably isn't allowed for client VBOs?
89 */
90#define VBO_SAVE_BUFFER_SIZE (8*1024) /* dwords */
91#define VBO_SAVE_PRIM_SIZE   128
92#define VBO_SAVE_PRIM_WEAK 0x40
93
94#define VBO_SAVE_FALLBACK    0x10000000
95
96/* Storage to be shared among several vertex_lists.
97 */
98struct vbo_save_vertex_store {
99   struct gl_buffer_object *bufferobj;
100   GLfloat *buffer;
101   GLuint used;
102   GLuint refcount;
103};
104
105struct vbo_save_primitive_store {
106   struct _mesa_prim buffer[VBO_SAVE_PRIM_SIZE];
107   GLuint used;
108   GLuint refcount;
109};
110
111
112struct vbo_save_context {
113   GLcontext *ctx;
114   GLvertexformat vtxfmt;
115   struct gl_client_array arrays[VBO_ATTRIB_MAX];
116   const struct gl_client_array *inputs[VBO_ATTRIB_MAX];
117
118   GLubyte attrsz[VBO_ATTRIB_MAX];
119   GLubyte active_sz[VBO_ATTRIB_MAX];
120   GLuint vertex_size;
121
122   GLfloat *buffer;
123   GLuint count;
124   GLuint wrap_count;
125   GLuint replay_flags;
126
127   struct _mesa_prim *prim;
128   GLuint prim_count, prim_max;
129
130   struct vbo_save_vertex_store *vertex_store;
131   struct vbo_save_primitive_store *prim_store;
132
133   GLfloat *vbptr;		   /* cursor, points into buffer */
134   GLfloat vertex[VBO_ATTRIB_MAX*4];	   /* current values */
135   GLfloat *attrptr[VBO_ATTRIB_MAX];
136   GLuint vert_count;
137   GLuint max_vert;
138   GLboolean dangling_attr_ref;
139   GLboolean have_materials;
140
141   GLuint opcode_vertex_list;
142
143   struct vbo_save_copied_vtx copied;
144
145   GLfloat *current[VBO_ATTRIB_MAX]; /* points into ctx->ListState */
146   GLubyte *currentsz[VBO_ATTRIB_MAX];
147};
148
149
150void vbo_save_init( GLcontext *ctx );
151void vbo_save_destroy( GLcontext *ctx );
152void vbo_save_fallback( GLcontext *ctx, GLboolean fallback );
153
154/* save_loopback.c:
155 */
156void vbo_loopback_vertex_list( GLcontext *ctx,
157			       const GLfloat *buffer,
158			       const GLubyte *attrsz,
159			       const struct _mesa_prim *prim,
160			       GLuint prim_count,
161			       GLuint wrap_count,
162			       GLuint vertex_size);
163
164/* Callbacks:
165 */
166void vbo_save_EndList( GLcontext *ctx );
167void vbo_save_NewList( GLcontext *ctx, GLuint list, GLenum mode );
168void vbo_save_EndCallList( GLcontext *ctx );
169void vbo_save_BeginCallList( GLcontext *ctx, struct mesa_display_list *list );
170void vbo_save_SaveFlushVertices( GLcontext *ctx );
171GLboolean vbo_save_NotifyBegin( GLcontext *ctx, GLenum mode );
172
173void vbo_save_playback_vertex_list( GLcontext *ctx, void *data );
174
175void vbo_save_api_init( struct vbo_save_context *save );
176
177#endif
178