vbo_exec.h revision 3464ebd5
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_EXEC_H__ 35#define __VBO_EXEC_H__ 36 37#include "main/mfeatures.h" 38#include "main/mtypes.h" 39#include "vbo.h" 40#include "vbo_attrib.h" 41 42 43/** 44 * Max number of primitives (number of glBegin/End pairs) per VBO. 45 */ 46#define VBO_MAX_PRIM 64 47 48 49/** 50 * Size of the VBO to use for glBegin/glVertex/glEnd-style rendering. 51 */ 52#define VBO_VERT_BUFFER_SIZE (1024*64) /* bytes */ 53 54 55/** Current vertex program mode */ 56enum vp_mode { 57 VP_NONE, /**< fixed function */ 58 VP_NV, /**< NV vertex program */ 59 VP_ARB /**< ARB vertex program or GLSL vertex shader */ 60}; 61 62 63struct vbo_exec_eval1_map { 64 struct gl_1d_map *map; 65 GLuint sz; 66}; 67 68struct vbo_exec_eval2_map { 69 struct gl_2d_map *map; 70 GLuint sz; 71}; 72 73 74 75struct vbo_exec_copied_vtx { 76 GLfloat buffer[VBO_ATTRIB_MAX * 4 * VBO_MAX_COPIED_VERTS]; 77 GLuint nr; 78}; 79 80 81typedef void (*vbo_attrfv_func)( const GLfloat * ); 82 83 84struct vbo_exec_context 85{ 86 struct gl_context *ctx; 87 GLvertexformat vtxfmt; 88 89 struct { 90 struct gl_buffer_object *bufferobj; 91 92 GLuint vertex_size; /* in dwords */ 93 94 struct _mesa_prim prim[VBO_MAX_PRIM]; 95 GLuint prim_count; 96 97 GLfloat *buffer_map; 98 GLfloat *buffer_ptr; /* cursor, points into buffer */ 99 GLuint buffer_used; /* in bytes */ 100 GLfloat vertex[VBO_ATTRIB_MAX*4]; /* current vertex */ 101 102 GLuint vert_count; 103 GLuint max_vert; 104 struct vbo_exec_copied_vtx copied; 105 106 GLubyte attrsz[VBO_ATTRIB_MAX]; 107 GLubyte active_sz[VBO_ATTRIB_MAX]; 108 109 GLfloat *attrptr[VBO_ATTRIB_MAX]; 110 struct gl_client_array arrays[VERT_ATTRIB_MAX]; 111 112 /* According to program mode, the values above plus current 113 * values are squashed down to the 32 attributes passed to the 114 * vertex program below: 115 */ 116 enum vp_mode program_mode; 117 GLuint enabled_flags; 118 const struct gl_client_array *inputs[VERT_ATTRIB_MAX]; 119 } vtx; 120 121 122 struct { 123 GLboolean recalculate_maps; 124 struct vbo_exec_eval1_map map1[VERT_ATTRIB_MAX]; 125 struct vbo_exec_eval2_map map2[VERT_ATTRIB_MAX]; 126 } eval; 127 128 struct { 129 enum vp_mode program_mode; 130 GLuint enabled_flags; 131 GLuint array_obj; 132 133 /* These just mirror the current arrayobj (todo: make arrayobj 134 * look like this and remove the mirror): 135 */ 136 const struct gl_client_array *legacy_array[16]; 137 const struct gl_client_array *generic_array[16]; 138 139 /* Arrays and current values manipulated according to program 140 * mode, etc. These are the attributes as seen by vertex 141 * programs: 142 */ 143 const struct gl_client_array *inputs[VERT_ATTRIB_MAX]; 144 } array; 145 146 /* Which flags to set in vbo_exec_BeginVertices() */ 147 GLbitfield begin_vertices_flags; 148 149#ifdef DEBUG 150 GLint flush_call_depth; 151#endif 152}; 153 154 155 156/* External API: 157 */ 158void vbo_exec_init( struct gl_context *ctx ); 159void vbo_exec_destroy( struct gl_context *ctx ); 160void vbo_exec_invalidate_state( struct gl_context *ctx, GLuint new_state ); 161 162void vbo_exec_BeginVertices( struct gl_context *ctx ); 163void vbo_exec_FlushVertices( struct gl_context *ctx, GLuint flags ); 164 165 166/* Internal functions: 167 */ 168void vbo_exec_array_init( struct vbo_exec_context *exec ); 169void vbo_exec_array_destroy( struct vbo_exec_context *exec ); 170 171 172void vbo_exec_vtx_init( struct vbo_exec_context *exec ); 173void vbo_exec_vtx_destroy( struct vbo_exec_context *exec ); 174 175#if FEATURE_beginend 176 177void vbo_exec_vtx_flush( struct vbo_exec_context *exec, GLboolean unmap ); 178void vbo_exec_vtx_map( struct vbo_exec_context *exec ); 179 180#else /* FEATURE_beginend */ 181 182static INLINE void 183vbo_exec_vtx_flush( struct vbo_exec_context *exec, GLboolean unmap ) 184{ 185} 186 187static INLINE void 188vbo_exec_vtx_map( struct vbo_exec_context *exec ) 189{ 190} 191 192#endif /* FEATURE_beginend */ 193 194void vbo_exec_vtx_wrap( struct vbo_exec_context *exec ); 195 196void vbo_exec_eval_update( struct vbo_exec_context *exec ); 197 198void vbo_exec_do_EvalCoord2f( struct vbo_exec_context *exec, 199 GLfloat u, GLfloat v ); 200 201void vbo_exec_do_EvalCoord1f( struct vbo_exec_context *exec, 202 GLfloat u); 203 204#endif 205