mesa: inline vbo_context inside gl_context to remove vbo_context dereferences
[mesa.git] / src / mesa / vbo / vbo.h
index bd99e2465141e25c33df20080308e12b2e888402..e087ce0e1b2ed14dbeedda62144d6f673caa86d4 100644 (file)
 
 #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);