xref: /aosp_15_r20/external/mesa3d/src/glx/vertarr.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
3*61046927SAndroid Build Coastguard Worker  * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
4*61046927SAndroid Build Coastguard Worker  *
5*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: SGI-B-2.0
6*61046927SAndroid Build Coastguard Worker  */
7*61046927SAndroid Build Coastguard Worker 
8*61046927SAndroid Build Coastguard Worker #include "glxclient.h"
9*61046927SAndroid Build Coastguard Worker #include "indirect.h"
10*61046927SAndroid Build Coastguard Worker #include "indirect_vertex_array.h"
11*61046927SAndroid Build Coastguard Worker 
12*61046927SAndroid Build Coastguard Worker #if !defined(GLX_USE_APPLEGL) || defined(GLX_USE_APPLE)
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker /*****************************************************************************/
15*61046927SAndroid Build Coastguard Worker 
16*61046927SAndroid Build Coastguard Worker /**
17*61046927SAndroid Build Coastguard Worker  * \name Vertex array pointer bridge functions
18*61046927SAndroid Build Coastguard Worker  *
19*61046927SAndroid Build Coastguard Worker  * When EXT_vertex_array was moved into the core GL spec, the \c count
20*61046927SAndroid Build Coastguard Worker  * parameter was lost.  This libGL really only wants to implement the GL 1.1
21*61046927SAndroid Build Coastguard Worker  * version, but we need to support applications that were written to the old
22*61046927SAndroid Build Coastguard Worker  * interface.  These bridge functions are part of the glue that makes this
23*61046927SAndroid Build Coastguard Worker  * happen.
24*61046927SAndroid Build Coastguard Worker  */
25*61046927SAndroid Build Coastguard Worker /*@{*/
26*61046927SAndroid Build Coastguard Worker void
__indirect_glColorPointerEXT(GLint size,GLenum type,GLsizei stride,GLsizei count,const GLvoid * pointer)27*61046927SAndroid Build Coastguard Worker __indirect_glColorPointerEXT(GLint size, GLenum type, GLsizei stride,
28*61046927SAndroid Build Coastguard Worker                              GLsizei count, const GLvoid * pointer)
29*61046927SAndroid Build Coastguard Worker {
30*61046927SAndroid Build Coastguard Worker    (void) count;
31*61046927SAndroid Build Coastguard Worker    __indirect_glColorPointer(size, type, stride, pointer);
32*61046927SAndroid Build Coastguard Worker }
33*61046927SAndroid Build Coastguard Worker 
34*61046927SAndroid Build Coastguard Worker void
__indirect_glEdgeFlagPointerEXT(GLsizei stride,GLsizei count,const GLboolean * pointer)35*61046927SAndroid Build Coastguard Worker __indirect_glEdgeFlagPointerEXT(GLsizei stride,
36*61046927SAndroid Build Coastguard Worker                                 GLsizei count, const GLboolean * pointer)
37*61046927SAndroid Build Coastguard Worker {
38*61046927SAndroid Build Coastguard Worker    (void) count;
39*61046927SAndroid Build Coastguard Worker    __indirect_glEdgeFlagPointer(stride, pointer);
40*61046927SAndroid Build Coastguard Worker }
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker void
__indirect_glIndexPointerEXT(GLenum type,GLsizei stride,GLsizei count,const GLvoid * pointer)43*61046927SAndroid Build Coastguard Worker __indirect_glIndexPointerEXT(GLenum type, GLsizei stride,
44*61046927SAndroid Build Coastguard Worker                              GLsizei count, const GLvoid * pointer)
45*61046927SAndroid Build Coastguard Worker {
46*61046927SAndroid Build Coastguard Worker    (void) count;
47*61046927SAndroid Build Coastguard Worker    __indirect_glIndexPointer(type, stride, pointer);
48*61046927SAndroid Build Coastguard Worker }
49*61046927SAndroid Build Coastguard Worker 
50*61046927SAndroid Build Coastguard Worker void
__indirect_glNormalPointerEXT(GLenum type,GLsizei stride,GLsizei count,const GLvoid * pointer)51*61046927SAndroid Build Coastguard Worker __indirect_glNormalPointerEXT(GLenum type, GLsizei stride, GLsizei count,
52*61046927SAndroid Build Coastguard Worker                               const GLvoid * pointer)
53*61046927SAndroid Build Coastguard Worker {
54*61046927SAndroid Build Coastguard Worker    (void) count;
55*61046927SAndroid Build Coastguard Worker    __indirect_glNormalPointer(type, stride, pointer);
56*61046927SAndroid Build Coastguard Worker }
57*61046927SAndroid Build Coastguard Worker 
58*61046927SAndroid Build Coastguard Worker void
__indirect_glTexCoordPointerEXT(GLint size,GLenum type,GLsizei stride,GLsizei count,const GLvoid * pointer)59*61046927SAndroid Build Coastguard Worker __indirect_glTexCoordPointerEXT(GLint size, GLenum type, GLsizei stride,
60*61046927SAndroid Build Coastguard Worker                                 GLsizei count, const GLvoid * pointer)
61*61046927SAndroid Build Coastguard Worker {
62*61046927SAndroid Build Coastguard Worker    (void) count;
63*61046927SAndroid Build Coastguard Worker    __indirect_glTexCoordPointer(size, type, stride, pointer);
64*61046927SAndroid Build Coastguard Worker }
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker void
__indirect_glVertexPointerEXT(GLint size,GLenum type,GLsizei stride,GLsizei count,const GLvoid * pointer)67*61046927SAndroid Build Coastguard Worker __indirect_glVertexPointerEXT(GLint size, GLenum type, GLsizei stride,
68*61046927SAndroid Build Coastguard Worker                               GLsizei count, const GLvoid * pointer)
69*61046927SAndroid Build Coastguard Worker {
70*61046927SAndroid Build Coastguard Worker    (void) count;
71*61046927SAndroid Build Coastguard Worker    __indirect_glVertexPointer(size, type, stride, pointer);
72*61046927SAndroid Build Coastguard Worker }
73*61046927SAndroid Build Coastguard Worker 
74*61046927SAndroid Build Coastguard Worker /*@}*/
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker /*****************************************************************************/
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker void
__indirect_glInterleavedArrays(GLenum format,GLsizei stride,const GLvoid * pointer)79*61046927SAndroid Build Coastguard Worker __indirect_glInterleavedArrays(GLenum format, GLsizei stride,
80*61046927SAndroid Build Coastguard Worker                                const GLvoid * pointer)
81*61046927SAndroid Build Coastguard Worker {
82*61046927SAndroid Build Coastguard Worker    struct glx_context *gc = __glXGetCurrentContext();
83*61046927SAndroid Build Coastguard Worker    __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
84*61046927SAndroid Build Coastguard Worker 
85*61046927SAndroid Build Coastguard Worker #define NONE  {0, 0, 0}
86*61046927SAndroid Build Coastguard Worker #define F(x)  {GL_FLOAT, x, x * sizeof(GLfloat)}
87*61046927SAndroid Build Coastguard Worker #define UB4   {GL_UNSIGNED_BYTE, 4, 4 * sizeof(GLubyte)}
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker    /* Each row in this array describes the elements of a particular
90*61046927SAndroid Build Coastguard Worker     * interleaved array mode.  Each column describes, in the order in which
91*61046927SAndroid Build Coastguard Worker     * they appear in the interleaved arrays, one of the four possible types
92*61046927SAndroid Build Coastguard Worker     * of vertex data that can appear in an interleaved array.
93*61046927SAndroid Build Coastguard Worker     */
94*61046927SAndroid Build Coastguard Worker    struct
95*61046927SAndroid Build Coastguard Worker    {
96*61046927SAndroid Build Coastguard Worker         /**
97*61046927SAndroid Build Coastguard Worker     * The enum describing the GL type, as would be passed to the
98*61046927SAndroid Build Coastguard Worker     * appropriate gl*Pointer function.
99*61046927SAndroid Build Coastguard Worker     */
100*61046927SAndroid Build Coastguard Worker       GLushort type;
101*61046927SAndroid Build Coastguard Worker 
102*61046927SAndroid Build Coastguard Worker         /**
103*61046927SAndroid Build Coastguard Worker     * Number of elements in the subarray, as would be passed (as the
104*61046927SAndroid Build Coastguard Worker     * \c size parameter) to the appropriate gl*Pointer function.
105*61046927SAndroid Build Coastguard Worker     */
106*61046927SAndroid Build Coastguard Worker       GLubyte count;
107*61046927SAndroid Build Coastguard Worker 
108*61046927SAndroid Build Coastguard Worker         /**
109*61046927SAndroid Build Coastguard Worker     * True size of a single element in the subarray, as would be passed
110*61046927SAndroid Build Coastguard Worker     * (as the \c stride parameter) to the appropriate gl*Pointer
111*61046927SAndroid Build Coastguard Worker     * function.
112*61046927SAndroid Build Coastguard Worker     */
113*61046927SAndroid Build Coastguard Worker       GLubyte size;
114*61046927SAndroid Build Coastguard Worker    }
115*61046927SAndroid Build Coastguard Worker    static const modes[14][4] = {
116*61046927SAndroid Build Coastguard Worker       /* texture color normal vertex */
117*61046927SAndroid Build Coastguard Worker       {NONE, NONE, NONE, F(2)}, /* GL_V2F */
118*61046927SAndroid Build Coastguard Worker       {NONE, NONE, NONE, F(3)}, /* GL_V3F */
119*61046927SAndroid Build Coastguard Worker       {NONE, UB4, NONE, F(2)},  /* GL_C4UB_V2F */
120*61046927SAndroid Build Coastguard Worker       {NONE, UB4, NONE, F(3)},  /* GL_C4UB_V3F */
121*61046927SAndroid Build Coastguard Worker       {NONE, F(3), NONE, F(3)}, /* GL_C3F_V3F */
122*61046927SAndroid Build Coastguard Worker       {NONE, NONE, F(3), F(3)}, /* GL_N3F_V3F */
123*61046927SAndroid Build Coastguard Worker       {NONE, F(4), F(3), F(3)}, /* GL_C4F_N3F_V3F */
124*61046927SAndroid Build Coastguard Worker       {F(2), NONE, NONE, F(3)}, /* GL_T2F_V3F */
125*61046927SAndroid Build Coastguard Worker       {F(4), NONE, NONE, F(4)}, /* GL_T4F_V4F */
126*61046927SAndroid Build Coastguard Worker       {F(2), UB4, NONE, F(3)},  /* GL_T2F_C4UB_V3F */
127*61046927SAndroid Build Coastguard Worker       {F(2), F(3), NONE, F(3)}, /* GL_T2F_C3F_V3F */
128*61046927SAndroid Build Coastguard Worker       {F(2), NONE, F(3), F(3)}, /* GL_T2F_N3F_V3F */
129*61046927SAndroid Build Coastguard Worker       {F(2), F(4), F(3), F(3)}, /* GL_T2F_C4F_N3F_V3F */
130*61046927SAndroid Build Coastguard Worker       {F(4), F(4), F(3), F(4)}, /* GL_T4F_C4F_N3F_V4F */
131*61046927SAndroid Build Coastguard Worker    };
132*61046927SAndroid Build Coastguard Worker #undef NONE
133*61046927SAndroid Build Coastguard Worker #undef F
134*61046927SAndroid Build Coastguard Worker #undef UB4
135*61046927SAndroid Build Coastguard Worker 
136*61046927SAndroid Build Coastguard Worker    GLint trueStride, size;
137*61046927SAndroid Build Coastguard Worker    int offsets[4];
138*61046927SAndroid Build Coastguard Worker    unsigned i;
139*61046927SAndroid Build Coastguard Worker    const int idx = format - GL_V2F;
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker 
142*61046927SAndroid Build Coastguard Worker    /* All valid formats are on the range [GL_V2F, GL_V2F+0x0D].  Since idx
143*61046927SAndroid Build Coastguard Worker     * is just the format biased by -GL_V2F, all valid idx values are on the
144*61046927SAndroid Build Coastguard Worker     * range [0, 0x0D].
145*61046927SAndroid Build Coastguard Worker     */
146*61046927SAndroid Build Coastguard Worker    if ((idx < 0) || (idx > 0x0D)) {
147*61046927SAndroid Build Coastguard Worker       __glXSetError(gc, GL_INVALID_ENUM);
148*61046927SAndroid Build Coastguard Worker       return;
149*61046927SAndroid Build Coastguard Worker    }
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker    if (stride < 0) {
152*61046927SAndroid Build Coastguard Worker       __glXSetError(gc, GL_INVALID_VALUE);
153*61046927SAndroid Build Coastguard Worker       return;
154*61046927SAndroid Build Coastguard Worker    }
155*61046927SAndroid Build Coastguard Worker 
156*61046927SAndroid Build Coastguard Worker 
157*61046927SAndroid Build Coastguard Worker    /* If the 'count' for a subarray is non-zero, then the offset of its
158*61046927SAndroid Build Coastguard Worker     * first element is at the currently accumulated 'size'.
159*61046927SAndroid Build Coastguard Worker     */
160*61046927SAndroid Build Coastguard Worker    size = 0;
161*61046927SAndroid Build Coastguard Worker    for (i = 0; i < 4; i++) {
162*61046927SAndroid Build Coastguard Worker       offsets[i] = (modes[idx][i].count != 0) ? size : -1;
163*61046927SAndroid Build Coastguard Worker       size += modes[idx][i].size;
164*61046927SAndroid Build Coastguard Worker    }
165*61046927SAndroid Build Coastguard Worker 
166*61046927SAndroid Build Coastguard Worker    trueStride = (stride == 0) ? size : stride;
167*61046927SAndroid Build Coastguard Worker 
168*61046927SAndroid Build Coastguard Worker    __glXArrayDisableAll(state);
169*61046927SAndroid Build Coastguard Worker 
170*61046927SAndroid Build Coastguard Worker    if (offsets[0] >= 0) {
171*61046927SAndroid Build Coastguard Worker       __indirect_glEnableClientState(GL_TEXTURE_COORD_ARRAY);
172*61046927SAndroid Build Coastguard Worker       __indirect_glTexCoordPointer(modes[idx][0].count, GL_FLOAT,
173*61046927SAndroid Build Coastguard Worker                                    trueStride, (const char *) pointer);
174*61046927SAndroid Build Coastguard Worker    }
175*61046927SAndroid Build Coastguard Worker    if (offsets[1] >= 0) {
176*61046927SAndroid Build Coastguard Worker       __indirect_glEnableClientState(GL_COLOR_ARRAY);
177*61046927SAndroid Build Coastguard Worker       __indirect_glColorPointer(modes[idx][1].count, modes[idx][1].type,
178*61046927SAndroid Build Coastguard Worker                                 trueStride,
179*61046927SAndroid Build Coastguard Worker                                 (const char *) pointer + offsets[1]);
180*61046927SAndroid Build Coastguard Worker    }
181*61046927SAndroid Build Coastguard Worker    if (offsets[2] >= 0) {
182*61046927SAndroid Build Coastguard Worker       __indirect_glEnableClientState(GL_NORMAL_ARRAY);
183*61046927SAndroid Build Coastguard Worker       __indirect_glNormalPointer(GL_FLOAT, trueStride,
184*61046927SAndroid Build Coastguard Worker                                  (const char *) pointer + offsets[2]);
185*61046927SAndroid Build Coastguard Worker    }
186*61046927SAndroid Build Coastguard Worker    __indirect_glEnableClientState(GL_VERTEX_ARRAY);
187*61046927SAndroid Build Coastguard Worker    __indirect_glVertexPointer(modes[idx][3].count, GL_FLOAT,
188*61046927SAndroid Build Coastguard Worker                               trueStride,
189*61046927SAndroid Build Coastguard Worker                               (const char *) pointer + offsets[3]);
190*61046927SAndroid Build Coastguard Worker }
191*61046927SAndroid Build Coastguard Worker 
192*61046927SAndroid Build Coastguard Worker #endif
193