1 /* $Id: varray.c,v 1.40 2002/01/05 20:51:12 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 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
.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_VERTEX
;
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 fprintf(stderr
, "glColorPointer( sz %d type %s stride %d )\n", size
,
170 _mesa_lookup_enum_by_nr( type
),
173 ctx
->Array
.Color
.StrideB
= stride
;
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)" );
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_VERTEX
;
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)" );
229 ctx
->Array
.FogCoord
.StrideB
= stride
;
233 ctx
->Array
.FogCoord
.StrideB
= sizeof(GLfloat
);
236 ctx
->Array
.FogCoord
.StrideB
= sizeof(GLdouble
);
239 _mesa_error( ctx
, GL_INVALID_ENUM
, "glFogCoordPointer(type)" );
243 ctx
->Array
.FogCoord
.Size
= 1;
244 ctx
->Array
.FogCoord
.Type
= type
;
245 ctx
->Array
.FogCoord
.Stride
= stride
;
246 ctx
->Array
.FogCoord
.Ptr
= (void *) ptr
;
247 ctx
->NewState
|= _NEW_ARRAY
;
248 ctx
->Array
.NewState
|= _NEW_ARRAY_VERTEX
;
250 if (ctx
->Driver
.FogCoordPointer
)
251 ctx
->Driver
.FogCoordPointer( ctx
, type
, stride
, ptr
);
256 _mesa_IndexPointer(GLenum type
, GLsizei stride
, const GLvoid
*ptr
)
258 GET_CURRENT_CONTEXT(ctx
);
259 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
262 _mesa_error( ctx
, GL_INVALID_VALUE
, "glIndexPointer(stride)" );
266 ctx
->Array
.Index
.StrideB
= stride
;
269 case GL_UNSIGNED_BYTE
:
270 ctx
->Array
.Index
.StrideB
= sizeof(GLubyte
);
273 ctx
->Array
.Index
.StrideB
= sizeof(GLshort
);
276 ctx
->Array
.Index
.StrideB
= sizeof(GLint
);
279 ctx
->Array
.Index
.StrideB
= sizeof(GLfloat
);
282 ctx
->Array
.Index
.StrideB
= sizeof(GLdouble
);
285 _mesa_error( ctx
, GL_INVALID_ENUM
, "glIndexPointer(type)" );
289 ctx
->Array
.Index
.Size
= 1;
290 ctx
->Array
.Index
.Type
= type
;
291 ctx
->Array
.Index
.Stride
= stride
;
292 ctx
->Array
.Index
.Ptr
= (void *) ptr
;
293 ctx
->NewState
|= _NEW_ARRAY
;
294 ctx
->Array
.NewState
|= _NEW_ARRAY_VERTEX
;
296 if (ctx
->Driver
.IndexPointer
)
297 ctx
->Driver
.IndexPointer( ctx
, type
, stride
, ptr
);
302 _mesa_SecondaryColorPointerEXT(GLint size
, GLenum type
,
303 GLsizei stride
, const GLvoid
*ptr
)
305 GET_CURRENT_CONTEXT(ctx
);
306 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
308 if (size
!= 3 && size
!= 4) {
309 _mesa_error( ctx
, GL_INVALID_VALUE
, "glColorPointer(size)" );
313 _mesa_error( ctx
, GL_INVALID_VALUE
, "glColorPointer(stride)" );
317 if (MESA_VERBOSE
&(VERBOSE_VARRAY
|VERBOSE_API
))
318 fprintf(stderr
, "glColorPointer( sz %d type %s stride %d )\n", size
,
319 _mesa_lookup_enum_by_nr( type
),
322 ctx
->Array
.SecondaryColor
.StrideB
= stride
;
326 ctx
->Array
.SecondaryColor
.StrideB
= size
*sizeof(GLbyte
);
328 case GL_UNSIGNED_BYTE
:
329 ctx
->Array
.SecondaryColor
.StrideB
= size
*sizeof(GLubyte
);
332 ctx
->Array
.SecondaryColor
.StrideB
= size
*sizeof(GLshort
);
334 case GL_UNSIGNED_SHORT
:
335 ctx
->Array
.SecondaryColor
.StrideB
= size
*sizeof(GLushort
);
338 ctx
->Array
.SecondaryColor
.StrideB
= size
*sizeof(GLint
);
340 case GL_UNSIGNED_INT
:
341 ctx
->Array
.SecondaryColor
.StrideB
= size
*sizeof(GLuint
);
344 ctx
->Array
.SecondaryColor
.StrideB
= size
*sizeof(GLfloat
);
347 ctx
->Array
.SecondaryColor
.StrideB
= size
*sizeof(GLdouble
);
350 _mesa_error( ctx
, GL_INVALID_ENUM
, "glSecondaryColorPointer(type)" );
354 ctx
->Array
.SecondaryColor
.Size
= 3; /* hardwire */
355 ctx
->Array
.SecondaryColor
.Type
= type
;
356 ctx
->Array
.SecondaryColor
.Stride
= stride
;
357 ctx
->Array
.SecondaryColor
.Ptr
= (void *) ptr
;
358 ctx
->NewState
|= _NEW_ARRAY
;
359 ctx
->Array
.NewState
|= _NEW_ARRAY_VERTEX
;
361 if (ctx
->Driver
.SecondaryColorPointer
)
362 ctx
->Driver
.SecondaryColorPointer( ctx
, size
, type
, stride
, ptr
);
368 _mesa_TexCoordPointer(GLint size
, GLenum type
, GLsizei stride
, const GLvoid
*ptr
)
370 GET_CURRENT_CONTEXT(ctx
);
371 GLuint texUnit
= ctx
->Array
.ActiveTexture
;
372 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
374 if (size
<1 || size
>4) {
375 _mesa_error( ctx
, GL_INVALID_VALUE
, "glTexCoordPointer(size)" );
379 _mesa_error( ctx
, GL_INVALID_VALUE
, "glTexCoordPointer(stride)" );
383 if (MESA_VERBOSE
&(VERBOSE_VARRAY
|VERBOSE_API
))
384 fprintf(stderr
, "glTexCoordPointer( unit %u sz %d type %s stride %d )\n",
387 _mesa_lookup_enum_by_nr( type
),
390 ctx
->Array
.TexCoord
[texUnit
].StrideB
= stride
;
394 ctx
->Array
.TexCoord
[texUnit
].StrideB
= size
*sizeof(GLshort
);
397 ctx
->Array
.TexCoord
[texUnit
].StrideB
= size
*sizeof(GLint
);
400 ctx
->Array
.TexCoord
[texUnit
].StrideB
= size
*sizeof(GLfloat
);
403 ctx
->Array
.TexCoord
[texUnit
].StrideB
= size
*sizeof(GLdouble
);
406 _mesa_error( ctx
, GL_INVALID_ENUM
, "glTexCoordPointer(type)" );
410 ctx
->Array
.TexCoord
[texUnit
].Size
= size
;
411 ctx
->Array
.TexCoord
[texUnit
].Type
= type
;
412 ctx
->Array
.TexCoord
[texUnit
].Stride
= stride
;
413 ctx
->Array
.TexCoord
[texUnit
].Ptr
= (void *) ptr
;
414 ctx
->NewState
|= _NEW_ARRAY
;
415 ctx
->Array
.NewState
|= _NEW_ARRAY_VERTEX
;
417 /* fprintf(stderr, "%s ptr %p\n", __FUNCTION__, ptr); */
419 if (ctx
->Driver
.TexCoordPointer
)
420 ctx
->Driver
.TexCoordPointer( ctx
, size
, type
, stride
, ptr
);
427 _mesa_EdgeFlagPointer(GLsizei stride
, const void *vptr
)
429 GET_CURRENT_CONTEXT(ctx
);
430 const GLboolean
*ptr
= (GLboolean
*)vptr
;
431 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
434 _mesa_error( ctx
, GL_INVALID_VALUE
, "glEdgeFlagPointer(stride)" );
437 ctx
->Array
.EdgeFlag
.Stride
= stride
;
438 ctx
->Array
.EdgeFlag
.StrideB
= stride
? stride
: sizeof(GLboolean
);
439 ctx
->Array
.EdgeFlag
.Ptr
= (GLboolean
*) ptr
;
440 ctx
->NewState
|= _NEW_ARRAY
;
441 ctx
->Array
.NewState
|= _NEW_ARRAY_VERTEX
;
443 if (ctx
->Driver
.EdgeFlagPointer
)
444 ctx
->Driver
.EdgeFlagPointer( ctx
, stride
, ptr
);
452 _mesa_VertexPointerEXT(GLint size
, GLenum type
, GLsizei stride
,
453 GLsizei count
, const GLvoid
*ptr
)
456 _mesa_VertexPointer(size
, type
, stride
, ptr
);
461 _mesa_NormalPointerEXT(GLenum type
, GLsizei stride
, GLsizei count
,
465 _mesa_NormalPointer(type
, stride
, ptr
);
470 _mesa_ColorPointerEXT(GLint size
, GLenum type
, GLsizei stride
, GLsizei count
,
474 _mesa_ColorPointer(size
, type
, stride
, ptr
);
479 _mesa_IndexPointerEXT(GLenum type
, GLsizei stride
, GLsizei count
,
483 _mesa_IndexPointer(type
, stride
, ptr
);
488 _mesa_TexCoordPointerEXT(GLint size
, GLenum type
, GLsizei stride
,
489 GLsizei count
, const GLvoid
*ptr
)
492 _mesa_TexCoordPointer(size
, type
, stride
, ptr
);
497 _mesa_EdgeFlagPointerEXT(GLsizei stride
, GLsizei count
, const GLboolean
*ptr
)
500 _mesa_EdgeFlagPointer(stride
, ptr
);
509 _mesa_InterleavedArrays(GLenum format
, GLsizei stride
, const GLvoid
*pointer
)
511 GET_CURRENT_CONTEXT(ctx
);
512 GLboolean tflag
, cflag
, nflag
; /* enable/disable flags */
513 GLint tcomps
, ccomps
, vcomps
; /* components per texcoord, color, vertex */
515 GLenum ctype
= 0; /* color type */
516 GLint coffset
= 0, noffset
= 0, voffset
;/* color, normal, vertex offsets */
517 GLint defstride
; /* default stride */
521 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
524 c
= f
* ((4*sizeof(GLubyte
) + (f
-1)) / f
);
527 _mesa_error( ctx
, GL_INVALID_VALUE
, "glInterleavedArrays(stride)" );
533 tflag
= GL_FALSE
; cflag
= GL_FALSE
; nflag
= GL_FALSE
;
534 tcomps
= 0; ccomps
= 0; vcomps
= 2;
539 tflag
= GL_FALSE
; cflag
= GL_FALSE
; nflag
= GL_FALSE
;
540 tcomps
= 0; ccomps
= 0; vcomps
= 3;
545 tflag
= GL_FALSE
; cflag
= GL_TRUE
; nflag
= GL_FALSE
;
546 tcomps
= 0; ccomps
= 4; vcomps
= 2;
547 ctype
= GL_UNSIGNED_BYTE
;
553 tflag
= GL_FALSE
; cflag
= GL_TRUE
; nflag
= GL_FALSE
;
554 tcomps
= 0; ccomps
= 4; vcomps
= 3;
555 ctype
= GL_UNSIGNED_BYTE
;
561 tflag
= GL_FALSE
; cflag
= GL_TRUE
; nflag
= GL_FALSE
;
562 tcomps
= 0; ccomps
= 3; vcomps
= 3;
569 tflag
= GL_FALSE
; cflag
= GL_FALSE
; nflag
= GL_TRUE
;
570 tcomps
= 0; ccomps
= 0; vcomps
= 3;
576 tflag
= GL_FALSE
; cflag
= GL_TRUE
; nflag
= GL_TRUE
;
577 tcomps
= 0; ccomps
= 4; vcomps
= 3;
585 tflag
= GL_TRUE
; cflag
= GL_FALSE
; nflag
= GL_FALSE
;
586 tcomps
= 2; ccomps
= 0; vcomps
= 3;
591 tflag
= GL_TRUE
; cflag
= GL_FALSE
; nflag
= GL_FALSE
;
592 tcomps
= 4; ccomps
= 0; vcomps
= 4;
596 case GL_T2F_C4UB_V3F
:
597 tflag
= GL_TRUE
; cflag
= GL_TRUE
; nflag
= GL_FALSE
;
598 tcomps
= 2; ccomps
= 4; vcomps
= 3;
599 ctype
= GL_UNSIGNED_BYTE
;
605 tflag
= GL_TRUE
; cflag
= GL_TRUE
; nflag
= GL_FALSE
;
606 tcomps
= 2; ccomps
= 3; vcomps
= 3;
613 tflag
= GL_TRUE
; cflag
= GL_FALSE
; nflag
= GL_TRUE
;
614 tcomps
= 2; ccomps
= 0; vcomps
= 3;
619 case GL_T2F_C4F_N3F_V3F
:
620 tflag
= GL_TRUE
; cflag
= GL_TRUE
; nflag
= GL_TRUE
;
621 tcomps
= 2; ccomps
= 4; vcomps
= 3;
628 case GL_T4F_C4F_N3F_V4F
:
629 tflag
= GL_TRUE
; cflag
= GL_TRUE
; nflag
= GL_TRUE
;
630 tcomps
= 4; ccomps
= 4; vcomps
= 4;
638 _mesa_error( ctx
, GL_INVALID_ENUM
, "glInterleavedArrays(format)" );
646 _mesa_DisableClientState( GL_EDGE_FLAG_ARRAY
);
647 _mesa_DisableClientState( GL_INDEX_ARRAY
);
650 coordUnitSave
= ctx
->Array
.ActiveTexture
;
653 GLint factor
= ctx
->Array
.TexCoordInterleaveFactor
;
654 for (i
= 0; i
< factor
; i
++) {
655 _mesa_ClientActiveTextureARB( (GLenum
) (GL_TEXTURE0_ARB
+ i
) );
656 _mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY
);
657 _mesa_TexCoordPointer( tcomps
, GL_FLOAT
, stride
,
658 (GLubyte
*) pointer
+ i
* coffset
);
660 for (i
= factor
; i
< (GLint
) ctx
->Const
.MaxTextureUnits
; i
++) {
661 _mesa_ClientActiveTextureARB( (GLenum
) (GL_TEXTURE0_ARB
+ i
) );
662 _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY
);
667 for (i
= 0; i
< (GLint
) ctx
->Const
.MaxTextureUnits
; i
++) {
668 _mesa_ClientActiveTextureARB( (GLenum
) (GL_TEXTURE0_ARB
+ i
) );
669 _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY
);
672 /* Restore texture coordinate unit index */
673 _mesa_ClientActiveTextureARB( (GLenum
) (GL_TEXTURE0_ARB
+ coordUnitSave
) );
678 _mesa_EnableClientState( GL_COLOR_ARRAY
);
679 _mesa_ColorPointer( ccomps
, ctype
, stride
,
680 (GLubyte
*) pointer
+ coffset
);
683 _mesa_DisableClientState( GL_COLOR_ARRAY
);
689 _mesa_EnableClientState( GL_NORMAL_ARRAY
);
690 _mesa_NormalPointer( GL_FLOAT
, stride
,
691 (GLubyte
*) pointer
+ noffset
);
694 _mesa_DisableClientState( GL_NORMAL_ARRAY
);
697 _mesa_EnableClientState( GL_VERTEX_ARRAY
);
698 _mesa_VertexPointer( vcomps
, GL_FLOAT
, stride
,
699 (GLubyte
*) pointer
+ voffset
);
705 _mesa_LockArraysEXT(GLint first
, GLsizei count
)
707 GET_CURRENT_CONTEXT(ctx
);
708 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
710 if (MESA_VERBOSE
& VERBOSE_API
)
711 fprintf(stderr
, "glLockArrays %d %d\n", first
, count
);
713 if (first
== 0 && count
> 0 &&
714 count
<= (GLint
) ctx
->Const
.MaxArrayLockSize
) {
715 ctx
->Array
.LockFirst
= first
;
716 ctx
->Array
.LockCount
= count
;
719 ctx
->Array
.LockFirst
= 0;
720 ctx
->Array
.LockCount
= 0;
723 ctx
->NewState
|= _NEW_ARRAY
;
724 ctx
->Array
.NewState
|= _NEW_ARRAY_ALL
;
726 if (ctx
->Driver
.LockArraysEXT
)
727 ctx
->Driver
.LockArraysEXT( ctx
, first
, count
);
732 _mesa_UnlockArraysEXT( void )
734 GET_CURRENT_CONTEXT(ctx
);
735 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
737 if (MESA_VERBOSE
& VERBOSE_API
)
738 fprintf(stderr
, "glUnlockArrays\n");
740 ctx
->Array
.LockFirst
= 0;
741 ctx
->Array
.LockCount
= 0;
742 ctx
->NewState
|= _NEW_ARRAY
;
743 ctx
->Array
.NewState
|= _NEW_ARRAY_ALL
;
745 if (ctx
->Driver
.UnlockArraysEXT
)
746 ctx
->Driver
.UnlockArraysEXT( ctx
);