1/*
2 * mesa 3-D graphics library
3 *
4 * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25/**
26 * \brief Public interface to the VBO module
27 * \author Keith Whitwell
28 */
29
30
31#ifndef _VBO_H
32#define _VBO_H
33
34#include <stdbool.h>
35#include "main/glheader.h"
36#include "main/dd.h"
37#include "main/draw.h"
38#include "main/macros.h"
39#include "vbo_attrib.h"
40#include "gallium/include/pipe/p_state.h"
41
42#ifdef __cplusplus
43extern "C" {
44#endif
45
46struct gl_context;
47struct pipe_draw_info;
48struct pipe_draw_start_count_bias;
49
50/**
51 * Max number of primitives (number of glBegin/End pairs) per VBO.
52 */
53#define VBO_MAX_PRIM 64
54
55
56/**
57 * Current vertex processing mode: fixed function vs. shader.
58 * In reality, fixed function is probably implemented by a shader but that's
59 * not what we care about here.
60 */
61typedef enum
62{
63   VP_MODE_FF,     /**< legacy / fixed function */
64   VP_MODE_SHADER, /**< ARB vertex program or GLSL vertex shader */
65   VP_MODE_MAX     /**< for sizing arrays */
66} gl_vertex_processing_mode;
67
68
69struct vbo_exec_eval1_map {
70   struct gl_1d_map *map;
71   GLuint sz;
72};
73
74struct vbo_exec_eval2_map {
75   struct gl_2d_map *map;
76   GLuint sz;
77};
78
79struct vbo_exec_copied_vtx {
80   fi_type buffer[VBO_ATTRIB_MAX * 4 * VBO_MAX_COPIED_VERTS];
81   GLuint nr;
82};
83
84struct vbo_markers
85{
86   /**
87    * If false and the primitive is a line loop, the first vertex is
88    * the beginning of the line loop and it won't be drawn.
89    * Instead, it will be moved to the end.
90    *
91    * Drivers shouldn't reset the line stipple pattern walker if begin is
92    * false and mode is a line strip.
93    */
94   bool begin;
95
96   /**
97    * If true and the primitive is a line loop, it will be closed.
98    */
99   bool end;
100};
101
102struct vbo_exec_context
103{
104   GLvertexformat vtxfmt;
105   GLvertexformat vtxfmt_noop;
106
107   struct {
108      /* Multi draw where the mode can vary between draws. */
109      struct pipe_draw_info info;
110      struct pipe_draw_start_count_bias draw[VBO_MAX_PRIM];
111      GLubyte mode[VBO_MAX_PRIM];            /**< primitive modes per draw */
112      struct vbo_markers markers[VBO_MAX_PRIM];
113      unsigned prim_count;
114
115      struct gl_buffer_object *bufferobj;
116
117      GLuint vertex_size;       /* in dwords */
118      GLuint vertex_size_no_pos;
119
120      fi_type *buffer_map;
121      fi_type *buffer_ptr;              /* cursor, points into buffer */
122      GLuint   buffer_used;             /* in bytes */
123      unsigned buffer_offset;           /* only for persistent mappings */
124      fi_type vertex[VBO_ATTRIB_MAX*4]; /* current vertex */
125
126      GLuint vert_count;   /**< Number of vertices currently in buffer */
127      GLuint max_vert;     /**< Max number of vertices allowed in buffer */
128      struct vbo_exec_copied_vtx copied;
129
130      GLbitfield64 enabled;             /**< mask of enabled vbo arrays. */
131
132      /* Keep these packed in a structure for faster access. */
133      struct {
134         GLenum16 type;       /**< GL_FLOAT, GL_DOUBLE, GL_INT, etc */
135         GLubyte active_size; /**< number of components, but can shrink */
136         GLubyte size;        /**< number of components (1..4) */
137      } attr[VBO_ATTRIB_MAX];
138
139      /** pointers into the current 'vertex' array, declared above */
140      fi_type *attrptr[VBO_ATTRIB_MAX];
141   } vtx;
142
143   struct {
144      GLboolean recalculate_maps;
145      struct vbo_exec_eval1_map map1[VERT_ATTRIB_MAX];
146      struct vbo_exec_eval2_map map2[VERT_ATTRIB_MAX];
147   } eval;
148
149#ifndef NDEBUG
150   GLint flush_call_depth;
151#endif
152};
153
154
155struct vbo_save_context {
156   GLvertexformat vtxfmt;
157
158   GLbitfield64 enabled; /**< mask of enabled vbo arrays. */
159   GLubyte attrsz[VBO_ATTRIB_MAX];  /**< 1, 2, 3 or 4 */
160   GLenum16 attrtype[VBO_ATTRIB_MAX];  /**< GL_FLOAT, GL_INT, etc */
161   GLubyte active_sz[VBO_ATTRIB_MAX];  /**< 1, 2, 3 or 4 */
162   GLuint vertex_size;  /**< size in GLfloats */
163   struct gl_vertex_array_object *VAO[VP_MODE_MAX];
164
165   struct vbo_save_vertex_store *vertex_store;
166   struct vbo_save_primitive_store *prim_store;
167   struct gl_buffer_object *current_bo;
168   unsigned current_bo_bytes_used;
169
170   fi_type vertex[VBO_ATTRIB_MAX*4];	   /* current values */
171   fi_type *attrptr[VBO_ATTRIB_MAX];
172
173   struct {
174      fi_type *buffer;
175      GLuint nr;
176   } copied;
177
178   fi_type *current[VBO_ATTRIB_MAX]; /* points into ctx->ListState */
179   GLubyte *currentsz[VBO_ATTRIB_MAX];
180
181   GLboolean dangling_attr_ref;
182   GLboolean out_of_memory;  /**< True if last VBO allocation failed */
183   bool no_current_update;
184};
185
186GLboolean
187_vbo_CreateContext(struct gl_context *ctx, bool use_buffer_objects);
188
189void
190_vbo_DestroyContext(struct gl_context *ctx);
191
192void
193vbo_exec_update_eval_maps(struct gl_context *ctx);
194
195void
196_vbo_install_exec_vtxfmt(struct gl_context *ctx);
197
198void
199vbo_initialize_exec_dispatch(const struct gl_context *ctx,
200                             struct _glapi_table *exec);
201
202void
203vbo_initialize_save_dispatch(const struct gl_context *ctx,
204                             struct _glapi_table *exec);
205
206void
207vbo_exec_FlushVertices(struct gl_context *ctx, GLuint flags);
208
209void
210vbo_save_SaveFlushVertices(struct gl_context *ctx);
211
212void
213vbo_save_NotifyBegin(struct gl_context *ctx, GLenum mode,
214                     bool no_current_update);
215
216void
217vbo_save_NewList(struct gl_context *ctx, GLuint list, GLenum mode);
218
219void
220vbo_save_EndList(struct gl_context *ctx);
221
222void
223vbo_delete_minmax_cache(struct gl_buffer_object *bufferObj);
224
225void
226vbo_get_minmax_index_mapped(unsigned count, unsigned index_size,
227                            unsigned restartIndex, bool restart,
228                            const void *indices,
229                            unsigned *min_index, unsigned *max_index);
230
231void
232vbo_get_minmax_indices(struct gl_context *ctx, const struct _mesa_prim *prim,
233                       const struct _mesa_index_buffer *ib,
234                       GLuint *min_index, GLuint *max_index, GLuint nr_prims,
235                       bool primitive_restart,
236                       unsigned restart_index);
237
238bool
239vbo_get_minmax_indices_gallium(struct gl_context *ctx,
240                               struct pipe_draw_info *info,
241                               const struct pipe_draw_start_count_bias *draws,
242                               unsigned num_draws);
243
244const struct gl_array_attributes*
245_vbo_current_attrib(const struct gl_context *ctx, gl_vert_attrib attr);
246
247
248const struct gl_vertex_buffer_binding*
249_vbo_current_binding(const struct gl_context *ctx);
250
251
252void GLAPIENTRY
253_es_Color4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a);
254
255void GLAPIENTRY
256_es_Normal3f(GLfloat x, GLfloat y, GLfloat z);
257
258void GLAPIENTRY
259_es_MultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
260
261void GLAPIENTRY
262_es_Materialfv(GLenum face, GLenum pname, const GLfloat *params);
263
264void GLAPIENTRY
265_es_Materialf(GLenum face, GLenum pname, GLfloat param);
266
267void GLAPIENTRY
268_es_VertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
269
270void GLAPIENTRY
271_es_VertexAttrib1f(GLuint indx, GLfloat x);
272
273void GLAPIENTRY
274_es_VertexAttrib1fv(GLuint indx, const GLfloat* values);
275
276void GLAPIENTRY
277_es_VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y);
278
279void GLAPIENTRY
280_es_VertexAttrib2fv(GLuint indx, const GLfloat* values);
281
282void GLAPIENTRY
283_es_VertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z);
284
285void GLAPIENTRY
286_es_VertexAttrib3fv(GLuint indx, const GLfloat* values);
287
288void GLAPIENTRY
289_es_VertexAttrib4fv(GLuint indx, const GLfloat* values);
290
291#ifdef __cplusplus
292} // extern "C"
293#endif
294
295#endif
296