1 /* $Id: varray.c,v 1.38 2001/03/07 05:06:12 brianp Exp $ */
4 * Mesa 3-D graphics library
7 * Copyright (C) 1999-2000 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 fprintf(stderr
, "glVertexPointer( sz %d type %s stride %d )\n", size
,
64 _mesa_lookup_enum_by_nr( type
),
67 ctx
->Array
.Vertex
.StrideB
= stride
;
71 ctx
->Array
.Vertex
.StrideB
= size
*sizeof(GLshort
);
74 ctx
->Array
.Vertex
.StrideB
= size
*sizeof(GLint
);
77 ctx
->Array
.Vertex
.StrideB
= size
*sizeof(GLfloat
);
80 ctx
->Array
.Vertex
.StrideB
= size
*sizeof(GLdouble
);
83 _mesa_error( ctx
, GL_INVALID_ENUM
, "glVertexPointer(type)" );
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
;
91 ctx
->NewState
|= _NEW_ARRAY
;
92 ctx
->Array
.NewState
|= _NEW_ARRAY_VERTEX
;
94 if (ctx
->Driver
.VertexPointer
)
95 ctx
->Driver
.VertexPointer( ctx
, size
, type
, stride
, ptr
);
102 _mesa_NormalPointer(GLenum type
, GLsizei stride
, const GLvoid
*ptr
)
104 GET_CURRENT_CONTEXT(ctx
);
105 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
108 _mesa_error( ctx
, GL_INVALID_VALUE
, "glNormalPointer(stride)" );
112 if (MESA_VERBOSE
&(VERBOSE_VARRAY
|VERBOSE_API
))
113 fprintf(stderr
, "glNormalPointer( type %s stride %d )\n",
114 _mesa_lookup_enum_by_nr( type
),
117 ctx
->Array
.Normal
.StrideB
= stride
;
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
.Type
= type
;
141 ctx
->Array
.Normal
.Stride
= stride
;
142 ctx
->Array
.Normal
.Ptr
= (void *) ptr
;
143 ctx
->NewState
|= _NEW_ARRAY
;
144 ctx
->Array
.NewState
|= _NEW_ARRAY_VERTEX
;
146 if (ctx
->Driver
.NormalPointer
)
147 ctx
->Driver
.NormalPointer( ctx
, type
, stride
, ptr
);
153 _mesa_ColorPointer(GLint size
, GLenum type
, GLsizei stride
, const GLvoid
*ptr
)
155 GET_CURRENT_CONTEXT(ctx
);
156 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
158 if (size
<3 || size
>4) {
159 _mesa_error( ctx
, GL_INVALID_VALUE
, "glColorPointer(size)" );
163 _mesa_error( ctx
, GL_INVALID_VALUE
, "glColorPointer(stride)" );
167 if (MESA_VERBOSE
&(VERBOSE_VARRAY
|VERBOSE_API
))
168 fprintf(stderr
, "glColorPointer( sz %d type %s stride %d )\n", size
,
169 _mesa_lookup_enum_by_nr( type
),
172 ctx
->Array
.Color
.StrideB
= stride
;
176 ctx
->Array
.Color
.StrideB
= size
*sizeof(GLbyte
);
178 case GL_UNSIGNED_BYTE
:
179 ctx
->Array
.Color
.StrideB
= size
*sizeof(GLubyte
);
182 ctx
->Array
.Color
.StrideB
= size
*sizeof(GLshort
);
184 case GL_UNSIGNED_SHORT
:
185 ctx
->Array
.Color
.StrideB
= size
*sizeof(GLushort
);
188 ctx
->Array
.Color
.StrideB
= size
*sizeof(GLint
);
190 case GL_UNSIGNED_INT
:
191 ctx
->Array
.Color
.StrideB
= size
*sizeof(GLuint
);
194 ctx
->Array
.Color
.StrideB
= size
*sizeof(GLfloat
);
197 ctx
->Array
.Color
.StrideB
= size
*sizeof(GLdouble
);
200 _mesa_error( ctx
, GL_INVALID_ENUM
, "glColorPointer(type)" );
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
;
208 ctx
->NewState
|= _NEW_ARRAY
;
209 ctx
->Array
.NewState
|= _NEW_ARRAY_VERTEX
;
211 if (ctx
->Driver
.ColorPointer
)
212 ctx
->Driver
.ColorPointer( ctx
, size
, type
, stride
, ptr
);
218 _mesa_FogCoordPointerEXT(GLenum type
, GLsizei stride
, const GLvoid
*ptr
)
220 GET_CURRENT_CONTEXT(ctx
);
221 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
224 _mesa_error( ctx
, GL_INVALID_VALUE
, "glFogCoordPointer(stride)" );
228 ctx
->Array
.FogCoord
.StrideB
= stride
;
232 ctx
->Array
.FogCoord
.StrideB
= sizeof(GLfloat
);
235 ctx
->Array
.FogCoord
.StrideB
= sizeof(GLdouble
);
238 _mesa_error( ctx
, GL_INVALID_ENUM
, "glFogCoordPointer(type)" );
242 ctx
->Array
.FogCoord
.Type
= type
;
243 ctx
->Array
.FogCoord
.Stride
= stride
;
244 ctx
->Array
.FogCoord
.Ptr
= (void *) ptr
;
245 ctx
->NewState
|= _NEW_ARRAY
;
246 ctx
->Array
.NewState
|= _NEW_ARRAY_VERTEX
;
248 if (ctx
->Driver
.FogCoordPointer
)
249 ctx
->Driver
.FogCoordPointer( ctx
, type
, stride
, ptr
);
254 _mesa_IndexPointer(GLenum type
, GLsizei stride
, const GLvoid
*ptr
)
256 GET_CURRENT_CONTEXT(ctx
);
257 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
260 _mesa_error( ctx
, GL_INVALID_VALUE
, "glIndexPointer(stride)" );
264 ctx
->Array
.Index
.StrideB
= stride
;
267 case GL_UNSIGNED_BYTE
:
268 ctx
->Array
.Index
.StrideB
= sizeof(GLubyte
);
271 ctx
->Array
.Index
.StrideB
= sizeof(GLshort
);
274 ctx
->Array
.Index
.StrideB
= sizeof(GLint
);
277 ctx
->Array
.Index
.StrideB
= sizeof(GLfloat
);
280 ctx
->Array
.Index
.StrideB
= sizeof(GLdouble
);
283 _mesa_error( ctx
, GL_INVALID_ENUM
, "glIndexPointer(type)" );
287 ctx
->Array
.Index
.Type
= type
;
288 ctx
->Array
.Index
.Stride
= stride
;
289 ctx
->Array
.Index
.Ptr
= (void *) ptr
;
290 ctx
->NewState
|= _NEW_ARRAY
;
291 ctx
->Array
.NewState
|= _NEW_ARRAY_VERTEX
;
293 if (ctx
->Driver
.IndexPointer
)
294 ctx
->Driver
.IndexPointer( ctx
, type
, stride
, ptr
);
299 _mesa_SecondaryColorPointerEXT(GLint size
, GLenum type
,
300 GLsizei stride
, const GLvoid
*ptr
)
302 GET_CURRENT_CONTEXT(ctx
);
303 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
305 if (size
!= 3 && size
!= 4) {
306 _mesa_error( ctx
, GL_INVALID_VALUE
, "glColorPointer(size)" );
310 _mesa_error( ctx
, GL_INVALID_VALUE
, "glColorPointer(stride)" );
314 if (MESA_VERBOSE
&(VERBOSE_VARRAY
|VERBOSE_API
))
315 fprintf(stderr
, "glColorPointer( sz %d type %s stride %d )\n", size
,
316 _mesa_lookup_enum_by_nr( type
),
319 ctx
->Array
.SecondaryColor
.StrideB
= stride
;
323 ctx
->Array
.SecondaryColor
.StrideB
= size
*sizeof(GLbyte
);
325 case GL_UNSIGNED_BYTE
:
326 ctx
->Array
.SecondaryColor
.StrideB
= size
*sizeof(GLubyte
);
329 ctx
->Array
.SecondaryColor
.StrideB
= size
*sizeof(GLshort
);
331 case GL_UNSIGNED_SHORT
:
332 ctx
->Array
.SecondaryColor
.StrideB
= size
*sizeof(GLushort
);
335 ctx
->Array
.SecondaryColor
.StrideB
= size
*sizeof(GLint
);
337 case GL_UNSIGNED_INT
:
338 ctx
->Array
.SecondaryColor
.StrideB
= size
*sizeof(GLuint
);
341 ctx
->Array
.SecondaryColor
.StrideB
= size
*sizeof(GLfloat
);
344 ctx
->Array
.SecondaryColor
.StrideB
= size
*sizeof(GLdouble
);
347 _mesa_error( ctx
, GL_INVALID_ENUM
, "glSecondaryColorPointer(type)" );
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
;
355 ctx
->NewState
|= _NEW_ARRAY
;
356 ctx
->Array
.NewState
|= _NEW_ARRAY_VERTEX
;
358 if (ctx
->Driver
.SecondaryColorPointer
)
359 ctx
->Driver
.SecondaryColorPointer( ctx
, size
, type
, stride
, ptr
);
365 _mesa_TexCoordPointer(GLint size
, GLenum type
, GLsizei stride
, const GLvoid
*ptr
)
367 GET_CURRENT_CONTEXT(ctx
);
368 GLuint texUnit
= ctx
->Array
.ActiveTexture
;
369 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
371 if (size
<1 || size
>4) {
372 _mesa_error( ctx
, GL_INVALID_VALUE
, "glTexCoordPointer(size)" );
376 _mesa_error( ctx
, GL_INVALID_VALUE
, "glTexCoordPointer(stride)" );
380 if (MESA_VERBOSE
&(VERBOSE_VARRAY
|VERBOSE_API
))
381 fprintf(stderr
, "glTexCoordPointer( unit %u sz %d type %s stride %d )\n",
384 _mesa_lookup_enum_by_nr( type
),
387 ctx
->Array
.TexCoord
[texUnit
].StrideB
= stride
;
391 ctx
->Array
.TexCoord
[texUnit
].StrideB
= size
*sizeof(GLshort
);
394 ctx
->Array
.TexCoord
[texUnit
].StrideB
= size
*sizeof(GLint
);
397 ctx
->Array
.TexCoord
[texUnit
].StrideB
= size
*sizeof(GLfloat
);
400 ctx
->Array
.TexCoord
[texUnit
].StrideB
= size
*sizeof(GLdouble
);
403 _mesa_error( ctx
, GL_INVALID_ENUM
, "glTexCoordPointer(type)" );
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
;
411 ctx
->NewState
|= _NEW_ARRAY
;
412 ctx
->Array
.NewState
|= _NEW_ARRAY_VERTEX
;
414 /* fprintf(stderr, "%s ptr %p\n", __FUNCTION__, ptr); */
416 if (ctx
->Driver
.TexCoordPointer
)
417 ctx
->Driver
.TexCoordPointer( ctx
, size
, type
, stride
, ptr
);
424 _mesa_EdgeFlagPointer(GLsizei stride
, const void *vptr
)
426 GET_CURRENT_CONTEXT(ctx
);
427 const GLboolean
*ptr
= (GLboolean
*)vptr
;
428 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
431 _mesa_error( ctx
, GL_INVALID_VALUE
, "glEdgeFlagPointer(stride)" );
434 ctx
->Array
.EdgeFlag
.Stride
= stride
;
435 ctx
->Array
.EdgeFlag
.StrideB
= stride
? stride
: sizeof(GLboolean
);
436 ctx
->Array
.EdgeFlag
.Ptr
= (GLboolean
*) ptr
;
437 ctx
->NewState
|= _NEW_ARRAY
;
438 ctx
->Array
.NewState
|= _NEW_ARRAY_VERTEX
;
440 if (ctx
->Driver
.EdgeFlagPointer
)
441 ctx
->Driver
.EdgeFlagPointer( ctx
, stride
, ptr
);
449 _mesa_VertexPointerEXT(GLint size
, GLenum type
, GLsizei stride
,
450 GLsizei count
, const GLvoid
*ptr
)
453 _mesa_VertexPointer(size
, type
, stride
, ptr
);
458 _mesa_NormalPointerEXT(GLenum type
, GLsizei stride
, GLsizei count
,
462 _mesa_NormalPointer(type
, stride
, ptr
);
467 _mesa_ColorPointerEXT(GLint size
, GLenum type
, GLsizei stride
, GLsizei count
,
471 _mesa_ColorPointer(size
, type
, stride
, ptr
);
476 _mesa_IndexPointerEXT(GLenum type
, GLsizei stride
, GLsizei count
,
480 _mesa_IndexPointer(type
, stride
, ptr
);
485 _mesa_TexCoordPointerEXT(GLint size
, GLenum type
, GLsizei stride
,
486 GLsizei count
, const GLvoid
*ptr
)
489 _mesa_TexCoordPointer(size
, type
, stride
, ptr
);
494 _mesa_EdgeFlagPointerEXT(GLsizei stride
, GLsizei count
, const GLboolean
*ptr
)
497 _mesa_EdgeFlagPointer(stride
, ptr
);
506 _mesa_InterleavedArrays(GLenum format
, GLsizei stride
, const GLvoid
*pointer
)
508 GET_CURRENT_CONTEXT(ctx
);
509 GLboolean tflag
, cflag
, nflag
; /* enable/disable flags */
510 GLint tcomps
, ccomps
, vcomps
; /* components per texcoord, color, vertex */
512 GLenum ctype
= 0; /* color type */
513 GLint coffset
= 0, noffset
= 0, voffset
;/* color, normal, vertex offsets */
514 GLint defstride
; /* default stride */
518 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
521 c
= f
* ((4*sizeof(GLubyte
) + (f
-1)) / f
);
524 _mesa_error( ctx
, GL_INVALID_VALUE
, "glInterleavedArrays(stride)" );
530 tflag
= GL_FALSE
; cflag
= GL_FALSE
; nflag
= GL_FALSE
;
531 tcomps
= 0; ccomps
= 0; vcomps
= 2;
536 tflag
= GL_FALSE
; cflag
= GL_FALSE
; nflag
= GL_FALSE
;
537 tcomps
= 0; ccomps
= 0; vcomps
= 3;
542 tflag
= GL_FALSE
; cflag
= GL_TRUE
; nflag
= GL_FALSE
;
543 tcomps
= 0; ccomps
= 4; vcomps
= 2;
544 ctype
= GL_UNSIGNED_BYTE
;
550 tflag
= GL_FALSE
; cflag
= GL_TRUE
; nflag
= GL_FALSE
;
551 tcomps
= 0; ccomps
= 4; vcomps
= 3;
552 ctype
= GL_UNSIGNED_BYTE
;
558 tflag
= GL_FALSE
; cflag
= GL_TRUE
; nflag
= GL_FALSE
;
559 tcomps
= 0; ccomps
= 3; vcomps
= 3;
566 tflag
= GL_FALSE
; cflag
= GL_FALSE
; nflag
= GL_TRUE
;
567 tcomps
= 0; ccomps
= 0; vcomps
= 3;
573 tflag
= GL_FALSE
; cflag
= GL_TRUE
; nflag
= GL_TRUE
;
574 tcomps
= 0; ccomps
= 4; vcomps
= 3;
582 tflag
= GL_TRUE
; cflag
= GL_FALSE
; nflag
= GL_FALSE
;
583 tcomps
= 2; ccomps
= 0; vcomps
= 3;
588 tflag
= GL_TRUE
; cflag
= GL_FALSE
; nflag
= GL_FALSE
;
589 tcomps
= 4; ccomps
= 0; vcomps
= 4;
593 case GL_T2F_C4UB_V3F
:
594 tflag
= GL_TRUE
; cflag
= GL_TRUE
; nflag
= GL_FALSE
;
595 tcomps
= 2; ccomps
= 4; vcomps
= 3;
596 ctype
= GL_UNSIGNED_BYTE
;
602 tflag
= GL_TRUE
; cflag
= GL_TRUE
; nflag
= GL_FALSE
;
603 tcomps
= 2; ccomps
= 3; vcomps
= 3;
610 tflag
= GL_TRUE
; cflag
= GL_FALSE
; nflag
= GL_TRUE
;
611 tcomps
= 2; ccomps
= 0; vcomps
= 3;
616 case GL_T2F_C4F_N3F_V3F
:
617 tflag
= GL_TRUE
; cflag
= GL_TRUE
; nflag
= GL_TRUE
;
618 tcomps
= 2; ccomps
= 4; vcomps
= 3;
625 case GL_T4F_C4F_N3F_V4F
:
626 tflag
= GL_TRUE
; cflag
= GL_TRUE
; nflag
= GL_TRUE
;
627 tcomps
= 4; ccomps
= 4; vcomps
= 4;
635 _mesa_error( ctx
, GL_INVALID_ENUM
, "glInterleavedArrays(format)" );
643 _mesa_DisableClientState( GL_EDGE_FLAG_ARRAY
);
644 _mesa_DisableClientState( GL_INDEX_ARRAY
);
647 coordUnitSave
= ctx
->Array
.ActiveTexture
;
650 GLint factor
= ctx
->Array
.TexCoordInterleaveFactor
;
651 for (i
= 0; i
< factor
; i
++) {
652 _mesa_ClientActiveTextureARB( (GLenum
) (GL_TEXTURE0_ARB
+ i
) );
653 _mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY
);
654 _mesa_TexCoordPointer( tcomps
, GL_FLOAT
, stride
,
655 (GLubyte
*) pointer
+ i
* coffset
);
657 for (i
= factor
; i
< (GLint
) ctx
->Const
.MaxTextureUnits
; i
++) {
658 _mesa_ClientActiveTextureARB( (GLenum
) (GL_TEXTURE0_ARB
+ i
) );
659 _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY
);
664 for (i
= 0; i
< (GLint
) ctx
->Const
.MaxTextureUnits
; i
++) {
665 _mesa_ClientActiveTextureARB( (GLenum
) (GL_TEXTURE0_ARB
+ i
) );
666 _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY
);
669 /* Restore texture coordinate unit index */
670 _mesa_ClientActiveTextureARB( (GLenum
) (GL_TEXTURE0_ARB
+ coordUnitSave
) );
675 _mesa_EnableClientState( GL_COLOR_ARRAY
);
676 _mesa_ColorPointer( ccomps
, ctype
, stride
,
677 (GLubyte
*) pointer
+ coffset
);
680 _mesa_DisableClientState( GL_COLOR_ARRAY
);
686 _mesa_EnableClientState( GL_NORMAL_ARRAY
);
687 _mesa_NormalPointer( GL_FLOAT
, stride
,
688 (GLubyte
*) pointer
+ noffset
);
691 _mesa_DisableClientState( GL_NORMAL_ARRAY
);
694 _mesa_EnableClientState( GL_VERTEX_ARRAY
);
695 _mesa_VertexPointer( vcomps
, GL_FLOAT
, stride
,
696 (GLubyte
*) pointer
+ voffset
);
702 _mesa_LockArraysEXT(GLint first
, GLsizei count
)
704 GET_CURRENT_CONTEXT(ctx
);
705 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
707 if (MESA_VERBOSE
& VERBOSE_API
)
708 fprintf(stderr
, "glLockArrays %d %d\n", first
, count
);
710 if (first
== 0 && count
> 0 &&
711 count
<= (GLint
) ctx
->Const
.MaxArrayLockSize
) {
712 ctx
->Array
.LockFirst
= first
;
713 ctx
->Array
.LockCount
= count
;
716 ctx
->Array
.LockFirst
= 0;
717 ctx
->Array
.LockCount
= 0;
720 ctx
->NewState
|= _NEW_ARRAY
;
721 ctx
->Array
.NewState
|= _NEW_ARRAY_ALL
;
723 if (ctx
->Driver
.LockArraysEXT
)
724 ctx
->Driver
.LockArraysEXT( ctx
, first
, count
);
729 _mesa_UnlockArraysEXT( void )
731 GET_CURRENT_CONTEXT(ctx
);
732 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
734 if (MESA_VERBOSE
& VERBOSE_API
)
735 fprintf(stderr
, "glUnlockArrays\n");
737 ctx
->Array
.LockFirst
= 0;
738 ctx
->Array
.LockCount
= 0;
739 ctx
->NewState
|= _NEW_ARRAY
;
740 ctx
->Array
.NewState
|= _NEW_ARRAY_ALL
;
742 if (ctx
->Driver
.UnlockArraysEXT
)
743 ctx
->Driver
.UnlockArraysEXT( ctx
);