1b8e80941Smrg/*
2b8e80941Smrg * mesa 3-D graphics library
3b8e80941Smrg *
4b8e80941Smrg * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
5b8e80941Smrg *
6b8e80941Smrg * Permission is hereby granted, free of charge, to any person obtaining a
7b8e80941Smrg * copy of this software and associated documentation files (the "Software"),
8b8e80941Smrg * to deal in the Software without restriction, including without limitation
9b8e80941Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10b8e80941Smrg * and/or sell copies of the Software, and to permit persons to whom the
11b8e80941Smrg * Software is furnished to do so, subject to the following conditions:
12b8e80941Smrg *
13b8e80941Smrg * The above copyright notice and this permission notice shall be included
14b8e80941Smrg * in all copies or substantial portions of the Software.
15b8e80941Smrg *
16b8e80941Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17b8e80941Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18b8e80941Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19b8e80941Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20b8e80941Smrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21b8e80941Smrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22b8e80941Smrg * OTHER DEALINGS IN THE SOFTWARE.
23b8e80941Smrg */
24b8e80941Smrg
25b8e80941Smrg
26b8e80941Smrg/**
27b8e80941Smrg * Types, functions, etc which are private to the VBO module.
28b8e80941Smrg */
29b8e80941Smrg
30b8e80941Smrg
31b8e80941Smrg#ifndef VBO_PRIVATE_H
32b8e80941Smrg#define VBO_PRIVATE_H
33b8e80941Smrg
34b8e80941Smrg
35b8e80941Smrg#include "vbo/vbo_attrib.h"
36b8e80941Smrg#include "vbo/vbo_exec.h"
37b8e80941Smrg#include "vbo/vbo_save.h"
38b8e80941Smrg#include "main/varray.h"
39b8e80941Smrg
40b8e80941Smrg
41b8e80941Smrgstruct _glapi_table;
42b8e80941Smrgstruct _mesa_prim;
43b8e80941Smrg
44b8e80941Smrg
45b8e80941Smrgstruct vbo_context {
46b8e80941Smrg   struct gl_vertex_buffer_binding binding;
47b8e80941Smrg   struct gl_array_attributes current[VBO_ATTRIB_MAX];
48b8e80941Smrg
49b8e80941Smrg   struct gl_vertex_array_object *VAO;
50b8e80941Smrg
51b8e80941Smrg   struct vbo_exec_context exec;
52b8e80941Smrg   struct vbo_save_context save;
53b8e80941Smrg};
54b8e80941Smrg
55b8e80941Smrg
56b8e80941Smrgstatic inline struct vbo_context *
57b8e80941Smrgvbo_context(struct gl_context *ctx)
58b8e80941Smrg{
59b8e80941Smrg   return ctx->vbo_context;
60b8e80941Smrg}
61b8e80941Smrg
62b8e80941Smrg
63b8e80941Smrgstatic inline const struct vbo_context *
64b8e80941Smrgvbo_context_const(const struct gl_context *ctx)
65b8e80941Smrg{
66b8e80941Smrg   return ctx->vbo_context;
67b8e80941Smrg}
68b8e80941Smrg
69b8e80941Smrg
70b8e80941Smrg/**
71b8e80941Smrg * Array to apply the fixed function material aliasing map to
72b8e80941Smrg * an attribute value used in vbo processing inputs to an attribute
73b8e80941Smrg * as they appear in the vao.
74b8e80941Smrg */
75b8e80941Smrgextern const GLubyte
76b8e80941Smrg_vbo_attribute_alias_map[VP_MODE_MAX][VERT_ATTRIB_MAX];
77b8e80941Smrg
78b8e80941Smrg
79b8e80941Smrg/**
80b8e80941Smrg * Return if format is integer. The immediate mode commands only emit floats
81b8e80941Smrg * for non-integer types, thus everything else is integer.
82b8e80941Smrg */
83b8e80941Smrgstatic inline GLboolean
84b8e80941Smrgvbo_attrtype_to_integer_flag(GLenum format)
85b8e80941Smrg{
86b8e80941Smrg   switch (format) {
87b8e80941Smrg   case GL_FLOAT:
88b8e80941Smrg   case GL_DOUBLE:
89b8e80941Smrg      return GL_FALSE;
90b8e80941Smrg   case GL_INT:
91b8e80941Smrg   case GL_UNSIGNED_INT:
92b8e80941Smrg   case GL_UNSIGNED_INT64_ARB:
93b8e80941Smrg      return GL_TRUE;
94b8e80941Smrg   default:
95b8e80941Smrg      unreachable("Bad vertex attribute type");
96b8e80941Smrg      return GL_FALSE;
97b8e80941Smrg   }
98b8e80941Smrg}
99b8e80941Smrg
100b8e80941Smrgstatic inline GLboolean
101b8e80941Smrgvbo_attrtype_to_double_flag(GLenum format)
102b8e80941Smrg{
103b8e80941Smrg   switch (format) {
104b8e80941Smrg   case GL_FLOAT:
105b8e80941Smrg   case GL_INT:
106b8e80941Smrg   case GL_UNSIGNED_INT:
107b8e80941Smrg      return GL_FALSE;
108b8e80941Smrg   case GL_UNSIGNED_INT64_ARB:
109b8e80941Smrg   case GL_DOUBLE:
110b8e80941Smrg      return GL_TRUE;
111b8e80941Smrg   default:
112b8e80941Smrg      unreachable("Bad vertex attribute type");
113b8e80941Smrg      return GL_FALSE;
114b8e80941Smrg   }
115b8e80941Smrg}
116b8e80941Smrg
117b8e80941Smrg
118b8e80941Smrgstatic inline void
119b8e80941Smrgvbo_set_vertex_format(struct gl_vertex_format* vertex_format,
120b8e80941Smrg                      GLubyte size, GLenum16 type)
121b8e80941Smrg{
122b8e80941Smrg   _mesa_set_vertex_format(vertex_format, size, type, GL_RGBA, GL_FALSE,
123b8e80941Smrg                           vbo_attrtype_to_integer_flag(type),
124b8e80941Smrg                           vbo_attrtype_to_double_flag(type));
125b8e80941Smrg}
126b8e80941Smrg
127b8e80941Smrg
128b8e80941Smrg/**
129b8e80941Smrg * Return default component values for the given format.
130b8e80941Smrg * The return type is an array of fi_types, because that's how we declare
131b8e80941Smrg * the vertex storage : floats , integers or unsigned integers.
132b8e80941Smrg */
133b8e80941Smrgstatic inline const fi_type *
134b8e80941Smrgvbo_get_default_vals_as_union(GLenum format)
135b8e80941Smrg{
136b8e80941Smrg   static const GLfloat default_float[4] = { 0, 0, 0, 1 };
137b8e80941Smrg   static const GLint default_int[4] = { 0, 0, 0, 1 };
138b8e80941Smrg
139b8e80941Smrg   switch (format) {
140b8e80941Smrg   case GL_FLOAT:
141b8e80941Smrg      return (fi_type *)default_float;
142b8e80941Smrg   case GL_INT:
143b8e80941Smrg   case GL_UNSIGNED_INT:
144b8e80941Smrg      return (fi_type *)default_int;
145b8e80941Smrg   default:
146b8e80941Smrg      unreachable("Bad vertex format");
147b8e80941Smrg      return NULL;
148b8e80941Smrg   }
149b8e80941Smrg}
150b8e80941Smrg
151b8e80941Smrg
152b8e80941Smrg/**
153b8e80941Smrg * Compute the max number of vertices which can be stored in
154b8e80941Smrg * a vertex buffer, given the current vertex size, and the amount
155b8e80941Smrg * of space already used.
156b8e80941Smrg */
157b8e80941Smrgstatic inline unsigned
158b8e80941Smrgvbo_compute_max_verts(const struct vbo_exec_context *exec)
159b8e80941Smrg{
160b8e80941Smrg   unsigned n = (VBO_VERT_BUFFER_SIZE - exec->vtx.buffer_used) /
161b8e80941Smrg      (exec->vtx.vertex_size * sizeof(GLfloat));
162b8e80941Smrg   if (n == 0)
163b8e80941Smrg      return 0;
164b8e80941Smrg   /* Subtract one so we're always sure to have room for an extra
165b8e80941Smrg    * vertex for GL_LINE_LOOP -> GL_LINE_STRIP conversion.
166b8e80941Smrg    */
167b8e80941Smrg   n--;
168b8e80941Smrg   return n;
169b8e80941Smrg}
170b8e80941Smrg
171b8e80941Smrg
172b8e80941Smrgvoid
173b8e80941Smrgvbo_try_prim_conversion(struct _mesa_prim *p);
174b8e80941Smrg
175b8e80941Smrgbool
176b8e80941Smrgvbo_can_merge_prims(const struct _mesa_prim *p0, const struct _mesa_prim *p1);
177b8e80941Smrg
178b8e80941Smrgvoid
179b8e80941Smrgvbo_merge_prims(struct _mesa_prim *p0, const struct _mesa_prim *p1);
180b8e80941Smrg
181b8e80941Smrg
182b8e80941Smrg/**
183b8e80941Smrg * Get the filter mask for vbo draws depending on the vertex_processing_mode.
184b8e80941Smrg */
185b8e80941Smrgstatic inline GLbitfield
186b8e80941Smrg_vbo_get_vao_filter(gl_vertex_processing_mode vertex_processing_mode)
187b8e80941Smrg{
188b8e80941Smrg   if (vertex_processing_mode == VP_MODE_FF) {
189b8e80941Smrg      /* The materials mapped into the generic arrays */
190b8e80941Smrg      return VERT_BIT_FF_ALL | VERT_BIT_MAT_ALL;
191b8e80941Smrg   } else {
192b8e80941Smrg      return VERT_BIT_ALL;
193b8e80941Smrg   }
194b8e80941Smrg}
195b8e80941Smrg
196b8e80941Smrg
197b8e80941Smrg/**
198b8e80941Smrg * Translate the bitmask of VBO_ATTRIB_BITs to VERT_ATTRIB_BITS.
199b8e80941Smrg * Note that position/generic0 attribute aliasing is done
200b8e80941Smrg * generically in the VAO.
201b8e80941Smrg */
202b8e80941Smrgstatic inline GLbitfield
203b8e80941Smrg_vbo_get_vao_enabled_from_vbo(gl_vertex_processing_mode vertex_processing_mode,
204b8e80941Smrg                              GLbitfield64 enabled)
205b8e80941Smrg{
206b8e80941Smrg   if (vertex_processing_mode == VP_MODE_FF) {
207b8e80941Smrg      /* The materials mapped into the generic arrays */
208b8e80941Smrg      return (((GLbitfield)enabled) & VERT_BIT_FF_ALL)
209b8e80941Smrg         | (((GLbitfield)(enabled >> VBO_MATERIAL_SHIFT)) & VERT_BIT_MAT_ALL);
210b8e80941Smrg   } else {
211b8e80941Smrg      return ((GLbitfield)enabled) & VERT_BIT_ALL;
212b8e80941Smrg   }
213b8e80941Smrg}
214b8e80941Smrg
215b8e80941Smrg
216b8e80941Smrg/**
217b8e80941Smrg * Set the vertex attrib for vbo draw use.
218b8e80941Smrg */
219b8e80941Smrgstatic inline void
220b8e80941Smrg_vbo_set_attrib_format(struct gl_context *ctx,
221b8e80941Smrg                       struct gl_vertex_array_object *vao,
222b8e80941Smrg                       gl_vert_attrib attr, GLintptr buffer_offset,
223b8e80941Smrg                       GLubyte size, GLenum16 type, GLuint offset)
224b8e80941Smrg{
225b8e80941Smrg   const GLboolean integer = vbo_attrtype_to_integer_flag(type);
226b8e80941Smrg   const GLboolean doubles = vbo_attrtype_to_double_flag(type);
227b8e80941Smrg
228b8e80941Smrg   if (doubles)
229b8e80941Smrg      size /= 2;
230b8e80941Smrg   _mesa_update_array_format(ctx, vao, attr, size, type, GL_RGBA,
231b8e80941Smrg                             GL_FALSE, integer, doubles, offset);
232b8e80941Smrg   /* Ptr for userspace arrays.
233b8e80941Smrg    * For updating the pointer we would need to add the vao->NewArrays flag
234b8e80941Smrg    * to the VAO. But but that is done already unconditionally in
235b8e80941Smrg    * _mesa_update_array_format called above.
236b8e80941Smrg    */
237b8e80941Smrg   assert((vao->NewArrays | ~vao->Enabled) & VERT_BIT(attr));
238b8e80941Smrg   vao->VertexAttrib[attr].Ptr = ADD_POINTERS(buffer_offset, offset);
239b8e80941Smrg}
240b8e80941Smrg
241b8e80941Smrg
242b8e80941Smrg#endif /* VBO_PRIVATE_H */
243