#include <stdbool.h>
#include "main/glheader.h"
+#include "main/dd.h"
#include "main/draw.h"
+#include "main/macros.h"
+#include "vbo_attrib.h"
#ifdef __cplusplus
extern "C" {
#endif
struct gl_context;
+struct vbo_module;
+
+/**
+ * Max number of primitives (number of glBegin/End pairs) per VBO.
+ */
+#define VBO_MAX_PRIM 64
+
+
+/**
+ * Current vertex processing mode: fixed function vs. shader.
+ * In reality, fixed function is probably implemented by a shader but that's
+ * not what we care about here.
+ */
+typedef enum
+{
+ VP_MODE_FF, /**< legacy / fixed function */
+ VP_MODE_SHADER, /**< ARB vertex program or GLSL vertex shader */
+ VP_MODE_MAX /**< for sizing arrays */
+} gl_vertex_processing_mode;
+
+
+struct vbo_exec_eval1_map {
+ struct gl_1d_map *map;
+ GLuint sz;
+};
+
+struct vbo_exec_eval2_map {
+ struct gl_2d_map *map;
+ GLuint sz;
+};
+
+struct vbo_exec_copied_vtx {
+ fi_type buffer[VBO_ATTRIB_MAX * 4 * VBO_MAX_COPIED_VERTS];
+ GLuint nr;
+};
+
+struct vbo_exec_context
+{
+ struct gl_context *ctx;
+ GLvertexformat vtxfmt;
+ GLvertexformat vtxfmt_noop;
+
+ struct {
+ struct gl_buffer_object *bufferobj;
+
+ GLuint vertex_size; /* in dwords */
+ GLuint vertex_size_no_pos;
+
+ struct _mesa_prim prim[VBO_MAX_PRIM];
+ GLuint prim_count;
+
+ fi_type *buffer_map;
+ fi_type *buffer_ptr; /* cursor, points into buffer */
+ GLuint buffer_used; /* in bytes */
+ unsigned buffer_offset; /* only for persistent mappings */
+ fi_type vertex[VBO_ATTRIB_MAX*4]; /* current vertex */
+
+ GLuint vert_count; /**< Number of vertices currently in buffer */
+ GLuint max_vert; /**< Max number of vertices allowed in buffer */
+ struct vbo_exec_copied_vtx copied;
+
+ GLbitfield64 enabled; /**< mask of enabled vbo arrays. */
+
+ /* Keep these packed in a structure for faster access. */
+ struct {
+ GLenum16 type; /**< GL_FLOAT, GL_DOUBLE, GL_INT, etc */
+ GLubyte active_size; /**< number of components, but can shrink */
+ GLubyte size; /**< number of components (1..4) */
+ } attr[VBO_ATTRIB_MAX];
+
+ /** pointers into the current 'vertex' array, declared above */
+ fi_type *attrptr[VBO_ATTRIB_MAX];
+ } vtx;
+
+ struct {
+ GLboolean recalculate_maps;
+ struct vbo_exec_eval1_map map1[VERT_ATTRIB_MAX];
+ struct vbo_exec_eval2_map map2[VERT_ATTRIB_MAX];
+ } eval;
+
+#ifndef NDEBUG
+ GLint flush_call_depth;
+#endif
+};
+
+struct vbo_save_copied_vtx {
+ fi_type buffer[VBO_ATTRIB_MAX * 4 * VBO_MAX_COPIED_VERTS];
+ GLuint nr;
+};
+
+struct vbo_save_context {
+ struct gl_context *ctx;
+ GLvertexformat vtxfmt;
+ GLvertexformat vtxfmt_noop; /**< Used if out_of_memory is true */
+
+ GLbitfield64 enabled; /**< mask of enabled vbo arrays. */
+ GLubyte attrsz[VBO_ATTRIB_MAX]; /**< 1, 2, 3 or 4 */
+ GLenum16 attrtype[VBO_ATTRIB_MAX]; /**< GL_FLOAT, GL_INT, etc */
+ GLubyte active_sz[VBO_ATTRIB_MAX]; /**< 1, 2, 3 or 4 */
+ GLuint vertex_size; /**< size in GLfloats */
+ struct gl_vertex_array_object *VAO[VP_MODE_MAX];
+
+ GLboolean out_of_memory; /**< True if last VBO allocation failed */
+
+ GLbitfield replay_flags;
+
+ struct _mesa_prim *prims;
+ GLuint prim_count, prim_max;
+
+ bool no_current_update;
+
+ struct vbo_save_vertex_store *vertex_store;
+ struct vbo_save_primitive_store *prim_store;
+
+ fi_type *buffer_map; /**< Mapping of vertex_store's buffer */
+ fi_type *buffer_ptr; /**< cursor, points into buffer_map */
+ fi_type vertex[VBO_ATTRIB_MAX*4]; /* current values */
+ fi_type *attrptr[VBO_ATTRIB_MAX];
+ GLuint vert_count;
+ GLuint max_vert;
+ GLboolean dangling_attr_ref;
+
+ GLuint opcode_vertex_list;
+
+ struct vbo_save_copied_vtx copied;
+
+ fi_type *current[VBO_ATTRIB_MAX]; /* points into ctx->ListState */
+ GLubyte *currentsz[VBO_ATTRIB_MAX];
+};
GLboolean
_vbo_CreateContext(struct gl_context *ctx, bool use_buffer_objects);