vbo.h revision 848b8605
1848b8605Smrg/*
2848b8605Smrg * mesa 3-D graphics library
3848b8605Smrg *
4848b8605Smrg * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
5848b8605Smrg *
6848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a
7848b8605Smrg * copy of this software and associated documentation files (the "Software"),
8848b8605Smrg * to deal in the Software without restriction, including without limitation
9848b8605Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10848b8605Smrg * and/or sell copies of the Software, and to permit persons to whom the
11848b8605Smrg * Software is furnished to do so, subject to the following conditions:
12848b8605Smrg *
13848b8605Smrg * The above copyright notice and this permission notice shall be included
14848b8605Smrg * in all copies or substantial portions of the Software.
15848b8605Smrg *
16848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18848b8605Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19848b8605Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20848b8605Smrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21848b8605Smrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22848b8605Smrg * OTHER DEALINGS IN THE SOFTWARE.
23848b8605Smrg */
24848b8605Smrg
25848b8605Smrg/**
26848b8605Smrg * \file vbo_context.h
27848b8605Smrg * \brief VBO builder module datatypes and definitions.
28848b8605Smrg * \author Keith Whitwell
29848b8605Smrg */
30848b8605Smrg
31848b8605Smrg
32848b8605Smrg#ifndef _VBO_H
33848b8605Smrg#define _VBO_H
34848b8605Smrg
35848b8605Smrg#include <stdbool.h>
36848b8605Smrg#include "main/glheader.h"
37848b8605Smrg
38848b8605Smrgstruct gl_client_array;
39848b8605Smrgstruct gl_context;
40848b8605Smrgstruct gl_transform_feedback_object;
41848b8605Smrg
42848b8605Smrgstruct _mesa_prim {
43848b8605Smrg   GLuint mode:8;    /**< GL_POINTS, GL_LINES, GL_QUAD_STRIP, etc */
44848b8605Smrg   GLuint indexed:1;
45848b8605Smrg   GLuint begin:1;
46848b8605Smrg   GLuint end:1;
47848b8605Smrg   GLuint weak:1;
48848b8605Smrg   GLuint no_current_update:1;
49848b8605Smrg   GLuint is_indirect:1;
50848b8605Smrg   GLuint pad:18;
51848b8605Smrg
52848b8605Smrg   GLuint start;
53848b8605Smrg   GLuint count;
54848b8605Smrg   GLint basevertex;
55848b8605Smrg   GLuint num_instances;
56848b8605Smrg   GLuint base_instance;
57848b8605Smrg
58848b8605Smrg   GLsizeiptr indirect_offset;
59848b8605Smrg};
60848b8605Smrg
61848b8605Smrg/* Would like to call this a "vbo_index_buffer", but this would be
62848b8605Smrg * confusing as the indices are not neccessarily yet in a non-null
63848b8605Smrg * buffer object.
64848b8605Smrg */
65848b8605Smrgstruct _mesa_index_buffer {
66848b8605Smrg   GLuint count;
67848b8605Smrg   GLenum type;
68848b8605Smrg   struct gl_buffer_object *obj;
69848b8605Smrg   const void *ptr;
70848b8605Smrg};
71848b8605Smrg
72848b8605Smrg
73848b8605Smrg
74848b8605SmrgGLboolean _vbo_CreateContext( struct gl_context *ctx );
75848b8605Smrgvoid _vbo_DestroyContext( struct gl_context *ctx );
76848b8605Smrgvoid _vbo_InvalidateState( struct gl_context *ctx, GLuint new_state );
77848b8605Smrg
78848b8605Smrg
79848b8605Smrgvoid
80848b8605Smrgvbo_initialize_exec_dispatch(const struct gl_context *ctx,
81848b8605Smrg                             struct _glapi_table *exec);
82848b8605Smrg
83848b8605Smrgvoid
84848b8605Smrgvbo_initialize_save_dispatch(const struct gl_context *ctx,
85848b8605Smrg                             struct _glapi_table *exec);
86848b8605Smrg
87848b8605Smrg
88848b8605Smrgtypedef void (*vbo_draw_func)( struct gl_context *ctx,
89848b8605Smrg			       const struct _mesa_prim *prims,
90848b8605Smrg			       GLuint nr_prims,
91848b8605Smrg			       const struct _mesa_index_buffer *ib,
92848b8605Smrg			       GLboolean index_bounds_valid,
93848b8605Smrg			       GLuint min_index,
94848b8605Smrg			       GLuint max_index,
95848b8605Smrg			       struct gl_transform_feedback_object *tfb_vertcount,
96848b8605Smrg			       struct gl_buffer_object *indirect );
97848b8605Smrg
98848b8605Smrg
99848b8605Smrg
100848b8605Smrg
101848b8605Smrg/* Utility function to cope with various constraints on tnl modules or
102848b8605Smrg * hardware.  This can be used to split an incoming set of arrays and
103848b8605Smrg * primitives against the following constraints:
104848b8605Smrg *    - Maximum number of indices in index buffer.
105848b8605Smrg *    - Maximum number of vertices referenced by index buffer.
106848b8605Smrg *    - Maximum hardware vertex buffer size.
107848b8605Smrg */
108848b8605Smrgstruct split_limits {
109848b8605Smrg   GLuint max_verts;
110848b8605Smrg   GLuint max_indices;
111848b8605Smrg   GLuint max_vb_size;		/* bytes */
112848b8605Smrg};
113848b8605Smrg
114848b8605Smrg
115848b8605Smrgvoid vbo_split_prims( struct gl_context *ctx,
116848b8605Smrg		      const struct gl_client_array *arrays[],
117848b8605Smrg		      const struct _mesa_prim *prim,
118848b8605Smrg		      GLuint nr_prims,
119848b8605Smrg		      const struct _mesa_index_buffer *ib,
120848b8605Smrg		      GLuint min_index,
121848b8605Smrg		      GLuint max_index,
122848b8605Smrg		      vbo_draw_func draw,
123848b8605Smrg		      const struct split_limits *limits );
124848b8605Smrg
125848b8605Smrg
126848b8605Smrg/* Helpers for dealing translating away non-zero min_index.
127848b8605Smrg */
128848b8605SmrgGLboolean vbo_all_varyings_in_vbos( const struct gl_client_array *arrays[] );
129848b8605SmrgGLboolean vbo_any_varyings_in_vbos( const struct gl_client_array *arrays[] );
130848b8605Smrg
131848b8605Smrgvoid vbo_rebase_prims( struct gl_context *ctx,
132848b8605Smrg		       const struct gl_client_array *arrays[],
133848b8605Smrg		       const struct _mesa_prim *prim,
134848b8605Smrg		       GLuint nr_prims,
135848b8605Smrg		       const struct _mesa_index_buffer *ib,
136848b8605Smrg		       GLuint min_index,
137848b8605Smrg		       GLuint max_index,
138848b8605Smrg		       vbo_draw_func draw );
139848b8605Smrg
140848b8605Smrgstatic inline int
141848b8605Smrgvbo_sizeof_ib_type(GLenum type)
142848b8605Smrg{
143848b8605Smrg   switch (type) {
144848b8605Smrg   case GL_UNSIGNED_INT:
145848b8605Smrg      return sizeof(GLuint);
146848b8605Smrg   case GL_UNSIGNED_SHORT:
147848b8605Smrg      return sizeof(GLushort);
148848b8605Smrg   case GL_UNSIGNED_BYTE:
149848b8605Smrg      return sizeof(GLubyte);
150848b8605Smrg   default:
151848b8605Smrg      assert(!"unsupported index data type");
152848b8605Smrg      /* In case assert is turned off */
153848b8605Smrg      return 0;
154848b8605Smrg   }
155848b8605Smrg}
156848b8605Smrg
157848b8605Smrgvoid
158848b8605Smrgvbo_get_minmax_indices(struct gl_context *ctx, const struct _mesa_prim *prim,
159848b8605Smrg                       const struct _mesa_index_buffer *ib,
160848b8605Smrg                       GLuint *min_index, GLuint *max_index, GLuint nr_prims);
161848b8605Smrg
162848b8605Smrgvoid vbo_use_buffer_objects(struct gl_context *ctx);
163848b8605Smrg
164848b8605Smrgvoid vbo_always_unmap_buffers(struct gl_context *ctx);
165848b8605Smrg
166848b8605Smrgvoid vbo_set_draw_func(struct gl_context *ctx, vbo_draw_func func);
167848b8605Smrg
168848b8605Smrgvoid vbo_check_buffers_are_unmapped(struct gl_context *ctx);
169848b8605Smrg
170848b8605Smrgvoid vbo_bind_arrays(struct gl_context *ctx);
171848b8605Smrg
172848b8605Smrgsize_t
173848b8605Smrgvbo_count_tessellated_primitives(GLenum mode, GLuint count,
174848b8605Smrg                                 GLuint num_instances);
175848b8605Smrg
176848b8605Smrgvoid
177848b8605Smrgvbo_try_prim_conversion(struct _mesa_prim *p);
178848b8605Smrg
179848b8605Smrgbool
180848b8605Smrgvbo_can_merge_prims(const struct _mesa_prim *p0, const struct _mesa_prim *p1);
181848b8605Smrg
182848b8605Smrgvoid
183848b8605Smrgvbo_merge_prims(struct _mesa_prim *p0, const struct _mesa_prim *p1);
184848b8605Smrg
185848b8605Smrgvoid
186848b8605Smrgvbo_sw_primitive_restart(struct gl_context *ctx,
187848b8605Smrg                         const struct _mesa_prim *prim,
188848b8605Smrg                         GLuint nr_prims,
189848b8605Smrg                         const struct _mesa_index_buffer *ib,
190848b8605Smrg                         struct gl_buffer_object *indirect);
191848b8605Smrg
192848b8605Smrgvoid GLAPIENTRY
193848b8605Smrg_es_Color4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a);
194848b8605Smrg
195848b8605Smrgvoid GLAPIENTRY
196848b8605Smrg_es_Normal3f(GLfloat x, GLfloat y, GLfloat z);
197848b8605Smrg
198848b8605Smrgvoid GLAPIENTRY
199848b8605Smrg_es_MultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
200848b8605Smrg
201848b8605Smrgvoid GLAPIENTRY
202848b8605Smrg_es_Materialfv(GLenum face, GLenum pname, const GLfloat *params);
203848b8605Smrg
204848b8605Smrgvoid GLAPIENTRY
205848b8605Smrg_es_Materialf(GLenum face, GLenum pname, GLfloat param);
206848b8605Smrg
207848b8605Smrgvoid GLAPIENTRY
208848b8605Smrg_es_VertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
209848b8605Smrg
210848b8605Smrgvoid GLAPIENTRY
211848b8605Smrg_es_VertexAttrib1f(GLuint indx, GLfloat x);
212848b8605Smrg
213848b8605Smrgvoid GLAPIENTRY
214848b8605Smrg_es_VertexAttrib1fv(GLuint indx, const GLfloat* values);
215848b8605Smrg
216848b8605Smrgvoid GLAPIENTRY
217848b8605Smrg_es_VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y);
218848b8605Smrg
219848b8605Smrgvoid GLAPIENTRY
220848b8605Smrg_es_VertexAttrib2fv(GLuint indx, const GLfloat* values);
221848b8605Smrg
222848b8605Smrgvoid GLAPIENTRY
223848b8605Smrg_es_VertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z);
224848b8605Smrg
225848b8605Smrgvoid GLAPIENTRY
226848b8605Smrg_es_VertexAttrib3fv(GLuint indx, const GLfloat* values);
227848b8605Smrg
228848b8605Smrgvoid GLAPIENTRY
229848b8605Smrg_es_VertexAttrib4fv(GLuint indx, const GLfloat* values);
230848b8605Smrg
231848b8605Smrg#endif
232