1 /* $Id: varray.c,v 1.44 2002/06/13 04:49:17 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("glVertexPointer( sz %d type %s stride %d )\n", size
,
64 _mesa_lookup_enum_by_nr( type
),
67 /* always need to check that <type> is legal */
70 ctx
->Array
.Vertex
.StrideB
= size
* sizeof(GLshort
);
73 ctx
->Array
.Vertex
.StrideB
= size
* sizeof(GLint
);
76 ctx
->Array
.Vertex
.StrideB
= size
* sizeof(GLfloat
);
79 ctx
->Array
.Vertex
.StrideB
= size
* sizeof(GLdouble
);
82 _mesa_error( ctx
, GL_INVALID_ENUM
, "glVertexPointer(type)" );
87 ctx
->Array
.Vertex
.StrideB
= stride
;
89 ctx
->Array
.Vertex
.Size
= size
;
90 ctx
->Array
.Vertex
.Type
= type
;
91 ctx
->Array
.Vertex
.Stride
= stride
;
92 ctx
->Array
.Vertex
.Ptr
= (void *) ptr
;
93 ctx
->NewState
|= _NEW_ARRAY
;
94 ctx
->Array
.NewState
|= _NEW_ARRAY_VERTEX
;
96 if (ctx
->Driver
.VertexPointer
)
97 ctx
->Driver
.VertexPointer( ctx
, size
, type
, stride
, ptr
);
104 _mesa_NormalPointer(GLenum type
, GLsizei stride
, const GLvoid
*ptr
)
106 GET_CURRENT_CONTEXT(ctx
);
107 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
110 _mesa_error( ctx
, GL_INVALID_VALUE
, "glNormalPointer(stride)" );
114 if (MESA_VERBOSE
&(VERBOSE_VARRAY
|VERBOSE_API
))
115 _mesa_debug("glNormalPointer( type %s stride %d )\n",
116 _mesa_lookup_enum_by_nr( type
),
121 ctx
->Array
.Normal
.StrideB
= 3 * sizeof(GLbyte
);
124 ctx
->Array
.Normal
.StrideB
= 3 * sizeof(GLshort
);
127 ctx
->Array
.Normal
.StrideB
= 3 * sizeof(GLint
);
130 ctx
->Array
.Normal
.StrideB
= 3 * sizeof(GLfloat
);
133 ctx
->Array
.Normal
.StrideB
= 3 * sizeof(GLdouble
);
136 _mesa_error( ctx
, GL_INVALID_ENUM
, "glNormalPointer(type)" );
140 ctx
->Array
.Normal
.StrideB
= stride
;
142 ctx
->Array
.Normal
.Size
= 3;
143 ctx
->Array
.Normal
.Type
= type
;
144 ctx
->Array
.Normal
.Stride
= stride
;
145 ctx
->Array
.Normal
.Ptr
= (void *) ptr
;
146 ctx
->NewState
|= _NEW_ARRAY
;
147 ctx
->Array
.NewState
|= _NEW_ARRAY_NORMAL
;
149 if (ctx
->Driver
.NormalPointer
)
150 ctx
->Driver
.NormalPointer( ctx
, type
, stride
, ptr
);
156 _mesa_ColorPointer(GLint size
, GLenum type
, GLsizei stride
, const GLvoid
*ptr
)
158 GET_CURRENT_CONTEXT(ctx
);
159 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
161 if (size
< 3 || size
> 4) {
162 _mesa_error( ctx
, GL_INVALID_VALUE
, "glColorPointer(size)" );
166 _mesa_error( ctx
, GL_INVALID_VALUE
, "glColorPointer(stride)" );
170 if (MESA_VERBOSE
&(VERBOSE_VARRAY
|VERBOSE_API
))
171 _mesa_debug("glColorPointer( sz %d type %s stride %d )\n", size
,
172 _mesa_lookup_enum_by_nr( type
),
177 ctx
->Array
.Color
.StrideB
= size
* sizeof(GLbyte
);
179 case GL_UNSIGNED_BYTE
:
180 ctx
->Array
.Color
.StrideB
= size
* sizeof(GLubyte
);
183 ctx
->Array
.Color
.StrideB
= size
* sizeof(GLshort
);
185 case GL_UNSIGNED_SHORT
:
186 ctx
->Array
.Color
.StrideB
= size
* sizeof(GLushort
);
189 ctx
->Array
.Color
.StrideB
= size
* sizeof(GLint
);
191 case GL_UNSIGNED_INT
:
192 ctx
->Array
.Color
.StrideB
= size
* sizeof(GLuint
);
195 ctx
->Array
.Color
.StrideB
= size
* sizeof(GLfloat
);
198 ctx
->Array
.Color
.StrideB
= size
* sizeof(GLdouble
);
201 _mesa_error( ctx
, GL_INVALID_ENUM
, "glColorPointer(type)" );
206 ctx
->Array
.Color
.StrideB
= stride
;
208 ctx
->Array
.Color
.Size
= size
;
209 ctx
->Array
.Color
.Type
= type
;
210 ctx
->Array
.Color
.Stride
= stride
;
211 ctx
->Array
.Color
.Ptr
= (void *) ptr
;
212 ctx
->NewState
|= _NEW_ARRAY
;
213 ctx
->Array
.NewState
|= _NEW_ARRAY_COLOR0
;
215 if (ctx
->Driver
.ColorPointer
)
216 ctx
->Driver
.ColorPointer( ctx
, size
, type
, stride
, ptr
);
222 _mesa_FogCoordPointerEXT(GLenum type
, GLsizei stride
, const GLvoid
*ptr
)
224 GET_CURRENT_CONTEXT(ctx
);
225 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
228 _mesa_error( ctx
, GL_INVALID_VALUE
, "glFogCoordPointer(stride)" );
234 ctx
->Array
.FogCoord
.StrideB
= sizeof(GLfloat
);
237 ctx
->Array
.FogCoord
.StrideB
= sizeof(GLdouble
);
240 _mesa_error( ctx
, GL_INVALID_ENUM
, "glFogCoordPointer(type)" );
245 ctx
->Array
.FogCoord
.StrideB
= stride
;
247 ctx
->Array
.FogCoord
.Size
= 1;
248 ctx
->Array
.FogCoord
.Type
= type
;
249 ctx
->Array
.FogCoord
.Stride
= stride
;
250 ctx
->Array
.FogCoord
.Ptr
= (void *) ptr
;
251 ctx
->NewState
|= _NEW_ARRAY
;
252 ctx
->Array
.NewState
|= _NEW_ARRAY_FOGCOORD
;
254 if (ctx
->Driver
.FogCoordPointer
)
255 ctx
->Driver
.FogCoordPointer( ctx
, type
, stride
, ptr
);
260 _mesa_IndexPointer(GLenum type
, GLsizei stride
, const GLvoid
*ptr
)
262 GET_CURRENT_CONTEXT(ctx
);
263 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
266 _mesa_error( ctx
, GL_INVALID_VALUE
, "glIndexPointer(stride)" );
271 case GL_UNSIGNED_BYTE
:
272 ctx
->Array
.Index
.StrideB
= sizeof(GLubyte
);
275 ctx
->Array
.Index
.StrideB
= sizeof(GLshort
);
278 ctx
->Array
.Index
.StrideB
= sizeof(GLint
);
281 ctx
->Array
.Index
.StrideB
= sizeof(GLfloat
);
284 ctx
->Array
.Index
.StrideB
= sizeof(GLdouble
);
287 _mesa_error( ctx
, GL_INVALID_ENUM
, "glIndexPointer(type)" );
292 ctx
->Array
.Index
.StrideB
= stride
;
294 ctx
->Array
.Index
.Size
= 1;
295 ctx
->Array
.Index
.Type
= type
;
296 ctx
->Array
.Index
.Stride
= stride
;
297 ctx
->Array
.Index
.Ptr
= (void *) ptr
;
298 ctx
->NewState
|= _NEW_ARRAY
;
299 ctx
->Array
.NewState
|= _NEW_ARRAY_INDEX
;
301 if (ctx
->Driver
.IndexPointer
)
302 ctx
->Driver
.IndexPointer( ctx
, type
, stride
, ptr
);
307 _mesa_SecondaryColorPointerEXT(GLint size
, GLenum type
,
308 GLsizei stride
, const GLvoid
*ptr
)
310 GET_CURRENT_CONTEXT(ctx
);
311 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
313 if (size
!= 3 && size
!= 4) {
314 _mesa_error( ctx
, GL_INVALID_VALUE
, "glSecondaryColorPointer(size)" );
318 _mesa_error( ctx
, GL_INVALID_VALUE
, "glSecondaryColorPointer(stride)" );
322 if (MESA_VERBOSE
&(VERBOSE_VARRAY
|VERBOSE_API
))
323 _mesa_debug("glSecondaryColorPointer( sz %d type %s stride %d )\n",
324 size
, _mesa_lookup_enum_by_nr( type
), stride
);
328 ctx
->Array
.SecondaryColor
.StrideB
= size
* sizeof(GLbyte
);
330 case GL_UNSIGNED_BYTE
:
331 ctx
->Array
.SecondaryColor
.StrideB
= size
* sizeof(GLubyte
);
334 ctx
->Array
.SecondaryColor
.StrideB
= size
* sizeof(GLshort
);
336 case GL_UNSIGNED_SHORT
:
337 ctx
->Array
.SecondaryColor
.StrideB
= size
* sizeof(GLushort
);
340 ctx
->Array
.SecondaryColor
.StrideB
= size
* sizeof(GLint
);
342 case GL_UNSIGNED_INT
:
343 ctx
->Array
.SecondaryColor
.StrideB
= size
* sizeof(GLuint
);
346 ctx
->Array
.SecondaryColor
.StrideB
= size
* sizeof(GLfloat
);
349 ctx
->Array
.SecondaryColor
.StrideB
= size
* sizeof(GLdouble
);
352 _mesa_error( ctx
, GL_INVALID_ENUM
, "glSecondaryColorPointer(type)" );
357 ctx
->Array
.SecondaryColor
.StrideB
= stride
;
359 ctx
->Array
.SecondaryColor
.Size
= 3; /* hardwire */
360 ctx
->Array
.SecondaryColor
.Type
= type
;
361 ctx
->Array
.SecondaryColor
.Stride
= stride
;
362 ctx
->Array
.SecondaryColor
.Ptr
= (void *) ptr
;
363 ctx
->NewState
|= _NEW_ARRAY
;
364 ctx
->Array
.NewState
|= _NEW_ARRAY_COLOR1
;
366 if (ctx
->Driver
.SecondaryColorPointer
)
367 ctx
->Driver
.SecondaryColorPointer( ctx
, size
, type
, stride
, ptr
);
373 _mesa_TexCoordPointer(GLint size
, GLenum type
, GLsizei stride
,
376 GET_CURRENT_CONTEXT(ctx
);
377 GLuint texUnit
= ctx
->Array
.ActiveTexture
;
378 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
380 if (size
< 1 || size
> 4) {
381 _mesa_error( ctx
, GL_INVALID_VALUE
, "glTexCoordPointer(size)" );
385 _mesa_error( ctx
, GL_INVALID_VALUE
, "glTexCoordPointer(stride)" );
389 if (MESA_VERBOSE
&(VERBOSE_VARRAY
|VERBOSE_API
))
390 _mesa_debug("glTexCoordPointer( unit %u sz %d type %s stride %d )\n",
393 _mesa_lookup_enum_by_nr( type
),
396 /* always need to check that <type> is legal */
399 ctx
->Array
.TexCoord
[texUnit
].StrideB
= size
* sizeof(GLshort
);
402 ctx
->Array
.TexCoord
[texUnit
].StrideB
= size
* sizeof(GLint
);
405 ctx
->Array
.TexCoord
[texUnit
].StrideB
= size
* sizeof(GLfloat
);
408 ctx
->Array
.TexCoord
[texUnit
].StrideB
= size
* sizeof(GLdouble
);
411 _mesa_error( ctx
, GL_INVALID_ENUM
, "glTexCoordPointer(type)" );
416 ctx
->Array
.TexCoord
[texUnit
].StrideB
= stride
;
418 ctx
->Array
.TexCoord
[texUnit
].Size
= size
;
419 ctx
->Array
.TexCoord
[texUnit
].Type
= type
;
420 ctx
->Array
.TexCoord
[texUnit
].Stride
= stride
;
421 ctx
->Array
.TexCoord
[texUnit
].Ptr
= (void *) ptr
;
422 ctx
->NewState
|= _NEW_ARRAY
;
423 ctx
->Array
.NewState
|= _NEW_ARRAY_TEXCOORD(texUnit
);
425 if (ctx
->Driver
.TexCoordPointer
)
426 ctx
->Driver
.TexCoordPointer( ctx
, size
, type
, stride
, ptr
);
431 _mesa_EdgeFlagPointer(GLsizei stride
, const GLvoid
*vptr
)
433 GET_CURRENT_CONTEXT(ctx
);
434 const GLboolean
*ptr
= (GLboolean
*)vptr
;
435 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
438 _mesa_error( ctx
, GL_INVALID_VALUE
, "glEdgeFlagPointer(stride)" );
441 ctx
->Array
.EdgeFlag
.Stride
= stride
;
442 ctx
->Array
.EdgeFlag
.StrideB
= stride
? stride
: sizeof(GLboolean
);
443 ctx
->Array
.EdgeFlag
.Ptr
= (GLboolean
*) ptr
;
444 ctx
->NewState
|= _NEW_ARRAY
;
445 ctx
->Array
.NewState
|= _NEW_ARRAY_EDGEFLAG
;
447 if (ctx
->Driver
.EdgeFlagPointer
)
448 ctx
->Driver
.EdgeFlagPointer( ctx
, stride
, ptr
);
452 void _mesa_VertexAttribPointerNV(GLuint index
, GLint size
, GLenum type
,
453 GLsizei stride
, const GLvoid
*ptr
)
455 GET_CURRENT_CONTEXT(ctx
);
456 ASSERT_OUTSIDE_BEGIN_END(ctx
);
458 if (index
>= VERT_ATTRIB_MAX
) {
459 _mesa_error(ctx
, GL_INVALID_VALUE
, "glVertexAttribPointerNV(index)");
463 if (size
< 1 || size
> 4) {
464 _mesa_error(ctx
, GL_INVALID_VALUE
, "glVertexAttribPointerNV(size)");
469 _mesa_error(ctx
, GL_INVALID_VALUE
, "glVertexAttribPointerNV(stride)");
473 if (type
== GL_UNSIGNED_BYTE
&& size
!= 4) {
474 _mesa_error(ctx
, GL_INVALID_VALUE
, "glVertexAttribPointerNV(size!=4)");
478 /* check for valid 'type' and compute StrideB right away */
480 case GL_UNSIGNED_BYTE
:
481 ctx
->Array
.VertexAttrib
[index
].StrideB
= size
* sizeof(GLubyte
);
484 ctx
->Array
.VertexAttrib
[index
].StrideB
= size
* sizeof(GLshort
);
487 ctx
->Array
.VertexAttrib
[index
].StrideB
= size
* sizeof(GLfloat
);
490 ctx
->Array
.VertexAttrib
[index
].StrideB
= size
* sizeof(GLdouble
);
493 _mesa_error( ctx
, GL_INVALID_ENUM
, "glVertexAttribPointerNV(type)" );
498 ctx
->Array
.VertexAttrib
[index
].StrideB
= stride
;
500 ctx
->Array
.VertexAttrib
[index
].Stride
= stride
;
501 ctx
->Array
.VertexAttrib
[index
].Size
= size
;
502 ctx
->Array
.VertexAttrib
[index
].Type
= type
;
503 ctx
->Array
.VertexAttrib
[index
].Ptr
= (void *) ptr
;
505 ctx
->NewState
|= _NEW_ARRAY
;
506 ctx
->Array
.NewState
|= _NEW_ARRAY_ATTRIB(index
);
508 if (ctx
->Driver
.VertexAttribPointer
)
509 ctx
->Driver
.VertexAttribPointer( ctx
, index
, size
, type
, stride
, ptr
);
514 _mesa_VertexPointerEXT(GLint size
, GLenum type
, GLsizei stride
,
515 GLsizei count
, const GLvoid
*ptr
)
518 _mesa_VertexPointer(size
, type
, stride
, ptr
);
523 _mesa_NormalPointerEXT(GLenum type
, GLsizei stride
, GLsizei count
,
527 _mesa_NormalPointer(type
, stride
, ptr
);
532 _mesa_ColorPointerEXT(GLint size
, GLenum type
, GLsizei stride
, GLsizei count
,
536 _mesa_ColorPointer(size
, type
, stride
, ptr
);
541 _mesa_IndexPointerEXT(GLenum type
, GLsizei stride
, GLsizei count
,
545 _mesa_IndexPointer(type
, stride
, ptr
);
550 _mesa_TexCoordPointerEXT(GLint size
, GLenum type
, GLsizei stride
,
551 GLsizei count
, const GLvoid
*ptr
)
554 _mesa_TexCoordPointer(size
, type
, stride
, ptr
);
559 _mesa_EdgeFlagPointerEXT(GLsizei stride
, GLsizei count
, const GLboolean
*ptr
)
562 _mesa_EdgeFlagPointer(stride
, ptr
);
569 _mesa_InterleavedArrays(GLenum format
, GLsizei stride
, const GLvoid
*pointer
)
571 GET_CURRENT_CONTEXT(ctx
);
572 GLboolean tflag
, cflag
, nflag
; /* enable/disable flags */
573 GLint tcomps
, ccomps
, vcomps
; /* components per texcoord, color, vertex */
575 GLenum ctype
= 0; /* color type */
576 GLint coffset
= 0, noffset
= 0, voffset
;/* color, normal, vertex offsets */
577 GLint defstride
; /* default stride */
581 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
584 c
= f
* ((4*sizeof(GLubyte
) + (f
-1)) / f
);
587 _mesa_error( ctx
, GL_INVALID_VALUE
, "glInterleavedArrays(stride)" );
593 tflag
= GL_FALSE
; cflag
= GL_FALSE
; nflag
= GL_FALSE
;
594 tcomps
= 0; ccomps
= 0; vcomps
= 2;
599 tflag
= GL_FALSE
; cflag
= GL_FALSE
; nflag
= GL_FALSE
;
600 tcomps
= 0; ccomps
= 0; vcomps
= 3;
605 tflag
= GL_FALSE
; cflag
= GL_TRUE
; nflag
= GL_FALSE
;
606 tcomps
= 0; ccomps
= 4; vcomps
= 2;
607 ctype
= GL_UNSIGNED_BYTE
;
613 tflag
= GL_FALSE
; cflag
= GL_TRUE
; nflag
= GL_FALSE
;
614 tcomps
= 0; ccomps
= 4; vcomps
= 3;
615 ctype
= GL_UNSIGNED_BYTE
;
621 tflag
= GL_FALSE
; cflag
= GL_TRUE
; nflag
= GL_FALSE
;
622 tcomps
= 0; ccomps
= 3; vcomps
= 3;
629 tflag
= GL_FALSE
; cflag
= GL_FALSE
; nflag
= GL_TRUE
;
630 tcomps
= 0; ccomps
= 0; vcomps
= 3;
636 tflag
= GL_FALSE
; cflag
= GL_TRUE
; nflag
= GL_TRUE
;
637 tcomps
= 0; ccomps
= 4; vcomps
= 3;
645 tflag
= GL_TRUE
; cflag
= GL_FALSE
; nflag
= GL_FALSE
;
646 tcomps
= 2; ccomps
= 0; vcomps
= 3;
651 tflag
= GL_TRUE
; cflag
= GL_FALSE
; nflag
= GL_FALSE
;
652 tcomps
= 4; ccomps
= 0; vcomps
= 4;
656 case GL_T2F_C4UB_V3F
:
657 tflag
= GL_TRUE
; cflag
= GL_TRUE
; nflag
= GL_FALSE
;
658 tcomps
= 2; ccomps
= 4; vcomps
= 3;
659 ctype
= GL_UNSIGNED_BYTE
;
665 tflag
= GL_TRUE
; cflag
= GL_TRUE
; nflag
= GL_FALSE
;
666 tcomps
= 2; ccomps
= 3; vcomps
= 3;
673 tflag
= GL_TRUE
; cflag
= GL_FALSE
; nflag
= GL_TRUE
;
674 tcomps
= 2; ccomps
= 0; vcomps
= 3;
679 case GL_T2F_C4F_N3F_V3F
:
680 tflag
= GL_TRUE
; cflag
= GL_TRUE
; nflag
= GL_TRUE
;
681 tcomps
= 2; ccomps
= 4; vcomps
= 3;
688 case GL_T4F_C4F_N3F_V4F
:
689 tflag
= GL_TRUE
; cflag
= GL_TRUE
; nflag
= GL_TRUE
;
690 tcomps
= 4; ccomps
= 4; vcomps
= 4;
698 _mesa_error( ctx
, GL_INVALID_ENUM
, "glInterleavedArrays(format)" );
706 _mesa_DisableClientState( GL_EDGE_FLAG_ARRAY
);
707 _mesa_DisableClientState( GL_INDEX_ARRAY
);
710 coordUnitSave
= ctx
->Array
.ActiveTexture
;
713 GLint factor
= ctx
->Array
.TexCoordInterleaveFactor
;
714 for (i
= 0; i
< factor
; i
++) {
715 _mesa_ClientActiveTextureARB( (GLenum
) (GL_TEXTURE0_ARB
+ i
) );
716 _mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY
);
717 _mesa_TexCoordPointer( tcomps
, GL_FLOAT
, stride
,
718 (GLubyte
*) pointer
+ i
* coffset
);
720 for (i
= factor
; i
< (GLint
) ctx
->Const
.MaxTextureUnits
; i
++) {
721 _mesa_ClientActiveTextureARB( (GLenum
) (GL_TEXTURE0_ARB
+ i
) );
722 _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY
);
727 for (i
= 0; i
< (GLint
) ctx
->Const
.MaxTextureUnits
; i
++) {
728 _mesa_ClientActiveTextureARB( (GLenum
) (GL_TEXTURE0_ARB
+ i
) );
729 _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY
);
732 /* Restore texture coordinate unit index */
733 _mesa_ClientActiveTextureARB( (GLenum
) (GL_TEXTURE0_ARB
+ coordUnitSave
) );
738 _mesa_EnableClientState( GL_COLOR_ARRAY
);
739 _mesa_ColorPointer( ccomps
, ctype
, stride
,
740 (GLubyte
*) pointer
+ coffset
);
743 _mesa_DisableClientState( GL_COLOR_ARRAY
);
749 _mesa_EnableClientState( GL_NORMAL_ARRAY
);
750 _mesa_NormalPointer( GL_FLOAT
, stride
,
751 (GLubyte
*) pointer
+ noffset
);
754 _mesa_DisableClientState( GL_NORMAL_ARRAY
);
757 _mesa_EnableClientState( GL_VERTEX_ARRAY
);
758 _mesa_VertexPointer( vcomps
, GL_FLOAT
, stride
,
759 (GLubyte
*) pointer
+ voffset
);
765 _mesa_LockArraysEXT(GLint first
, GLsizei count
)
767 GET_CURRENT_CONTEXT(ctx
);
768 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
770 if (MESA_VERBOSE
& VERBOSE_API
)
771 _mesa_debug("glLockArrays %d %d\n", first
, count
);
773 if (first
== 0 && count
> 0 &&
774 count
<= (GLint
) ctx
->Const
.MaxArrayLockSize
) {
775 ctx
->Array
.LockFirst
= first
;
776 ctx
->Array
.LockCount
= count
;
779 ctx
->Array
.LockFirst
= 0;
780 ctx
->Array
.LockCount
= 0;
783 ctx
->NewState
|= _NEW_ARRAY
;
784 ctx
->Array
.NewState
|= _NEW_ARRAY_ALL
;
786 if (ctx
->Driver
.LockArraysEXT
)
787 ctx
->Driver
.LockArraysEXT( ctx
, first
, count
);
792 _mesa_UnlockArraysEXT( void )
794 GET_CURRENT_CONTEXT(ctx
);
795 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
797 if (MESA_VERBOSE
& VERBOSE_API
)
798 _mesa_debug("glUnlockArrays\n");
800 ctx
->Array
.LockFirst
= 0;
801 ctx
->Array
.LockCount
= 0;
802 ctx
->NewState
|= _NEW_ARRAY
;
803 ctx
->Array
.NewState
|= _NEW_ARRAY_ALL
;
805 if (ctx
->Driver
.UnlockArraysEXT
)
806 ctx
->Driver
.UnlockArraysEXT( ctx
);