1 /* -*- mode: c; tab-width: 3; indent-tabs-mode: nil; c-basic-offset: 3; coding: utf-8-unix -*- */
3 * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
4 * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
13 * The above copyright notice including the dates of first publication and
14 * either this permission notice or a reference to
15 * http://oss.sgi.com/projects/FreeB/
16 * shall be included in all copies or substantial portions of the Software.
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
23 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26 * Except as contained in this notice, the name of Silicon Graphics, Inc.
27 * shall not be used in advertising or otherwise to promote the sale, use or
28 * other dealings in this Software without prior written authorization from
29 * Silicon Graphics, Inc.
34 #include "glxclient.h"
35 #include "packsingle.h"
36 #include "glxextensions.h"
38 #include "indirect_vertex_array.h"
40 /* Used for GL_ARB_transpose_matrix */
41 static void TransposeMatrixf(GLfloat m
[16])
44 for (i
= 0; i
< 4; i
++) {
45 for (j
= 0; j
< i
; j
++) {
46 GLfloat tmp
= m
[i
*4+j
];
53 /* Used for GL_ARB_transpose_matrix */
54 static void TransposeMatrixb(GLboolean m
[16])
57 for (i
= 0; i
< 4; i
++) {
58 for (j
= 0; j
< i
; j
++) {
59 GLboolean tmp
= m
[i
*4+j
];
66 /* Used for GL_ARB_transpose_matrix */
67 static void TransposeMatrixd(GLdouble m
[16])
70 for (i
= 0; i
< 4; i
++) {
71 for (j
= 0; j
< i
; j
++) {
72 GLdouble tmp
= m
[i
*4+j
];
79 /* Used for GL_ARB_transpose_matrix */
80 static void TransposeMatrixi(GLint m
[16])
83 for (i
= 0; i
< 4; i
++) {
84 for (j
= 0; j
< i
; j
++) {
94 * Remap a transpose-matrix enum to a non-transpose-matrix enum. Enums
95 * that are not transpose-matrix enums are unaffected.
98 RemapTransposeEnum( GLenum e
)
101 case GL_TRANSPOSE_MODELVIEW_MATRIX
:
102 case GL_TRANSPOSE_PROJECTION_MATRIX
:
103 case GL_TRANSPOSE_TEXTURE_MATRIX
:
104 return e
- (GL_TRANSPOSE_MODELVIEW_MATRIX
- GL_MODELVIEW_MATRIX
);
105 case GL_TRANSPOSE_COLOR_MATRIX
:
106 return GL_COLOR_MATRIX
;
113 GLenum
__indirect_glGetError(void)
115 __GLX_SINGLE_DECLARE_VARIABLES();
116 GLuint retval
= GL_NO_ERROR
;
117 xGLXGetErrorReply reply
;
120 /* Use internal error first */
122 gc
->error
= GL_NO_ERROR
;
126 __GLX_SINGLE_LOAD_VARIABLES();
127 __GLX_SINGLE_BEGIN(X_GLsop_GetError
,0);
128 __GLX_SINGLE_READ_XREPLY();
129 retval
= reply
.error
;
137 * Get the selected attribute from the client state.
140 * On success \c GL_TRUE is returned. Otherwise, \c GL_FALSE is returned.
143 get_client_data( __GLXcontext
* gc
, GLenum cap
, GLintptr
* data
)
145 GLboolean retval
= GL_TRUE
;
146 __GLXattribute
* state
= (__GLXattribute
*)(gc
->client_state_private
);
147 const GLint tex_unit
= __glXGetActiveTextureUnit( state
);
151 case GL_VERTEX_ARRAY
:
152 case GL_NORMAL_ARRAY
:
155 case GL_EDGE_FLAG_ARRAY
:
156 case GL_SECONDARY_COLOR_ARRAY
:
157 case GL_FOG_COORD_ARRAY
:
158 retval
= __glXGetArrayEnable( state
, cap
, 0, data
);
161 case GL_VERTEX_ARRAY_SIZE
:
162 retval
= __glXGetArraySize( state
, GL_VERTEX_ARRAY
, 0, data
);
164 case GL_COLOR_ARRAY_SIZE
:
165 retval
= __glXGetArraySize( state
, GL_COLOR_ARRAY
, 0, data
);
167 case GL_SECONDARY_COLOR_ARRAY_SIZE
:
168 retval
= __glXGetArraySize( state
, GL_SECONDARY_COLOR_ARRAY
, 0, data
);
171 case GL_VERTEX_ARRAY_TYPE
:
172 retval
= __glXGetArrayType( state
, GL_VERTEX_ARRAY
, 0, data
);
174 case GL_NORMAL_ARRAY_TYPE
:
175 retval
= __glXGetArrayType( state
, GL_NORMAL_ARRAY
, 0, data
);
177 case GL_INDEX_ARRAY_TYPE
:
178 retval
= __glXGetArrayType( state
, GL_INDEX_ARRAY
, 0, data
);
180 case GL_COLOR_ARRAY_TYPE
:
181 retval
= __glXGetArrayType( state
, GL_COLOR_ARRAY
, 0, data
);
183 case GL_SECONDARY_COLOR_ARRAY_TYPE
:
184 retval
= __glXGetArrayType( state
, GL_SECONDARY_COLOR_ARRAY
, 0, data
);
186 case GL_FOG_COORD_ARRAY_TYPE
:
187 retval
= __glXGetArrayType( state
, GL_FOG_COORD_ARRAY
, 0, data
);
190 case GL_VERTEX_ARRAY_STRIDE
:
191 retval
= __glXGetArrayStride( state
, GL_VERTEX_ARRAY
, 0, data
);
193 case GL_NORMAL_ARRAY_STRIDE
:
194 retval
= __glXGetArrayStride( state
, GL_NORMAL_ARRAY
, 0, data
);
196 case GL_INDEX_ARRAY_STRIDE
:
197 retval
= __glXGetArrayStride( state
, GL_INDEX_ARRAY
, 0, data
);
199 case GL_EDGE_FLAG_ARRAY_STRIDE
:
200 retval
= __glXGetArrayStride( state
, GL_EDGE_FLAG_ARRAY
, 0, data
);
202 case GL_COLOR_ARRAY_STRIDE
:
203 retval
= __glXGetArrayStride( state
, GL_COLOR_ARRAY
, 0, data
);
205 case GL_SECONDARY_COLOR_ARRAY_STRIDE
:
206 retval
= __glXGetArrayStride( state
, GL_SECONDARY_COLOR_ARRAY
, 0, data
);
208 case GL_FOG_COORD_ARRAY_STRIDE
:
209 retval
= __glXGetArrayStride( state
, GL_FOG_COORD_ARRAY
, 0, data
);
212 case GL_TEXTURE_COORD_ARRAY
:
213 retval
= __glXGetArrayEnable( state
, GL_TEXTURE_COORD_ARRAY
, tex_unit
, data
);
215 case GL_TEXTURE_COORD_ARRAY_SIZE
:
216 retval
= __glXGetArraySize( state
, GL_TEXTURE_COORD_ARRAY
, tex_unit
, data
);
218 case GL_TEXTURE_COORD_ARRAY_TYPE
:
219 retval
= __glXGetArrayType( state
, GL_TEXTURE_COORD_ARRAY
, tex_unit
, data
);
221 case GL_TEXTURE_COORD_ARRAY_STRIDE
:
222 retval
= __glXGetArrayStride( state
, GL_TEXTURE_COORD_ARRAY
, tex_unit
, data
);
225 case GL_MAX_ELEMENTS_VERTICES
:
226 case GL_MAX_ELEMENTS_INDICES
:
232 case GL_PACK_ROW_LENGTH
:
233 *data
= (GLintptr
)state
->storePack
.rowLength
;
235 case GL_PACK_IMAGE_HEIGHT
:
236 *data
= (GLintptr
)state
->storePack
.imageHeight
;
238 case GL_PACK_SKIP_ROWS
:
239 *data
= (GLintptr
)state
->storePack
.skipRows
;
241 case GL_PACK_SKIP_PIXELS
:
242 *data
= (GLintptr
)state
->storePack
.skipPixels
;
244 case GL_PACK_SKIP_IMAGES
:
245 *data
= (GLintptr
)state
->storePack
.skipImages
;
247 case GL_PACK_ALIGNMENT
:
248 *data
= (GLintptr
)state
->storePack
.alignment
;
250 case GL_PACK_SWAP_BYTES
:
251 *data
= (GLintptr
)state
->storePack
.swapEndian
;
253 case GL_PACK_LSB_FIRST
:
254 *data
= (GLintptr
)state
->storePack
.lsbFirst
;
256 case GL_UNPACK_ROW_LENGTH
:
257 *data
= (GLintptr
)state
->storeUnpack
.rowLength
;
259 case GL_UNPACK_IMAGE_HEIGHT
:
260 *data
= (GLintptr
)state
->storeUnpack
.imageHeight
;
262 case GL_UNPACK_SKIP_ROWS
:
263 *data
= (GLintptr
)state
->storeUnpack
.skipRows
;
265 case GL_UNPACK_SKIP_PIXELS
:
266 *data
= (GLintptr
)state
->storeUnpack
.skipPixels
;
268 case GL_UNPACK_SKIP_IMAGES
:
269 *data
= (GLintptr
)state
->storeUnpack
.skipImages
;
271 case GL_UNPACK_ALIGNMENT
:
272 *data
= (GLintptr
)state
->storeUnpack
.alignment
;
274 case GL_UNPACK_SWAP_BYTES
:
275 *data
= (GLintptr
)state
->storeUnpack
.swapEndian
;
277 case GL_UNPACK_LSB_FIRST
:
278 *data
= (GLintptr
)state
->storeUnpack
.lsbFirst
;
280 case GL_CLIENT_ATTRIB_STACK_DEPTH
:
281 *data
= (GLintptr
)(gc
->attributes
.stackPointer
- gc
->attributes
.stack
);
283 case GL_MAX_CLIENT_ATTRIB_STACK_DEPTH
:
284 *data
= (GLintptr
)__GL_CLIENT_ATTRIB_STACK_DEPTH
;
286 case GL_CLIENT_ACTIVE_TEXTURE
:
287 *data
= (GLintptr
)(tex_unit
+ GL_TEXTURE0
);
300 void __indirect_glGetBooleanv(GLenum val
, GLboolean
*b
)
302 const GLenum origVal
= val
;
303 __GLX_SINGLE_DECLARE_VARIABLES();
304 xGLXSingleReply reply
;
306 val
= RemapTransposeEnum( val
);
308 __GLX_SINGLE_LOAD_VARIABLES();
309 __GLX_SINGLE_BEGIN(X_GLsop_GetBooleanv
,4);
310 __GLX_SINGLE_PUT_LONG(0,val
);
311 __GLX_SINGLE_READ_XREPLY();
312 __GLX_SINGLE_GET_SIZE(compsize
);
316 ** Error occured; don't modify user's buffer.
322 ** We still needed to send the request to the server in order to
323 ** find out whether it was legal to make a query (it's illegal,
324 ** for example, to call a query between glBegin() and glEnd()).
327 if ( get_client_data( gc
, val
, & data
) ) {
328 *b
= (GLboolean
) data
;
332 ** Not a local value, so use what we got from the server.
335 __GLX_SINGLE_GET_CHAR(b
);
337 __GLX_SINGLE_GET_CHAR_ARRAY(b
,compsize
);
338 if (val
!= origVal
) {
339 /* matrix transpose */
348 void __indirect_glGetDoublev(GLenum val
, GLdouble
*d
)
350 const GLenum origVal
= val
;
351 __GLX_SINGLE_DECLARE_VARIABLES();
352 xGLXSingleReply reply
;
354 val
= RemapTransposeEnum( val
);
356 __GLX_SINGLE_LOAD_VARIABLES();
357 __GLX_SINGLE_BEGIN(X_GLsop_GetDoublev
,4);
358 __GLX_SINGLE_PUT_LONG(0,val
);
359 __GLX_SINGLE_READ_XREPLY();
360 __GLX_SINGLE_GET_SIZE(compsize
);
364 ** Error occured; don't modify user's buffer.
370 ** We still needed to send the request to the server in order to
371 ** find out whether it was legal to make a query (it's illegal,
372 ** for example, to call a query between glBegin() and glEnd()).
375 if ( get_client_data( gc
, val
, & data
) ) {
376 *d
= (GLdouble
) data
;
380 ** Not a local value, so use what we got from the server.
383 __GLX_SINGLE_GET_DOUBLE(d
);
385 __GLX_SINGLE_GET_DOUBLE_ARRAY(d
,compsize
);
386 if (val
!= origVal
) {
387 /* matrix transpose */
396 void __indirect_glGetFloatv(GLenum val
, GLfloat
*f
)
398 const GLenum origVal
= val
;
399 __GLX_SINGLE_DECLARE_VARIABLES();
400 xGLXSingleReply reply
;
402 val
= RemapTransposeEnum( val
);
404 __GLX_SINGLE_LOAD_VARIABLES();
405 __GLX_SINGLE_BEGIN(X_GLsop_GetFloatv
,4);
406 __GLX_SINGLE_PUT_LONG(0,val
);
407 __GLX_SINGLE_READ_XREPLY();
408 __GLX_SINGLE_GET_SIZE(compsize
);
412 ** Error occured; don't modify user's buffer.
418 ** We still needed to send the request to the server in order to
419 ** find out whether it was legal to make a query (it's illegal,
420 ** for example, to call a query between glBegin() and glEnd()).
423 if ( get_client_data( gc
, val
, & data
) ) {
428 ** Not a local value, so use what we got from the server.
431 __GLX_SINGLE_GET_FLOAT(f
);
433 __GLX_SINGLE_GET_FLOAT_ARRAY(f
,compsize
);
434 if (val
!= origVal
) {
435 /* matrix transpose */
444 void __indirect_glGetIntegerv(GLenum val
, GLint
*i
)
446 const GLenum origVal
= val
;
447 __GLX_SINGLE_DECLARE_VARIABLES();
448 xGLXSingleReply reply
;
450 val
= RemapTransposeEnum( val
);
452 __GLX_SINGLE_LOAD_VARIABLES();
453 __GLX_SINGLE_BEGIN(X_GLsop_GetIntegerv
,4);
454 __GLX_SINGLE_PUT_LONG(0,val
);
455 __GLX_SINGLE_READ_XREPLY();
456 __GLX_SINGLE_GET_SIZE(compsize
);
460 ** Error occured; don't modify user's buffer.
466 ** We still needed to send the request to the server in order to
467 ** find out whether it was legal to make a query (it's illegal,
468 ** for example, to call a query between glBegin() and glEnd()).
471 if ( get_client_data( gc
, val
, & data
) ) {
476 ** Not a local value, so use what we got from the server.
479 __GLX_SINGLE_GET_LONG(i
);
481 __GLX_SINGLE_GET_LONG_ARRAY(i
,compsize
);
482 if (val
!= origVal
) {
483 /* matrix transpose */
493 ** Send all pending commands to server.
495 void __indirect_glFlush(void)
497 __GLX_SINGLE_DECLARE_VARIABLES();
501 __GLX_SINGLE_LOAD_VARIABLES();
502 __GLX_SINGLE_BEGIN(X_GLsop_Flush
,0);
505 /* And finally flush the X protocol data */
509 void __indirect_glFeedbackBuffer(GLsizei size
, GLenum type
, GLfloat
*buffer
)
511 __GLX_SINGLE_DECLARE_VARIABLES();
515 __GLX_SINGLE_LOAD_VARIABLES();
516 __GLX_SINGLE_BEGIN(X_GLsop_FeedbackBuffer
,8);
517 __GLX_SINGLE_PUT_LONG(0,size
);
518 __GLX_SINGLE_PUT_LONG(4,type
);
521 gc
->feedbackBuf
= buffer
;
524 void __indirect_glSelectBuffer(GLsizei numnames
, GLuint
*buffer
)
526 __GLX_SINGLE_DECLARE_VARIABLES();
530 __GLX_SINGLE_LOAD_VARIABLES();
531 __GLX_SINGLE_BEGIN(X_GLsop_SelectBuffer
,4);
532 __GLX_SINGLE_PUT_LONG(0,numnames
);
535 gc
->selectBuf
= buffer
;
538 GLint
__indirect_glRenderMode(GLenum mode
)
540 __GLX_SINGLE_DECLARE_VARIABLES();
542 xGLXRenderModeReply reply
;
546 __GLX_SINGLE_LOAD_VARIABLES();
547 __GLX_SINGLE_BEGIN(X_GLsop_RenderMode
,4);
548 __GLX_SINGLE_PUT_LONG(0,mode
);
549 __GLX_SINGLE_READ_XREPLY();
550 __GLX_SINGLE_GET_RETVAL(retval
,GLint
);
552 if (reply
.newMode
!= mode
) {
554 ** Switch to new mode did not take effect, therefore an error
555 ** occured. When an error happens the server won't send us any
559 /* Read the feedback or selection data */
560 if (gc
->renderMode
== GL_FEEDBACK
) {
561 __GLX_SINGLE_GET_SIZE(compsize
);
562 __GLX_SINGLE_GET_FLOAT_ARRAY(gc
->feedbackBuf
, compsize
);
564 if (gc
->renderMode
== GL_SELECT
) {
565 __GLX_SINGLE_GET_SIZE(compsize
);
566 __GLX_SINGLE_GET_LONG_ARRAY(gc
->selectBuf
, compsize
);
568 gc
->renderMode
= mode
;
575 void __indirect_glFinish(void)
577 __GLX_SINGLE_DECLARE_VARIABLES();
578 xGLXSingleReply reply
;
580 __GLX_SINGLE_LOAD_VARIABLES();
581 __GLX_SINGLE_BEGIN(X_GLsop_Finish
,0);
582 __GLX_SINGLE_READ_XREPLY();
588 * Extract the major and minor version numbers from a version string.
591 version_from_string( const char * ver
,
592 int * major_version
, int * minor_version
)
598 major
= strtol( ver
, (char **) & end
, 10 );
599 minor
= strtol( end
+ 1, NULL
, 10 );
600 *major_version
= major
;
601 *minor_version
= minor
;
605 const GLubyte
*__indirect_glGetString(GLenum name
)
607 __GLXcontext
*gc
= __glXGetCurrentContext();
608 Display
*dpy
= gc
->currentDpy
;
614 ** Return the cached copy if the string has already been fetched
618 if (gc
->vendor
) return gc
->vendor
;
621 if (gc
->renderer
) return gc
->renderer
;
624 if (gc
->version
) return gc
->version
;
627 if (gc
->extensions
) return gc
->extensions
;
630 __glXSetError(gc
, GL_INVALID_ENUM
);
635 ** Get requested string from server
638 (void) __glXFlushRenderBuffer( gc
, gc
->pc
);
639 s
= (GLubyte
*) __glXGetStringFromServer( dpy
, gc
->majorOpcode
,
640 X_GLsop_GetString
, gc
->currentContextTag
,
643 /* Throw data on the floor */
644 __glXSetError(gc
, GL_OUT_OF_MEMORY
);
647 ** Update local cache
662 version_from_string( (char *) s
,
663 & gc
->server_major
, & gc
->server_minor
);
664 __glXGetGLVersion( & client_major
, & client_minor
);
666 if ( (gc
->server_major
< client_major
)
667 || ((gc
->server_major
== client_major
)
668 && (gc
->server_minor
<= client_minor
)) ) {
672 /* Allow 7 bytes for the client-side GL version. This allows
673 * for upto version 999.999. I'm not holding my breath for
674 * that one! The extra 4 is for the ' ()\0' that will be
677 const size_t size
= 7 + strlen( (char *) s
) + 4;
679 gc
->version
= Xmalloc( size
);
680 if ( gc
->version
== NULL
) {
681 /* If we couldn't allocate memory for the new string,
682 * make a best-effort and just copy the client-side version
683 * to the string and use that. It probably doesn't
684 * matter what is done here. If there not memory available
685 * for a short string, the system is probably going to die
688 snprintf( (char *) s
, strlen( (char *) s
) + 1, "%u.%u",
689 client_major
, client_minor
);
693 snprintf( (char *)gc
->version
, size
, "%u.%u (%s)",
694 client_major
, client_minor
, s
);
702 case GL_EXTENSIONS
: {
706 /* This code is currently disabled. I was reminded that some
707 * vendors intentionally exclude some extensions from their
708 * extension string that are part of the core version they
709 * advertise. In particular, on Nvidia drivers this means that
710 * the functionality is supported by the driver, but is not
711 * hardware accelerated. For example, a TNT will show core
712 * version 1.5, but most of the post-1.2 functionality is a
715 * I don't want to break applications that rely on this odd
716 * behavior. At the same time, the code is written and tested,
717 * so I didn't want to throw it away. Therefore, the code is here
718 * but disabled. In the future, we may wish to and an environment
719 * variable to enable it.
723 /* Call glGetString just to make sure that gc->server_major and
724 * gc->server_minor are set. This version may be higher than we
725 * can completely support, but it may imply support for some
726 * extensions that we can support.
728 * For example, at the time of this writing, the client-side
729 * library only supports upto core GL version 1.2. However, cubic
730 * textures, multitexture, multisampling, and some other 1.3
731 * features are supported. If the server reports back version
732 * 1.3, but does not report all of those extensions, we will
735 (void *) glGetString( GL_VERSION
);
736 major
= gc
->server_major
,
737 minor
= gc
->server_minor
;
740 __glXCalculateUsableGLExtensions( gc
, (char *) s
, major
, minor
);
750 GLboolean
__indirect_glIsEnabled(GLenum cap
)
752 __GLX_SINGLE_DECLARE_VARIABLES();
753 __GLXattribute
* state
= (__GLXattribute
*)(gc
->client_state_private
);
754 xGLXSingleReply reply
;
755 GLboolean retval
= 0;
761 case GL_VERTEX_ARRAY
:
762 case GL_NORMAL_ARRAY
:
765 case GL_EDGE_FLAG_ARRAY
:
766 case GL_SECONDARY_COLOR_ARRAY
:
767 case GL_FOG_COORD_ARRAY
:
768 retval
= __glXGetArrayEnable( state
, cap
, 0, & enable
);
770 return (GLboolean
) enable
;
772 case GL_TEXTURE_COORD_ARRAY
:
773 retval
= __glXGetArrayEnable( state
, GL_TEXTURE_COORD_ARRAY
,
774 __glXGetActiveTextureUnit( state
), & enable
);
776 return (GLboolean
) enable
;
780 __GLX_SINGLE_LOAD_VARIABLES();
781 __GLX_SINGLE_BEGIN(X_GLsop_IsEnabled
,4);
782 __GLX_SINGLE_PUT_LONG(0,cap
);
783 __GLX_SINGLE_READ_XREPLY();
784 __GLX_SINGLE_GET_RETVAL(retval
, GLboolean
);
789 void __indirect_glGetPointerv(GLenum pname
, void **params
)
791 __GLXcontext
*gc
= __glXGetCurrentContext();
792 __GLXattribute
* state
= (__GLXattribute
*)(gc
->client_state_private
);
793 Display
*dpy
= gc
->currentDpy
;
798 case GL_VERTEX_ARRAY_POINTER
:
799 case GL_NORMAL_ARRAY_POINTER
:
800 case GL_COLOR_ARRAY_POINTER
:
801 case GL_INDEX_ARRAY_POINTER
:
802 case GL_EDGE_FLAG_ARRAY_POINTER
:
803 __glXGetArrayPointer( state
, pname
- GL_VERTEX_ARRAY_POINTER
807 case GL_TEXTURE_COORD_ARRAY_POINTER
:
808 __glXGetArrayPointer( state
, GL_TEXTURE_COORD_ARRAY
,
809 __glXGetActiveTextureUnit( state
), params
);
811 case GL_SECONDARY_COLOR_ARRAY_POINTER
:
812 case GL_FOG_COORD_ARRAY_POINTER
:
813 __glXGetArrayPointer( state
, pname
- GL_FOG_COORD_ARRAY_POINTER
814 + GL_FOG_COORD_ARRAY
,
817 case GL_FEEDBACK_BUFFER_POINTER
:
818 *params
= (void *)gc
->feedbackBuf
;
820 case GL_SELECTION_BUFFER_POINTER
:
821 *params
= (void *)gc
->selectBuf
;
824 __glXSetError(gc
, GL_INVALID_ENUM
);