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