1 /* $Id: varray.c,v 1.45 2002/06/15 02:38:16 brianp Exp $ */
4 * Mesa 3-D graphics library
7 * Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
9 * 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:
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
19 * 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.
42 #include "math/m_translate.h"
48 _mesa_VertexPointer(GLint size
, GLenum type
, GLsizei stride
, const GLvoid
*ptr
)
50 GET_CURRENT_CONTEXT(ctx
);
51 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
53 if (size
< 2 || size
> 4) {
54 _mesa_error( ctx
, GL_INVALID_VALUE
, "glVertexPointer(size)" );
58 _mesa_error( ctx
, GL_INVALID_VALUE
, "glVertexPointer(stride)" );
62 if (MESA_VERBOSE
&(VERBOSE_VARRAY
|VERBOSE_API
))
63 _mesa_debug(ctx
, "glVertexPointer( sz %d type %s stride %d )\n", size
,
64 _mesa_lookup_enum_by_nr( type
), stride
);
66 /* always need to check that <type> is legal */
69 ctx
->Array
.Vertex
.StrideB
= size
* sizeof(GLshort
);
72 ctx
->Array
.Vertex
.StrideB
= size
* sizeof(GLint
);
75 ctx
->Array
.Vertex
.StrideB
= size
* sizeof(GLfloat
);
78 ctx
->Array
.Vertex
.StrideB
= size
* sizeof(GLdouble
);
81 _mesa_error( ctx
, GL_INVALID_ENUM
, "glVertexPointer(type)" );
86 ctx
->Array
.Vertex
.StrideB
= stride
;
88 ctx
->Array
.Vertex
.Size
= size
;
89 ctx
->Array
.Vertex
.Type
= type
;
90 ctx
->Array
.Vertex
.Stride
= stride
;
91 ctx
->Array
.Vertex
.Ptr
= (void *) ptr
;
92 ctx
->NewState
|= _NEW_ARRAY
;
93 ctx
->Array
.NewState
|= _NEW_ARRAY_VERTEX
;
95 if (ctx
->Driver
.VertexPointer
)
96 ctx
->Driver
.VertexPointer( ctx
, size
, type
, stride
, ptr
);
103 _mesa_NormalPointer(GLenum type
, GLsizei stride
, const GLvoid
*ptr
)
105 GET_CURRENT_CONTEXT(ctx
);
106 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
109 _mesa_error( ctx
, GL_INVALID_VALUE
, "glNormalPointer(stride)" );
113 if (MESA_VERBOSE
&(VERBOSE_VARRAY
|VERBOSE_API
))
114 _mesa_debug(ctx
, "glNormalPointer( type %s stride %d )\n",
115 _mesa_lookup_enum_by_nr( type
), stride
);
119 ctx
->Array
.Normal
.StrideB
= 3 * sizeof(GLbyte
);
122 ctx
->Array
.Normal
.StrideB
= 3 * sizeof(GLshort
);
125 ctx
->Array
.Normal
.StrideB
= 3 * sizeof(GLint
);
128 ctx
->Array
.Normal
.StrideB
= 3 * sizeof(GLfloat
);
131 ctx
->Array
.Normal
.StrideB
= 3 * sizeof(GLdouble
);
134 _mesa_error( ctx
, GL_INVALID_ENUM
, "glNormalPointer(type)" );
138 ctx
->Array
.Normal
.StrideB
= stride
;
140 ctx
->Array
.Normal
.Size
= 3;
141 ctx
->Array
.Normal
.Type
= type
;
142 ctx
->Array
.Normal
.Stride
= stride
;
143 ctx
->Array
.Normal
.Ptr
= (void *) ptr
;
144 ctx
->NewState
|= _NEW_ARRAY
;
145 ctx
->Array
.NewState
|= _NEW_ARRAY_NORMAL
;
147 if (ctx
->Driver
.NormalPointer
)
148 ctx
->Driver
.NormalPointer( ctx
, type
, stride
, ptr
);
154 _mesa_ColorPointer(GLint size
, GLenum type
, GLsizei stride
, const GLvoid
*ptr
)
156 GET_CURRENT_CONTEXT(ctx
);
157 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
159 if (size
< 3 || size
> 4) {
160 _mesa_error( ctx
, GL_INVALID_VALUE
, "glColorPointer(size)" );
164 _mesa_error( ctx
, GL_INVALID_VALUE
, "glColorPointer(stride)" );
168 if (MESA_VERBOSE
&(VERBOSE_VARRAY
|VERBOSE_API
))
169 _mesa_debug(ctx
, "glColorPointer( sz %d type %s stride %d )\n", size
,
170 _mesa_lookup_enum_by_nr( type
), stride
);
174 ctx
->Array
.Color
.StrideB
= size
* sizeof(GLbyte
);
176 case GL_UNSIGNED_BYTE
:
177 ctx
->Array
.Color
.StrideB
= size
* sizeof(GLubyte
);
180 ctx
->Array
.Color
.StrideB
= size
* sizeof(GLshort
);
182 case GL_UNSIGNED_SHORT
:
183 ctx
->Array
.Color
.StrideB
= size
* sizeof(GLushort
);
186 ctx
->Array
.Color
.StrideB
= size
* sizeof(GLint
);
188 case GL_UNSIGNED_INT
:
189 ctx
->Array
.Color
.StrideB
= size
* sizeof(GLuint
);
192 ctx
->Array
.Color
.StrideB
= size
* sizeof(GLfloat
);
195 ctx
->Array
.Color
.StrideB
= size
* sizeof(GLdouble
);
198 _mesa_error( ctx
, GL_INVALID_ENUM
, "glColorPointer(type)" );
203 ctx
->Array
.Color
.StrideB
= stride
;
205 ctx
->Array
.Color
.Size
= size
;
206 ctx
->Array
.Color
.Type
= type
;
207 ctx
->Array
.Color
.Stride
= stride
;
208 ctx
->Array
.Color
.Ptr
= (void *) ptr
;
209 ctx
->NewState
|= _NEW_ARRAY
;
210 ctx
->Array
.NewState
|= _NEW_ARRAY_COLOR0
;
212 if (ctx
->Driver
.ColorPointer
)
213 ctx
->Driver
.ColorPointer( ctx
, size
, type
, stride
, ptr
);
219 _mesa_FogCoordPointerEXT(GLenum type
, GLsizei stride
, const GLvoid
*ptr
)
221 GET_CURRENT_CONTEXT(ctx
);
222 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
225 _mesa_error( ctx
, GL_INVALID_VALUE
, "glFogCoordPointer(stride)" );
231 ctx
->Array
.FogCoord
.StrideB
= sizeof(GLfloat
);
234 ctx
->Array
.FogCoord
.StrideB
= sizeof(GLdouble
);
237 _mesa_error( ctx
, GL_INVALID_ENUM
, "glFogCoordPointer(type)" );
242 ctx
->Array
.FogCoord
.StrideB
= stride
;
244 ctx
->Array
.FogCoord
.Size
= 1;
245 ctx
->Array
.FogCoord
.Type
= type
;
246 ctx
->Array
.FogCoord
.Stride
= stride
;
247 ctx
->Array
.FogCoord
.Ptr
= (void *) ptr
;
248 ctx
->NewState
|= _NEW_ARRAY
;
249 ctx
->Array
.NewState
|= _NEW_ARRAY_FOGCOORD
;
251 if (ctx
->Driver
.FogCoordPointer
)
252 ctx
->Driver
.FogCoordPointer( ctx
, type
, stride
, ptr
);
257 _mesa_IndexPointer(GLenum type
, GLsizei stride
, const GLvoid
*ptr
)
259 GET_CURRENT_CONTEXT(ctx
);
260 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
263 _mesa_error( ctx
, GL_INVALID_VALUE
, "glIndexPointer(stride)" );
268 case GL_UNSIGNED_BYTE
:
269 ctx
->Array
.Index
.StrideB
= sizeof(GLubyte
);
272 ctx
->Array
.Index
.StrideB
= sizeof(GLshort
);
275 ctx
->Array
.Index
.StrideB
= sizeof(GLint
);
278 ctx
->Array
.Index
.StrideB
= sizeof(GLfloat
);
281 ctx
->Array
.Index
.StrideB
= sizeof(GLdouble
);
284 _mesa_error( ctx
, GL_INVALID_ENUM
, "glIndexPointer(type)" );
289 ctx
->Array
.Index
.StrideB
= stride
;
291 ctx
->Array
.Index
.Size
= 1;
292 ctx
->Array
.Index
.Type
= type
;
293 ctx
->Array
.Index
.Stride
= stride
;
294 ctx
->Array
.Index
.Ptr
= (void *) ptr
;
295 ctx
->NewState
|= _NEW_ARRAY
;
296 ctx
->Array
.NewState
|= _NEW_ARRAY_INDEX
;
298 if (ctx
->Driver
.IndexPointer
)
299 ctx
->Driver
.IndexPointer( ctx
, type
, stride
, ptr
);
304 _mesa_SecondaryColorPointerEXT(GLint size
, GLenum type
,
305 GLsizei stride
, const GLvoid
*ptr
)
307 GET_CURRENT_CONTEXT(ctx
);
308 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
310 if (size
!= 3 && size
!= 4) {
311 _mesa_error( ctx
, GL_INVALID_VALUE
, "glSecondaryColorPointer(size)" );
315 _mesa_error( ctx
, GL_INVALID_VALUE
, "glSecondaryColorPointer(stride)" );
319 if (MESA_VERBOSE
&(VERBOSE_VARRAY
|VERBOSE_API
))
320 _mesa_debug(ctx
, "glSecondaryColorPointer( sz %d type %s stride %d )\n",
321 size
, _mesa_lookup_enum_by_nr( type
), stride
);
325 ctx
->Array
.SecondaryColor
.StrideB
= size
* sizeof(GLbyte
);
327 case GL_UNSIGNED_BYTE
:
328 ctx
->Array
.SecondaryColor
.StrideB
= size
* sizeof(GLubyte
);
331 ctx
->Array
.SecondaryColor
.StrideB
= size
* sizeof(GLshort
);
333 case GL_UNSIGNED_SHORT
:
334 ctx
->Array
.SecondaryColor
.StrideB
= size
* sizeof(GLushort
);
337 ctx
->Array
.SecondaryColor
.StrideB
= size
* sizeof(GLint
);
339 case GL_UNSIGNED_INT
:
340 ctx
->Array
.SecondaryColor
.StrideB
= size
* sizeof(GLuint
);
343 ctx
->Array
.SecondaryColor
.StrideB
= size
* sizeof(GLfloat
);
346 ctx
->Array
.SecondaryColor
.StrideB
= size
* sizeof(GLdouble
);
349 _mesa_error( ctx
, GL_INVALID_ENUM
, "glSecondaryColorPointer(type)" );
354 ctx
->Array
.SecondaryColor
.StrideB
= stride
;
356 ctx
->Array
.SecondaryColor
.Size
= 3; /* hardwire */
357 ctx
->Array
.SecondaryColor
.Type
= type
;
358 ctx
->Array
.SecondaryColor
.Stride
= stride
;
359 ctx
->Array
.SecondaryColor
.Ptr
= (void *) ptr
;
360 ctx
->NewState
|= _NEW_ARRAY
;
361 ctx
->Array
.NewState
|= _NEW_ARRAY_COLOR1
;
363 if (ctx
->Driver
.SecondaryColorPointer
)
364 ctx
->Driver
.SecondaryColorPointer( ctx
, size
, type
, stride
, ptr
);
370 _mesa_TexCoordPointer(GLint size
, GLenum type
, GLsizei stride
,
373 GET_CURRENT_CONTEXT(ctx
);
374 GLuint texUnit
= ctx
->Array
.ActiveTexture
;
375 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
377 if (size
< 1 || size
> 4) {
378 _mesa_error( ctx
, GL_INVALID_VALUE
, "glTexCoordPointer(size)" );
382 _mesa_error( ctx
, GL_INVALID_VALUE
, "glTexCoordPointer(stride)" );
386 if (MESA_VERBOSE
&(VERBOSE_VARRAY
|VERBOSE_API
))
387 _mesa_debug(ctx
, "glTexCoordPointer(unit %u sz %d type %s stride %d)\n",
388 texUnit
, size
, _mesa_lookup_enum_by_nr( type
), stride
);
390 /* always need to check that <type> is legal */
393 ctx
->Array
.TexCoord
[texUnit
].StrideB
= size
* sizeof(GLshort
);
396 ctx
->Array
.TexCoord
[texUnit
].StrideB
= size
* sizeof(GLint
);
399 ctx
->Array
.TexCoord
[texUnit
].StrideB
= size
* sizeof(GLfloat
);
402 ctx
->Array
.TexCoord
[texUnit
].StrideB
= size
* sizeof(GLdouble
);
405 _mesa_error( ctx
, GL_INVALID_ENUM
, "glTexCoordPointer(type)" );
410 ctx
->Array
.TexCoord
[texUnit
].StrideB
= stride
;
412 ctx
->Array
.TexCoord
[texUnit
].Size
= size
;
413 ctx
->Array
.TexCoord
[texUnit
].Type
= type
;
414 ctx
->Array
.TexCoord
[texUnit
].Stride
= stride
;
415 ctx
->Array
.TexCoord
[texUnit
].Ptr
= (void *) ptr
;
416 ctx
->NewState
|= _NEW_ARRAY
;
417 ctx
->Array
.NewState
|= _NEW_ARRAY_TEXCOORD(texUnit
);
419 if (ctx
->Driver
.TexCoordPointer
)
420 ctx
->Driver
.TexCoordPointer( ctx
, size
, type
, stride
, ptr
);
425 _mesa_EdgeFlagPointer(GLsizei stride
, const GLvoid
*vptr
)
427 GET_CURRENT_CONTEXT(ctx
);
428 const GLboolean
*ptr
= (GLboolean
*)vptr
;
429 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
432 _mesa_error( ctx
, GL_INVALID_VALUE
, "glEdgeFlagPointer(stride)" );
435 ctx
->Array
.EdgeFlag
.Stride
= stride
;
436 ctx
->Array
.EdgeFlag
.StrideB
= stride
? stride
: sizeof(GLboolean
);
437 ctx
->Array
.EdgeFlag
.Ptr
= (GLboolean
*) ptr
;
438 ctx
->NewState
|= _NEW_ARRAY
;
439 ctx
->Array
.NewState
|= _NEW_ARRAY_EDGEFLAG
;
441 if (ctx
->Driver
.EdgeFlagPointer
)
442 ctx
->Driver
.EdgeFlagPointer( ctx
, stride
, ptr
);
446 void _mesa_VertexAttribPointerNV(GLuint index
, GLint size
, GLenum type
,
447 GLsizei stride
, const GLvoid
*ptr
)
449 GET_CURRENT_CONTEXT(ctx
);
450 ASSERT_OUTSIDE_BEGIN_END(ctx
);
452 if (index
>= VERT_ATTRIB_MAX
) {
453 _mesa_error(ctx
, GL_INVALID_VALUE
, "glVertexAttribPointerNV(index)");
457 if (size
< 1 || size
> 4) {
458 _mesa_error(ctx
, GL_INVALID_VALUE
, "glVertexAttribPointerNV(size)");
463 _mesa_error(ctx
, GL_INVALID_VALUE
, "glVertexAttribPointerNV(stride)");
467 if (type
== GL_UNSIGNED_BYTE
&& size
!= 4) {
468 _mesa_error(ctx
, GL_INVALID_VALUE
, "glVertexAttribPointerNV(size!=4)");
472 /* check for valid 'type' and compute StrideB right away */
474 case GL_UNSIGNED_BYTE
:
475 ctx
->Array
.VertexAttrib
[index
].StrideB
= size
* sizeof(GLubyte
);
478 ctx
->Array
.VertexAttrib
[index
].StrideB
= size
* sizeof(GLshort
);
481 ctx
->Array
.VertexAttrib
[index
].StrideB
= size
* sizeof(GLfloat
);
484 ctx
->Array
.VertexAttrib
[index
].StrideB
= size
* sizeof(GLdouble
);
487 _mesa_error( ctx
, GL_INVALID_ENUM
, "glVertexAttribPointerNV(type)" );
492 ctx
->Array
.VertexAttrib
[index
].StrideB
= stride
;
494 ctx
->Array
.VertexAttrib
[index
].Stride
= stride
;
495 ctx
->Array
.VertexAttrib
[index
].Size
= size
;
496 ctx
->Array
.VertexAttrib
[index
].Type
= type
;
497 ctx
->Array
.VertexAttrib
[index
].Ptr
= (void *) ptr
;
499 ctx
->NewState
|= _NEW_ARRAY
;
500 ctx
->Array
.NewState
|= _NEW_ARRAY_ATTRIB(index
);
502 if (ctx
->Driver
.VertexAttribPointer
)
503 ctx
->Driver
.VertexAttribPointer( ctx
, index
, size
, type
, stride
, ptr
);
508 _mesa_VertexPointerEXT(GLint size
, GLenum type
, GLsizei stride
,
509 GLsizei count
, const GLvoid
*ptr
)
512 _mesa_VertexPointer(size
, type
, stride
, ptr
);
517 _mesa_NormalPointerEXT(GLenum type
, GLsizei stride
, GLsizei count
,
521 _mesa_NormalPointer(type
, stride
, ptr
);
526 _mesa_ColorPointerEXT(GLint size
, GLenum type
, GLsizei stride
, GLsizei count
,
530 _mesa_ColorPointer(size
, type
, stride
, ptr
);
535 _mesa_IndexPointerEXT(GLenum type
, GLsizei stride
, GLsizei count
,
539 _mesa_IndexPointer(type
, stride
, ptr
);
544 _mesa_TexCoordPointerEXT(GLint size
, GLenum type
, GLsizei stride
,
545 GLsizei count
, const GLvoid
*ptr
)
548 _mesa_TexCoordPointer(size
, type
, stride
, ptr
);
553 _mesa_EdgeFlagPointerEXT(GLsizei stride
, GLsizei count
, const GLboolean
*ptr
)
556 _mesa_EdgeFlagPointer(stride
, ptr
);
563 _mesa_InterleavedArrays(GLenum format
, GLsizei stride
, const GLvoid
*pointer
)
565 GET_CURRENT_CONTEXT(ctx
);
566 GLboolean tflag
, cflag
, nflag
; /* enable/disable flags */
567 GLint tcomps
, ccomps
, vcomps
; /* components per texcoord, color, vertex */
569 GLenum ctype
= 0; /* color type */
570 GLint coffset
= 0, noffset
= 0, voffset
;/* color, normal, vertex offsets */
571 GLint defstride
; /* default stride */
575 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
578 c
= f
* ((4*sizeof(GLubyte
) + (f
-1)) / f
);
581 _mesa_error( ctx
, GL_INVALID_VALUE
, "glInterleavedArrays(stride)" );
587 tflag
= GL_FALSE
; cflag
= GL_FALSE
; nflag
= GL_FALSE
;
588 tcomps
= 0; ccomps
= 0; vcomps
= 2;
593 tflag
= GL_FALSE
; cflag
= GL_FALSE
; nflag
= GL_FALSE
;
594 tcomps
= 0; ccomps
= 0; vcomps
= 3;
599 tflag
= GL_FALSE
; cflag
= GL_TRUE
; nflag
= GL_FALSE
;
600 tcomps
= 0; ccomps
= 4; vcomps
= 2;
601 ctype
= GL_UNSIGNED_BYTE
;
607 tflag
= GL_FALSE
; cflag
= GL_TRUE
; nflag
= GL_FALSE
;
608 tcomps
= 0; ccomps
= 4; vcomps
= 3;
609 ctype
= GL_UNSIGNED_BYTE
;
615 tflag
= GL_FALSE
; cflag
= GL_TRUE
; nflag
= GL_FALSE
;
616 tcomps
= 0; ccomps
= 3; vcomps
= 3;
623 tflag
= GL_FALSE
; cflag
= GL_FALSE
; nflag
= GL_TRUE
;
624 tcomps
= 0; ccomps
= 0; vcomps
= 3;
630 tflag
= GL_FALSE
; cflag
= GL_TRUE
; nflag
= GL_TRUE
;
631 tcomps
= 0; ccomps
= 4; vcomps
= 3;
639 tflag
= GL_TRUE
; cflag
= GL_FALSE
; nflag
= GL_FALSE
;
640 tcomps
= 2; ccomps
= 0; vcomps
= 3;
645 tflag
= GL_TRUE
; cflag
= GL_FALSE
; nflag
= GL_FALSE
;
646 tcomps
= 4; ccomps
= 0; vcomps
= 4;
650 case GL_T2F_C4UB_V3F
:
651 tflag
= GL_TRUE
; cflag
= GL_TRUE
; nflag
= GL_FALSE
;
652 tcomps
= 2; ccomps
= 4; vcomps
= 3;
653 ctype
= GL_UNSIGNED_BYTE
;
659 tflag
= GL_TRUE
; cflag
= GL_TRUE
; nflag
= GL_FALSE
;
660 tcomps
= 2; ccomps
= 3; vcomps
= 3;
667 tflag
= GL_TRUE
; cflag
= GL_FALSE
; nflag
= GL_TRUE
;
668 tcomps
= 2; ccomps
= 0; vcomps
= 3;
673 case GL_T2F_C4F_N3F_V3F
:
674 tflag
= GL_TRUE
; cflag
= GL_TRUE
; nflag
= GL_TRUE
;
675 tcomps
= 2; ccomps
= 4; vcomps
= 3;
682 case GL_T4F_C4F_N3F_V4F
:
683 tflag
= GL_TRUE
; cflag
= GL_TRUE
; nflag
= GL_TRUE
;
684 tcomps
= 4; ccomps
= 4; vcomps
= 4;
692 _mesa_error( ctx
, GL_INVALID_ENUM
, "glInterleavedArrays(format)" );
700 _mesa_DisableClientState( GL_EDGE_FLAG_ARRAY
);
701 _mesa_DisableClientState( GL_INDEX_ARRAY
);
704 coordUnitSave
= ctx
->Array
.ActiveTexture
;
707 GLint factor
= ctx
->Array
.TexCoordInterleaveFactor
;
708 for (i
= 0; i
< factor
; i
++) {
709 _mesa_ClientActiveTextureARB( (GLenum
) (GL_TEXTURE0_ARB
+ i
) );
710 _mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY
);
711 _mesa_TexCoordPointer( tcomps
, GL_FLOAT
, stride
,
712 (GLubyte
*) pointer
+ i
* coffset
);
714 for (i
= factor
; i
< (GLint
) ctx
->Const
.MaxTextureUnits
; i
++) {
715 _mesa_ClientActiveTextureARB( (GLenum
) (GL_TEXTURE0_ARB
+ i
) );
716 _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY
);
721 for (i
= 0; i
< (GLint
) ctx
->Const
.MaxTextureUnits
; i
++) {
722 _mesa_ClientActiveTextureARB( (GLenum
) (GL_TEXTURE0_ARB
+ i
) );
723 _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY
);
726 /* Restore texture coordinate unit index */
727 _mesa_ClientActiveTextureARB( (GLenum
) (GL_TEXTURE0_ARB
+ coordUnitSave
) );
732 _mesa_EnableClientState( GL_COLOR_ARRAY
);
733 _mesa_ColorPointer( ccomps
, ctype
, stride
,
734 (GLubyte
*) pointer
+ coffset
);
737 _mesa_DisableClientState( GL_COLOR_ARRAY
);
743 _mesa_EnableClientState( GL_NORMAL_ARRAY
);
744 _mesa_NormalPointer( GL_FLOAT
, stride
,
745 (GLubyte
*) pointer
+ noffset
);
748 _mesa_DisableClientState( GL_NORMAL_ARRAY
);
751 _mesa_EnableClientState( GL_VERTEX_ARRAY
);
752 _mesa_VertexPointer( vcomps
, GL_FLOAT
, stride
,
753 (GLubyte
*) pointer
+ voffset
);
759 _mesa_LockArraysEXT(GLint first
, GLsizei count
)
761 GET_CURRENT_CONTEXT(ctx
);
762 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
764 if (MESA_VERBOSE
& VERBOSE_API
)
765 _mesa_debug(ctx
, "glLockArrays %d %d\n", first
, count
);
767 if (first
== 0 && count
> 0 &&
768 count
<= (GLint
) ctx
->Const
.MaxArrayLockSize
) {
769 ctx
->Array
.LockFirst
= first
;
770 ctx
->Array
.LockCount
= count
;
773 ctx
->Array
.LockFirst
= 0;
774 ctx
->Array
.LockCount
= 0;
777 ctx
->NewState
|= _NEW_ARRAY
;
778 ctx
->Array
.NewState
|= _NEW_ARRAY_ALL
;
780 if (ctx
->Driver
.LockArraysEXT
)
781 ctx
->Driver
.LockArraysEXT( ctx
, first
, count
);
786 _mesa_UnlockArraysEXT( void )
788 GET_CURRENT_CONTEXT(ctx
);
789 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
791 if (MESA_VERBOSE
& VERBOSE_API
)
792 _mesa_debug(ctx
, "glUnlockArrays\n");
794 ctx
->Array
.LockFirst
= 0;
795 ctx
->Array
.LockCount
= 0;
796 ctx
->NewState
|= _NEW_ARRAY
;
797 ctx
->Array
.NewState
|= _NEW_ARRAY_ALL
;
799 if (ctx
->Driver
.UnlockArraysEXT
)
800 ctx
->Driver
.UnlockArraysEXT( ctx
);