blob: 9fa20997cf9c0c61a024da64beeaa90f4916a236 [file] [log] [blame]
Keith Whitwellcab974c2000-12-26 05:09:27 +00001/* $Id: varray.c,v 1.34 2000/12/26 05:09:29 keithw Exp $ */
jtgafb833d1999-08-19 00:55:39 +00002
3/*
4 * Mesa 3-D graphics library
Brian Paulce938b32000-10-18 15:02:59 +00005 * Version: 3.5
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00006 *
Brian Paul4463a242000-01-13 00:25:22 +00007 * Copyright (C) 1999-2000 Brian Paul All Rights Reserved.
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00008 *
jtgafb833d1999-08-19 00:55:39 +00009 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000015 *
jtgafb833d1999-08-19 00:55:39 +000016 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000018 *
jtgafb833d1999-08-19 00:55:39 +000019 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 */
26
27#ifdef PC_HEADER
28#include "all.h"
29#else
Brian Paulfbd8f211999-11-11 01:22:25 +000030#include "glheader.h"
jtgafb833d1999-08-19 00:55:39 +000031#include "context.h"
jtgafb833d1999-08-19 00:55:39 +000032#include "enable.h"
33#include "enums.h"
34#include "dlist.h"
35#include "light.h"
36#include "macros.h"
37#include "mmath.h"
Brian Paulea39f042000-02-02 19:17:57 +000038#include "state.h"
jtgafb833d1999-08-19 00:55:39 +000039#include "texstate.h"
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000040#include "mtypes.h"
jtgafb833d1999-08-19 00:55:39 +000041#include "varray.h"
Keith Whitwell23caf202000-11-16 21:05:34 +000042#include "math/m_translate.h"
Keith Whitwell485f0401999-10-08 09:27:09 +000043#endif
44
jtgafb833d1999-08-19 00:55:39 +000045
Brian Paulfbd8f211999-11-11 01:22:25 +000046
47void
48_mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
jtgafb833d1999-08-19 00:55:39 +000049{
Brian Paulfbd8f211999-11-11 01:22:25 +000050 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +000051 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000052
jtgafb833d1999-08-19 00:55:39 +000053 if (size<2 || size>4) {
54 gl_error( ctx, GL_INVALID_VALUE, "glVertexPointer(size)" );
55 return;
56 }
57 if (stride<0) {
58 gl_error( ctx, GL_INVALID_VALUE, "glVertexPointer(stride)" );
59 return;
60 }
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000061
jtgafb833d1999-08-19 00:55:39 +000062 if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API))
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000063 fprintf(stderr, "glVertexPointer( sz %d type %s stride %d )\n", size,
jtgafb833d1999-08-19 00:55:39 +000064 gl_lookup_enum_by_nr( type ),
65 stride);
66
67 ctx->Array.Vertex.StrideB = stride;
68 if (!stride) {
69 switch (type) {
70 case GL_SHORT:
71 ctx->Array.Vertex.StrideB = size*sizeof(GLshort);
72 break;
73 case GL_INT:
74 ctx->Array.Vertex.StrideB = size*sizeof(GLint);
75 break;
76 case GL_FLOAT:
77 ctx->Array.Vertex.StrideB = size*sizeof(GLfloat);
78 break;
79 case GL_DOUBLE:
80 ctx->Array.Vertex.StrideB = size*sizeof(GLdouble);
81 break;
82 default:
83 gl_error( ctx, GL_INVALID_ENUM, "glVertexPointer(type)" );
84 return;
85 }
86 }
87 ctx->Array.Vertex.Size = size;
88 ctx->Array.Vertex.Type = type;
89 ctx->Array.Vertex.Stride = stride;
90 ctx->Array.Vertex.Ptr = (void *) ptr;
Keith Whitwella96308c2000-10-30 13:31:59 +000091 ctx->NewState |= _NEW_ARRAY;
Keith Whitwellcab974c2000-12-26 05:09:27 +000092 ctx->Array.NewState |= _NEW_ARRAY_VERTEX;
Keith Whitwell23caf202000-11-16 21:05:34 +000093
94 if (ctx->Driver.VertexPointer)
95 ctx->Driver.VertexPointer( ctx, size, type, stride, ptr );
jtgafb833d1999-08-19 00:55:39 +000096}
97
98
99
100
Brian Paulfbd8f211999-11-11 01:22:25 +0000101void
102_mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr )
jtgafb833d1999-08-19 00:55:39 +0000103{
Brian Paulfbd8f211999-11-11 01:22:25 +0000104 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +0000105 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +0000106
jtgafb833d1999-08-19 00:55:39 +0000107 if (stride<0) {
108 gl_error( ctx, GL_INVALID_VALUE, "glNormalPointer(stride)" );
109 return;
110 }
111
112 if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API))
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +0000113 fprintf(stderr, "glNormalPointer( type %s stride %d )\n",
jtgafb833d1999-08-19 00:55:39 +0000114 gl_lookup_enum_by_nr( type ),
115 stride);
116
117 ctx->Array.Normal.StrideB = stride;
118 if (!stride) {
119 switch (type) {
120 case GL_BYTE:
121 ctx->Array.Normal.StrideB = 3*sizeof(GLbyte);
122 break;
123 case GL_SHORT:
124 ctx->Array.Normal.StrideB = 3*sizeof(GLshort);
125 break;
126 case GL_INT:
127 ctx->Array.Normal.StrideB = 3*sizeof(GLint);
128 break;
129 case GL_FLOAT:
130 ctx->Array.Normal.StrideB = 3*sizeof(GLfloat);
131 break;
132 case GL_DOUBLE:
133 ctx->Array.Normal.StrideB = 3*sizeof(GLdouble);
134 break;
135 default:
136 gl_error( ctx, GL_INVALID_ENUM, "glNormalPointer(type)" );
137 return;
138 }
139 }
140 ctx->Array.Normal.Type = type;
141 ctx->Array.Normal.Stride = stride;
142 ctx->Array.Normal.Ptr = (void *) ptr;
Keith Whitwella96308c2000-10-30 13:31:59 +0000143 ctx->NewState |= _NEW_ARRAY;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000144 ctx->Array.NewState |= _NEW_ARRAY_VERTEX;
Keith Whitwell23caf202000-11-16 21:05:34 +0000145
146 if (ctx->Driver.NormalPointer)
147 ctx->Driver.NormalPointer( ctx, type, stride, ptr );
jtgafb833d1999-08-19 00:55:39 +0000148}
149
150
151
Brian Paulfbd8f211999-11-11 01:22:25 +0000152void
153_mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
jtgafb833d1999-08-19 00:55:39 +0000154{
Brian Paulfbd8f211999-11-11 01:22:25 +0000155 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +0000156 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfbd8f211999-11-11 01:22:25 +0000157
jtgafb833d1999-08-19 00:55:39 +0000158 if (size<3 || size>4) {
159 gl_error( ctx, GL_INVALID_VALUE, "glColorPointer(size)" );
160 return;
161 }
162 if (stride<0) {
163 gl_error( ctx, GL_INVALID_VALUE, "glColorPointer(stride)" );
164 return;
165 }
166
167 if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API))
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +0000168 fprintf(stderr, "glColorPointer( sz %d type %s stride %d )\n", size,
jtgafb833d1999-08-19 00:55:39 +0000169 gl_lookup_enum_by_nr( type ),
170 stride);
171
172 ctx->Array.Color.StrideB = stride;
173 if (!stride) {
174 switch (type) {
175 case GL_BYTE:
176 ctx->Array.Color.StrideB = size*sizeof(GLbyte);
177 break;
178 case GL_UNSIGNED_BYTE:
179 ctx->Array.Color.StrideB = size*sizeof(GLubyte);
180 break;
181 case GL_SHORT:
182 ctx->Array.Color.StrideB = size*sizeof(GLshort);
183 break;
184 case GL_UNSIGNED_SHORT:
185 ctx->Array.Color.StrideB = size*sizeof(GLushort);
186 break;
187 case GL_INT:
188 ctx->Array.Color.StrideB = size*sizeof(GLint);
189 break;
190 case GL_UNSIGNED_INT:
191 ctx->Array.Color.StrideB = size*sizeof(GLuint);
192 break;
193 case GL_FLOAT:
194 ctx->Array.Color.StrideB = size*sizeof(GLfloat);
195 break;
196 case GL_DOUBLE:
197 ctx->Array.Color.StrideB = size*sizeof(GLdouble);
198 break;
199 default:
200 gl_error( ctx, GL_INVALID_ENUM, "glColorPointer(type)" );
201 return;
202 }
203 }
204 ctx->Array.Color.Size = size;
205 ctx->Array.Color.Type = type;
206 ctx->Array.Color.Stride = stride;
207 ctx->Array.Color.Ptr = (void *) ptr;
Keith Whitwella96308c2000-10-30 13:31:59 +0000208 ctx->NewState |= _NEW_ARRAY;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000209 ctx->Array.NewState |= _NEW_ARRAY_VERTEX;
Keith Whitwell23caf202000-11-16 21:05:34 +0000210
211 if (ctx->Driver.ColorPointer)
212 ctx->Driver.ColorPointer( ctx, size, type, stride, ptr );
jtgafb833d1999-08-19 00:55:39 +0000213}
214
215
216
Brian Paulfbd8f211999-11-11 01:22:25 +0000217void
Keith Whitwellfe5d67d2000-10-27 16:44:40 +0000218_mesa_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr)
219{
220 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +0000221 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +0000222
Keith Whitwellfe5d67d2000-10-27 16:44:40 +0000223 if (stride<0) {
224 gl_error( ctx, GL_INVALID_VALUE, "glFogCoordPointer(stride)" );
225 return;
226 }
227
228 ctx->Array.FogCoord.StrideB = stride;
229 if (!stride) {
230 switch (type) {
231 case GL_FLOAT:
232 ctx->Array.FogCoord.StrideB = sizeof(GLfloat);
233 break;
234 case GL_DOUBLE:
235 ctx->Array.FogCoord.StrideB = sizeof(GLdouble);
236 break;
237 default:
238 gl_error( ctx, GL_INVALID_ENUM, "glFogCoordPointer(type)" );
239 return;
240 }
241 }
242 ctx->Array.FogCoord.Type = type;
243 ctx->Array.FogCoord.Stride = stride;
244 ctx->Array.FogCoord.Ptr = (void *) ptr;
Keith Whitwella96308c2000-10-30 13:31:59 +0000245 ctx->NewState |= _NEW_ARRAY;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000246 ctx->Array.NewState |= _NEW_ARRAY_VERTEX;
Keith Whitwell23caf202000-11-16 21:05:34 +0000247
248 if (ctx->Driver.FogCoordPointer)
249 ctx->Driver.FogCoordPointer( ctx, type, stride, ptr );
Keith Whitwellfe5d67d2000-10-27 16:44:40 +0000250}
251
252
253void
Brian Paulfbd8f211999-11-11 01:22:25 +0000254_mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr)
jtgafb833d1999-08-19 00:55:39 +0000255{
Brian Paulfbd8f211999-11-11 01:22:25 +0000256 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +0000257 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +0000258
jtgafb833d1999-08-19 00:55:39 +0000259 if (stride<0) {
260 gl_error( ctx, GL_INVALID_VALUE, "glIndexPointer(stride)" );
261 return;
262 }
263
264 ctx->Array.Index.StrideB = stride;
265 if (!stride) {
266 switch (type) {
267 case GL_UNSIGNED_BYTE:
268 ctx->Array.Index.StrideB = sizeof(GLubyte);
269 break;
270 case GL_SHORT:
271 ctx->Array.Index.StrideB = sizeof(GLshort);
272 break;
273 case GL_INT:
274 ctx->Array.Index.StrideB = sizeof(GLint);
275 break;
276 case GL_FLOAT:
277 ctx->Array.Index.StrideB = sizeof(GLfloat);
278 break;
279 case GL_DOUBLE:
280 ctx->Array.Index.StrideB = sizeof(GLdouble);
281 break;
282 default:
283 gl_error( ctx, GL_INVALID_ENUM, "glIndexPointer(type)" );
284 return;
285 }
286 }
287 ctx->Array.Index.Type = type;
288 ctx->Array.Index.Stride = stride;
289 ctx->Array.Index.Ptr = (void *) ptr;
Keith Whitwella96308c2000-10-30 13:31:59 +0000290 ctx->NewState |= _NEW_ARRAY;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000291 ctx->Array.NewState |= _NEW_ARRAY_VERTEX;
Keith Whitwell23caf202000-11-16 21:05:34 +0000292
293 if (ctx->Driver.IndexPointer)
294 ctx->Driver.IndexPointer( ctx, type, stride, ptr );
jtgafb833d1999-08-19 00:55:39 +0000295}
296
297
Keith Whitwellfe5d67d2000-10-27 16:44:40 +0000298void
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +0000299_mesa_SecondaryColorPointerEXT(GLint size, GLenum type,
Keith Whitwellfe5d67d2000-10-27 16:44:40 +0000300 GLsizei stride, const GLvoid *ptr)
301{
302 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +0000303 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Keith Whitwellfe5d67d2000-10-27 16:44:40 +0000304
Keith Whitwellfe5d67d2000-10-27 16:44:40 +0000305 if (size != 3 && size != 4) {
306 gl_error( ctx, GL_INVALID_VALUE, "glColorPointer(size)" );
307 return;
308 }
309 if (stride<0) {
310 gl_error( ctx, GL_INVALID_VALUE, "glColorPointer(stride)" );
311 return;
312 }
313
314 if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API))
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +0000315 fprintf(stderr, "glColorPointer( sz %d type %s stride %d )\n", size,
Keith Whitwellfe5d67d2000-10-27 16:44:40 +0000316 gl_lookup_enum_by_nr( type ),
317 stride);
318
319 ctx->Array.SecondaryColor.StrideB = stride;
320 if (!stride) {
321 switch (type) {
322 case GL_BYTE:
323 ctx->Array.SecondaryColor.StrideB = size*sizeof(GLbyte);
324 break;
325 case GL_UNSIGNED_BYTE:
326 ctx->Array.SecondaryColor.StrideB = size*sizeof(GLubyte);
327 break;
328 case GL_SHORT:
329 ctx->Array.SecondaryColor.StrideB = size*sizeof(GLshort);
330 break;
331 case GL_UNSIGNED_SHORT:
332 ctx->Array.SecondaryColor.StrideB = size*sizeof(GLushort);
333 break;
334 case GL_INT:
335 ctx->Array.SecondaryColor.StrideB = size*sizeof(GLint);
336 break;
337 case GL_UNSIGNED_INT:
338 ctx->Array.SecondaryColor.StrideB = size*sizeof(GLuint);
339 break;
340 case GL_FLOAT:
341 ctx->Array.SecondaryColor.StrideB = size*sizeof(GLfloat);
342 break;
343 case GL_DOUBLE:
344 ctx->Array.SecondaryColor.StrideB = size*sizeof(GLdouble);
345 break;
346 default:
347 gl_error( ctx, GL_INVALID_ENUM, "glSecondaryColorPointer(type)" );
348 return;
349 }
350 }
351 ctx->Array.SecondaryColor.Size = 3; /* hardwire */
352 ctx->Array.SecondaryColor.Type = type;
353 ctx->Array.SecondaryColor.Stride = stride;
354 ctx->Array.SecondaryColor.Ptr = (void *) ptr;
Keith Whitwella96308c2000-10-30 13:31:59 +0000355 ctx->NewState |= _NEW_ARRAY;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000356 ctx->Array.NewState |= _NEW_ARRAY_VERTEX;
Keith Whitwell23caf202000-11-16 21:05:34 +0000357
358 if (ctx->Driver.SecondaryColorPointer)
359 ctx->Driver.SecondaryColorPointer( ctx, size, type, stride, ptr );
Keith Whitwellfe5d67d2000-10-27 16:44:40 +0000360}
361
362
jtgafb833d1999-08-19 00:55:39 +0000363
Brian Paulfbd8f211999-11-11 01:22:25 +0000364void
365_mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
jtgafb833d1999-08-19 00:55:39 +0000366{
Brian Paulfbd8f211999-11-11 01:22:25 +0000367 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +0000368 GLuint texUnit = ctx->Array.ActiveTexture;
369 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
jtgafb833d1999-08-19 00:55:39 +0000370
371 if (size<1 || size>4) {
372 gl_error( ctx, GL_INVALID_VALUE, "glTexCoordPointer(size)" );
373 return;
374 }
375 if (stride<0) {
376 gl_error( ctx, GL_INVALID_VALUE, "glTexCoordPointer(stride)" );
377 return;
378 }
379
380 if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API))
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +0000381 fprintf(stderr, "glTexCoordPointer( unit %u sz %d type %s stride %d )\n",
jtgafb833d1999-08-19 00:55:39 +0000382 texUnit,
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +0000383 size,
jtgafb833d1999-08-19 00:55:39 +0000384 gl_lookup_enum_by_nr( type ),
385 stride);
386
387 ctx->Array.TexCoord[texUnit].StrideB = stride;
388 if (!stride) {
389 switch (type) {
390 case GL_SHORT:
391 ctx->Array.TexCoord[texUnit].StrideB = size*sizeof(GLshort);
392 break;
393 case GL_INT:
394 ctx->Array.TexCoord[texUnit].StrideB = size*sizeof(GLint);
395 break;
396 case GL_FLOAT:
397 ctx->Array.TexCoord[texUnit].StrideB = size*sizeof(GLfloat);
398 break;
399 case GL_DOUBLE:
400 ctx->Array.TexCoord[texUnit].StrideB = size*sizeof(GLdouble);
401 break;
402 default:
403 gl_error( ctx, GL_INVALID_ENUM, "glTexCoordPointer(type)" );
404 return;
405 }
406 }
407 ctx->Array.TexCoord[texUnit].Size = size;
408 ctx->Array.TexCoord[texUnit].Type = type;
409 ctx->Array.TexCoord[texUnit].Stride = stride;
410 ctx->Array.TexCoord[texUnit].Ptr = (void *) ptr;
Keith Whitwella96308c2000-10-30 13:31:59 +0000411 ctx->NewState |= _NEW_ARRAY;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000412 ctx->Array.NewState |= _NEW_ARRAY_VERTEX;
Keith Whitwell23caf202000-11-16 21:05:34 +0000413
414 if (ctx->Driver.TexCoordPointer)
415 ctx->Driver.TexCoordPointer( ctx, size, type, stride, ptr );
jtgafb833d1999-08-19 00:55:39 +0000416}
417
418
419
420
Brian Paulfbd8f211999-11-11 01:22:25 +0000421void
422_mesa_EdgeFlagPointer(GLsizei stride, const void *vptr)
jtgafb833d1999-08-19 00:55:39 +0000423{
Brian Paulfbd8f211999-11-11 01:22:25 +0000424 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +0000425 const GLboolean *ptr = (GLboolean *)vptr;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000426 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
jtgafb833d1999-08-19 00:55:39 +0000427
428 if (stride<0) {
429 gl_error( ctx, GL_INVALID_VALUE, "glEdgeFlagPointer(stride)" );
430 return;
431 }
432 ctx->Array.EdgeFlag.Stride = stride;
433 ctx->Array.EdgeFlag.StrideB = stride ? stride : sizeof(GLboolean);
434 ctx->Array.EdgeFlag.Ptr = (GLboolean *) ptr;
Keith Whitwella96308c2000-10-30 13:31:59 +0000435 ctx->NewState |= _NEW_ARRAY;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000436 ctx->Array.NewState |= _NEW_ARRAY_VERTEX;
Keith Whitwell23caf202000-11-16 21:05:34 +0000437
438 if (ctx->Driver.EdgeFlagPointer)
439 ctx->Driver.EdgeFlagPointer( ctx, stride, ptr );
jtgafb833d1999-08-19 00:55:39 +0000440}
441
442
jtgafb833d1999-08-19 00:55:39 +0000443
444
Brian Paul1f0e2132000-06-12 15:30:51 +0000445
446void
447_mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride,
448 GLsizei count, const GLvoid *ptr)
449{
450 (void) count;
451 _mesa_VertexPointer(size, type, stride, ptr);
452}
453
454
455void
456_mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count,
457 const GLvoid *ptr)
458{
459 (void) count;
460 _mesa_NormalPointer(type, stride, ptr);
461}
462
463
464void
465_mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count,
466 const GLvoid *ptr)
467{
468 (void) count;
469 _mesa_ColorPointer(size, type, stride, ptr);
470}
471
472
473void
474_mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count,
475 const GLvoid *ptr)
476{
477 (void) count;
478 _mesa_IndexPointer(type, stride, ptr);
479}
480
481
482void
483_mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride,
484 GLsizei count, const GLvoid *ptr)
485{
486 (void) count;
487 _mesa_TexCoordPointer(size, type, stride, ptr);
488}
489
490
491void
492_mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr)
493{
494 (void) count;
495 _mesa_EdgeFlagPointer(stride, ptr);
496}
497
498
499
500
501
jtgafb833d1999-08-19 00:55:39 +0000502
Brian Paulfbd8f211999-11-11 01:22:25 +0000503void
504_mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
jtgafb833d1999-08-19 00:55:39 +0000505{
Brian Paulfbd8f211999-11-11 01:22:25 +0000506 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +0000507 GLboolean tflag, cflag, nflag; /* enable/disable flags */
508 GLint tcomps, ccomps, vcomps; /* components per texcoord, color, vertex */
509
510 GLenum ctype; /* color type */
511 GLint coffset, noffset, voffset;/* color, normal, vertex offsets */
512 GLint defstride; /* default stride */
513 GLint c, f;
514 GLint coordUnitSave;
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +0000515
Keith Whitwellcab974c2000-12-26 05:09:27 +0000516 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
517
jtgafb833d1999-08-19 00:55:39 +0000518 f = sizeof(GLfloat);
519 c = f * ((4*sizeof(GLubyte) + (f-1)) / f);
520
521 if (stride<0) {
522 gl_error( ctx, GL_INVALID_VALUE, "glInterleavedArrays(stride)" );
523 return;
524 }
525
526 switch (format) {
527 case GL_V2F:
528 tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_FALSE;
529 tcomps = 0; ccomps = 0; vcomps = 2;
530 voffset = 0;
531 defstride = 2*f;
532 break;
533 case GL_V3F:
534 tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_FALSE;
535 tcomps = 0; ccomps = 0; vcomps = 3;
536 voffset = 0;
537 defstride = 3*f;
538 break;
539 case GL_C4UB_V2F:
540 tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE;
541 tcomps = 0; ccomps = 4; vcomps = 2;
542 ctype = GL_UNSIGNED_BYTE;
543 coffset = 0;
544 voffset = c;
545 defstride = c + 2*f;
546 break;
547 case GL_C4UB_V3F:
548 tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE;
549 tcomps = 0; ccomps = 4; vcomps = 3;
550 ctype = GL_UNSIGNED_BYTE;
551 coffset = 0;
552 voffset = c;
553 defstride = c + 3*f;
554 break;
555 case GL_C3F_V3F:
556 tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE;
557 tcomps = 0; ccomps = 3; vcomps = 3;
558 ctype = GL_FLOAT;
559 coffset = 0;
560 voffset = 3*f;
561 defstride = 6*f;
562 break;
563 case GL_N3F_V3F:
564 tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_TRUE;
565 tcomps = 0; ccomps = 0; vcomps = 3;
566 noffset = 0;
567 voffset = 3*f;
568 defstride = 6*f;
569 break;
570 case GL_C4F_N3F_V3F:
571 tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_TRUE;
572 tcomps = 0; ccomps = 4; vcomps = 3;
573 ctype = GL_FLOAT;
574 coffset = 0;
575 noffset = 4*f;
576 voffset = 7*f;
577 defstride = 10*f;
578 break;
579 case GL_T2F_V3F:
580 tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_FALSE;
581 tcomps = 2; ccomps = 0; vcomps = 3;
582 voffset = 2*f;
583 defstride = 5*f;
584 break;
585 case GL_T4F_V4F:
586 tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_FALSE;
587 tcomps = 4; ccomps = 0; vcomps = 4;
588 voffset = 4*f;
589 defstride = 8*f;
590 break;
591 case GL_T2F_C4UB_V3F:
592 tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_FALSE;
593 tcomps = 2; ccomps = 4; vcomps = 3;
594 ctype = GL_UNSIGNED_BYTE;
595 coffset = 2*f;
596 voffset = c+2*f;
597 defstride = c+5*f;
598 break;
599 case GL_T2F_C3F_V3F:
600 tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_FALSE;
601 tcomps = 2; ccomps = 3; vcomps = 3;
602 ctype = GL_FLOAT;
603 coffset = 2*f;
604 voffset = 5*f;
605 defstride = 8*f;
606 break;
607 case GL_T2F_N3F_V3F:
608 tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_TRUE;
609 tcomps = 2; ccomps = 0; vcomps = 3;
610 noffset = 2*f;
611 voffset = 5*f;
612 defstride = 8*f;
613 break;
614 case GL_T2F_C4F_N3F_V3F:
615 tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_TRUE;
616 tcomps = 2; ccomps = 4; vcomps = 3;
617 ctype = GL_FLOAT;
618 coffset = 2*f;
619 noffset = 6*f;
620 voffset = 9*f;
621 defstride = 12*f;
622 break;
623 case GL_T4F_C4F_N3F_V4F:
624 tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_TRUE;
625 tcomps = 4; ccomps = 4; vcomps = 4;
626 ctype = GL_FLOAT;
627 coffset = 4*f;
628 noffset = 8*f;
629 voffset = 11*f;
630 defstride = 15*f;
631 break;
632 default:
633 gl_error( ctx, GL_INVALID_ENUM, "glInterleavedArrays(format)" );
634 return;
635 }
636
637 if (stride==0) {
638 stride = defstride;
639 }
640
Brian Paulfbd8f211999-11-11 01:22:25 +0000641 _mesa_DisableClientState( GL_EDGE_FLAG_ARRAY );
642 _mesa_DisableClientState( GL_INDEX_ARRAY );
jtgafb833d1999-08-19 00:55:39 +0000643
644 /* Texcoords */
Brian Paul45224fa1999-09-07 22:31:30 +0000645 coordUnitSave = ctx->Array.ActiveTexture;
jtgafb833d1999-08-19 00:55:39 +0000646 if (tflag) {
647 GLint i;
648 GLint factor = ctx->Array.TexCoordInterleaveFactor;
649 for (i = 0; i < factor; i++) {
Brian Paulfbd8f211999-11-11 01:22:25 +0000650 _mesa_ClientActiveTextureARB( (GLenum) (GL_TEXTURE0_ARB + i) );
651 _mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000652 _mesa_TexCoordPointer( tcomps, GL_FLOAT, stride,
653 (GLubyte *) pointer + i * coffset );
jtgafb833d1999-08-19 00:55:39 +0000654 }
655 for (i = factor; i < ctx->Const.MaxTextureUnits; i++) {
Brian Paulfbd8f211999-11-11 01:22:25 +0000656 _mesa_ClientActiveTextureARB( (GLenum) (GL_TEXTURE0_ARB + i) );
657 _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY );
jtgafb833d1999-08-19 00:55:39 +0000658 }
659 }
660 else {
661 GLint i;
662 for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
Brian Paulfbd8f211999-11-11 01:22:25 +0000663 _mesa_ClientActiveTextureARB( (GLenum) (GL_TEXTURE0_ARB + i) );
664 _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY );
jtgafb833d1999-08-19 00:55:39 +0000665 }
666 }
667 /* Restore texture coordinate unit index */
Brian Paulfbd8f211999-11-11 01:22:25 +0000668 _mesa_ClientActiveTextureARB( (GLenum) (GL_TEXTURE0_ARB + coordUnitSave) );
jtgafb833d1999-08-19 00:55:39 +0000669
670
671 /* Color */
672 if (cflag) {
Brian Paulfbd8f211999-11-11 01:22:25 +0000673 _mesa_EnableClientState( GL_COLOR_ARRAY );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000674 _mesa_ColorPointer( ccomps, ctype, stride,
675 (GLubyte*) pointer + coffset );
jtgafb833d1999-08-19 00:55:39 +0000676 }
677 else {
Brian Paulfbd8f211999-11-11 01:22:25 +0000678 _mesa_DisableClientState( GL_COLOR_ARRAY );
jtgafb833d1999-08-19 00:55:39 +0000679 }
680
681
682 /* Normals */
683 if (nflag) {
Brian Paulfbd8f211999-11-11 01:22:25 +0000684 _mesa_EnableClientState( GL_NORMAL_ARRAY );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000685 _mesa_NormalPointer( GL_FLOAT, stride,
686 (GLubyte*) pointer + noffset );
jtgafb833d1999-08-19 00:55:39 +0000687 }
688 else {
Brian Paulfbd8f211999-11-11 01:22:25 +0000689 _mesa_DisableClientState( GL_NORMAL_ARRAY );
jtgafb833d1999-08-19 00:55:39 +0000690 }
691
Brian Paulfbd8f211999-11-11 01:22:25 +0000692 _mesa_EnableClientState( GL_VERTEX_ARRAY );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000693 _mesa_VertexPointer( vcomps, GL_FLOAT, stride,
694 (GLubyte *) pointer + voffset );
jtgafb833d1999-08-19 00:55:39 +0000695}
696
697
698
Keith Whitwellad2ac212000-11-24 10:25:05 +0000699void
700_mesa_LockArraysEXT(GLint first, GLsizei count)
701{
702 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +0000703 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Keith Whitwellad2ac212000-11-24 10:25:05 +0000704
705 if (MESA_VERBOSE & VERBOSE_API)
706 fprintf(stderr, "glLockArrays %d %d\n", first, count);
707
708 if (first == 0 && count > 0 && count <= ctx->Const.MaxArrayLockSize) {
709 ctx->Array.LockFirst = first;
710 ctx->Array.LockCount = count;
711 }
712 else {
713 ctx->Array.LockFirst = 0;
714 ctx->Array.LockCount = 0;
715 }
716
717 ctx->NewState |= _NEW_ARRAY;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000718 ctx->Array.NewState |= _NEW_ARRAY_ALL;
Keith Whitwellad2ac212000-11-24 10:25:05 +0000719
720 if (ctx->Driver.LockArraysEXT)
721 ctx->Driver.LockArraysEXT( ctx, first, count );
722}
723
724
725void
726_mesa_UnlockArraysEXT( void )
727{
728 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +0000729 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Keith Whitwellad2ac212000-11-24 10:25:05 +0000730
731 if (MESA_VERBOSE & VERBOSE_API)
732 fprintf(stderr, "glUnlockArrays\n");
733
734 ctx->Array.LockFirst = 0;
735 ctx->Array.LockCount = 0;
736 ctx->NewState |= _NEW_ARRAY;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000737 ctx->Array.NewState |= _NEW_ARRAY_ALL;
Keith Whitwellad2ac212000-11-24 10:25:05 +0000738
739 if (ctx->Driver.UnlockArraysEXT)
740 ctx->Driver.UnlockArraysEXT( ctx );
741}