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"
42 /* Used for GL_ARB_transpose_matrix */
44 TransposeMatrixf(GLfloat m
[16])
47 for (i
= 0; i
< 4; i
++) {
48 for (j
= 0; j
< i
; j
++) {
49 GLfloat tmp
= m
[i
* 4 + j
];
50 m
[i
* 4 + j
] = m
[j
* 4 + i
];
56 /* Used for GL_ARB_transpose_matrix */
58 TransposeMatrixb(GLboolean m
[16])
61 for (i
= 0; i
< 4; i
++) {
62 for (j
= 0; j
< i
; j
++) {
63 GLboolean tmp
= m
[i
* 4 + j
];
64 m
[i
* 4 + j
] = m
[j
* 4 + i
];
70 /* Used for GL_ARB_transpose_matrix */
72 TransposeMatrixd(GLdouble m
[16])
75 for (i
= 0; i
< 4; i
++) {
76 for (j
= 0; j
< i
; j
++) {
77 GLdouble tmp
= m
[i
* 4 + j
];
78 m
[i
* 4 + j
] = m
[j
* 4 + i
];
84 /* Used for GL_ARB_transpose_matrix */
86 TransposeMatrixi(GLint m
[16])
89 for (i
= 0; i
< 4; i
++) {
90 for (j
= 0; j
< i
; j
++) {
91 GLint tmp
= m
[i
* 4 + j
];
92 m
[i
* 4 + j
] = m
[j
* 4 + i
];
100 * Remap a transpose-matrix enum to a non-transpose-matrix enum. Enums
101 * that are not transpose-matrix enums are unaffected.
104 RemapTransposeEnum(GLenum e
)
107 case GL_TRANSPOSE_MODELVIEW_MATRIX
:
108 case GL_TRANSPOSE_PROJECTION_MATRIX
:
109 case GL_TRANSPOSE_TEXTURE_MATRIX
:
110 return e
- (GL_TRANSPOSE_MODELVIEW_MATRIX
- GL_MODELVIEW_MATRIX
);
111 case GL_TRANSPOSE_COLOR_MATRIX
:
112 return GL_COLOR_MATRIX
;
120 __indirect_glGetError(void)
122 __GLX_SINGLE_DECLARE_VARIABLES();
123 GLuint retval
= GL_NO_ERROR
;
124 xGLXGetErrorReply reply
;
127 /* Use internal error first */
129 gc
->error
= GL_NO_ERROR
;
133 __GLX_SINGLE_LOAD_VARIABLES();
134 __GLX_SINGLE_BEGIN(X_GLsop_GetError
, 0);
135 __GLX_SINGLE_READ_XREPLY();
136 retval
= reply
.error
;
144 * Get the selected attribute from the client state.
147 * On success \c GL_TRUE is returned. Otherwise, \c GL_FALSE is returned.
150 get_client_data(__GLXcontext
* gc
, GLenum cap
, GLintptr
* data
)
152 GLboolean retval
= GL_TRUE
;
153 __GLXattribute
*state
= (__GLXattribute
*) (gc
->client_state_private
);
154 const GLint tex_unit
= __glXGetActiveTextureUnit(state
);
158 case GL_VERTEX_ARRAY
:
159 case GL_NORMAL_ARRAY
:
162 case GL_EDGE_FLAG_ARRAY
:
163 case GL_SECONDARY_COLOR_ARRAY
:
164 case GL_FOG_COORD_ARRAY
:
165 retval
= __glXGetArrayEnable(state
, cap
, 0, data
);
168 case GL_VERTEX_ARRAY_SIZE
:
169 retval
= __glXGetArraySize(state
, GL_VERTEX_ARRAY
, 0, data
);
171 case GL_COLOR_ARRAY_SIZE
:
172 retval
= __glXGetArraySize(state
, GL_COLOR_ARRAY
, 0, data
);
174 case GL_SECONDARY_COLOR_ARRAY_SIZE
:
175 retval
= __glXGetArraySize(state
, GL_SECONDARY_COLOR_ARRAY
, 0, data
);
178 case GL_VERTEX_ARRAY_TYPE
:
179 retval
= __glXGetArrayType(state
, GL_VERTEX_ARRAY
, 0, data
);
181 case GL_NORMAL_ARRAY_TYPE
:
182 retval
= __glXGetArrayType(state
, GL_NORMAL_ARRAY
, 0, data
);
184 case GL_INDEX_ARRAY_TYPE
:
185 retval
= __glXGetArrayType(state
, GL_INDEX_ARRAY
, 0, data
);
187 case GL_COLOR_ARRAY_TYPE
:
188 retval
= __glXGetArrayType(state
, GL_COLOR_ARRAY
, 0, data
);
190 case GL_SECONDARY_COLOR_ARRAY_TYPE
:
191 retval
= __glXGetArrayType(state
, GL_SECONDARY_COLOR_ARRAY
, 0, data
);
193 case GL_FOG_COORD_ARRAY_TYPE
:
194 retval
= __glXGetArrayType(state
, GL_FOG_COORD_ARRAY
, 0, data
);
197 case GL_VERTEX_ARRAY_STRIDE
:
198 retval
= __glXGetArrayStride(state
, GL_VERTEX_ARRAY
, 0, data
);
200 case GL_NORMAL_ARRAY_STRIDE
:
201 retval
= __glXGetArrayStride(state
, GL_NORMAL_ARRAY
, 0, data
);
203 case GL_INDEX_ARRAY_STRIDE
:
204 retval
= __glXGetArrayStride(state
, GL_INDEX_ARRAY
, 0, data
);
206 case GL_EDGE_FLAG_ARRAY_STRIDE
:
207 retval
= __glXGetArrayStride(state
, GL_EDGE_FLAG_ARRAY
, 0, data
);
209 case GL_COLOR_ARRAY_STRIDE
:
210 retval
= __glXGetArrayStride(state
, GL_COLOR_ARRAY
, 0, data
);
212 case GL_SECONDARY_COLOR_ARRAY_STRIDE
:
213 retval
= __glXGetArrayStride(state
, GL_SECONDARY_COLOR_ARRAY
, 0, data
);
215 case GL_FOG_COORD_ARRAY_STRIDE
:
216 retval
= __glXGetArrayStride(state
, GL_FOG_COORD_ARRAY
, 0, data
);
219 case GL_TEXTURE_COORD_ARRAY
:
221 __glXGetArrayEnable(state
, GL_TEXTURE_COORD_ARRAY
, tex_unit
, data
);
223 case GL_TEXTURE_COORD_ARRAY_SIZE
:
225 __glXGetArraySize(state
, GL_TEXTURE_COORD_ARRAY
, tex_unit
, data
);
227 case GL_TEXTURE_COORD_ARRAY_TYPE
:
229 __glXGetArrayType(state
, GL_TEXTURE_COORD_ARRAY
, tex_unit
, data
);
231 case GL_TEXTURE_COORD_ARRAY_STRIDE
:
233 __glXGetArrayStride(state
, GL_TEXTURE_COORD_ARRAY
, tex_unit
, data
);
236 case GL_MAX_ELEMENTS_VERTICES
:
237 case GL_MAX_ELEMENTS_INDICES
:
243 case GL_PACK_ROW_LENGTH
:
244 *data
= (GLintptr
) state
->storePack
.rowLength
;
246 case GL_PACK_IMAGE_HEIGHT
:
247 *data
= (GLintptr
) state
->storePack
.imageHeight
;
249 case GL_PACK_SKIP_ROWS
:
250 *data
= (GLintptr
) state
->storePack
.skipRows
;
252 case GL_PACK_SKIP_PIXELS
:
253 *data
= (GLintptr
) state
->storePack
.skipPixels
;
255 case GL_PACK_SKIP_IMAGES
:
256 *data
= (GLintptr
) state
->storePack
.skipImages
;
258 case GL_PACK_ALIGNMENT
:
259 *data
= (GLintptr
) state
->storePack
.alignment
;
261 case GL_PACK_SWAP_BYTES
:
262 *data
= (GLintptr
) state
->storePack
.swapEndian
;
264 case GL_PACK_LSB_FIRST
:
265 *data
= (GLintptr
) state
->storePack
.lsbFirst
;
267 case GL_UNPACK_ROW_LENGTH
:
268 *data
= (GLintptr
) state
->storeUnpack
.rowLength
;
270 case GL_UNPACK_IMAGE_HEIGHT
:
271 *data
= (GLintptr
) state
->storeUnpack
.imageHeight
;
273 case GL_UNPACK_SKIP_ROWS
:
274 *data
= (GLintptr
) state
->storeUnpack
.skipRows
;
276 case GL_UNPACK_SKIP_PIXELS
:
277 *data
= (GLintptr
) state
->storeUnpack
.skipPixels
;
279 case GL_UNPACK_SKIP_IMAGES
:
280 *data
= (GLintptr
) state
->storeUnpack
.skipImages
;
282 case GL_UNPACK_ALIGNMENT
:
283 *data
= (GLintptr
) state
->storeUnpack
.alignment
;
285 case GL_UNPACK_SWAP_BYTES
:
286 *data
= (GLintptr
) state
->storeUnpack
.swapEndian
;
288 case GL_UNPACK_LSB_FIRST
:
289 *data
= (GLintptr
) state
->storeUnpack
.lsbFirst
;
291 case GL_CLIENT_ATTRIB_STACK_DEPTH
:
292 *data
= (GLintptr
) (gc
->attributes
.stackPointer
- gc
->attributes
.stack
);
294 case GL_MAX_CLIENT_ATTRIB_STACK_DEPTH
:
295 *data
= (GLintptr
) __GL_CLIENT_ATTRIB_STACK_DEPTH
;
297 case GL_CLIENT_ACTIVE_TEXTURE
:
298 *data
= (GLintptr
) (tex_unit
+ GL_TEXTURE0
);
312 __indirect_glGetBooleanv(GLenum val
, GLboolean
* b
)
314 const GLenum origVal
= val
;
315 __GLX_SINGLE_DECLARE_VARIABLES();
316 xGLXSingleReply reply
;
318 val
= RemapTransposeEnum(val
);
320 __GLX_SINGLE_LOAD_VARIABLES();
321 __GLX_SINGLE_BEGIN(X_GLsop_GetBooleanv
, 4);
322 __GLX_SINGLE_PUT_LONG(0, val
);
323 __GLX_SINGLE_READ_XREPLY();
324 __GLX_SINGLE_GET_SIZE(compsize
);
328 ** Error occured; don't modify user's buffer.
335 ** We still needed to send the request to the server in order to
336 ** find out whether it was legal to make a query (it's illegal,
337 ** for example, to call a query between glBegin() and glEnd()).
340 if (get_client_data(gc
, val
, &data
)) {
341 *b
= (GLboolean
) data
;
345 ** Not a local value, so use what we got from the server.
348 __GLX_SINGLE_GET_CHAR(b
);
351 __GLX_SINGLE_GET_CHAR_ARRAY(b
, compsize
);
352 if (val
!= origVal
) {
353 /* matrix transpose */
363 __indirect_glGetDoublev(GLenum val
, GLdouble
* d
)
365 const GLenum origVal
= val
;
366 __GLX_SINGLE_DECLARE_VARIABLES();
367 xGLXSingleReply reply
;
369 val
= RemapTransposeEnum(val
);
371 __GLX_SINGLE_LOAD_VARIABLES();
372 __GLX_SINGLE_BEGIN(X_GLsop_GetDoublev
, 4);
373 __GLX_SINGLE_PUT_LONG(0, val
);
374 __GLX_SINGLE_READ_XREPLY();
375 __GLX_SINGLE_GET_SIZE(compsize
);
379 ** Error occured; don't modify user's buffer.
386 ** We still needed to send the request to the server in order to
387 ** find out whether it was legal to make a query (it's illegal,
388 ** for example, to call a query between glBegin() and glEnd()).
391 if (get_client_data(gc
, val
, &data
)) {
392 *d
= (GLdouble
) data
;
396 ** Not a local value, so use what we got from the server.
399 __GLX_SINGLE_GET_DOUBLE(d
);
402 __GLX_SINGLE_GET_DOUBLE_ARRAY(d
, compsize
);
403 if (val
!= origVal
) {
404 /* matrix transpose */
414 __indirect_glGetFloatv(GLenum val
, GLfloat
* f
)
416 const GLenum origVal
= val
;
417 __GLX_SINGLE_DECLARE_VARIABLES();
418 xGLXSingleReply reply
;
420 val
= RemapTransposeEnum(val
);
422 __GLX_SINGLE_LOAD_VARIABLES();
423 __GLX_SINGLE_BEGIN(X_GLsop_GetFloatv
, 4);
424 __GLX_SINGLE_PUT_LONG(0, val
);
425 __GLX_SINGLE_READ_XREPLY();
426 __GLX_SINGLE_GET_SIZE(compsize
);
430 ** Error occured; don't modify user's buffer.
437 ** We still needed to send the request to the server in order to
438 ** find out whether it was legal to make a query (it's illegal,
439 ** for example, to call a query between glBegin() and glEnd()).
442 if (get_client_data(gc
, val
, &data
)) {
447 ** Not a local value, so use what we got from the server.
450 __GLX_SINGLE_GET_FLOAT(f
);
453 __GLX_SINGLE_GET_FLOAT_ARRAY(f
, compsize
);
454 if (val
!= origVal
) {
455 /* matrix transpose */
465 __indirect_glGetIntegerv(GLenum val
, GLint
* i
)
467 const GLenum origVal
= val
;
468 __GLX_SINGLE_DECLARE_VARIABLES();
469 xGLXSingleReply reply
;
471 val
= RemapTransposeEnum(val
);
473 __GLX_SINGLE_LOAD_VARIABLES();
474 __GLX_SINGLE_BEGIN(X_GLsop_GetIntegerv
, 4);
475 __GLX_SINGLE_PUT_LONG(0, val
);
476 __GLX_SINGLE_READ_XREPLY();
477 __GLX_SINGLE_GET_SIZE(compsize
);
481 ** Error occured; don't modify user's buffer.
488 ** We still needed to send the request to the server in order to
489 ** find out whether it was legal to make a query (it's illegal,
490 ** for example, to call a query between glBegin() and glEnd()).
493 if (get_client_data(gc
, val
, &data
)) {
498 ** Not a local value, so use what we got from the server.
501 __GLX_SINGLE_GET_LONG(i
);
504 __GLX_SINGLE_GET_LONG_ARRAY(i
, compsize
);
505 if (val
!= origVal
) {
506 /* matrix transpose */
516 ** Send all pending commands to server.
519 __indirect_glFlush(void)
521 __GLX_SINGLE_DECLARE_VARIABLES();
526 __GLX_SINGLE_LOAD_VARIABLES();
527 __GLX_SINGLE_BEGIN(X_GLsop_Flush
, 0);
530 /* And finally flush the X protocol data */
535 __indirect_glFeedbackBuffer(GLsizei size
, GLenum type
, GLfloat
* buffer
)
537 __GLX_SINGLE_DECLARE_VARIABLES();
542 __GLX_SINGLE_LOAD_VARIABLES();
543 __GLX_SINGLE_BEGIN(X_GLsop_FeedbackBuffer
, 8);
544 __GLX_SINGLE_PUT_LONG(0, size
);
545 __GLX_SINGLE_PUT_LONG(4, type
);
548 gc
->feedbackBuf
= buffer
;
552 __indirect_glSelectBuffer(GLsizei numnames
, GLuint
* buffer
)
554 __GLX_SINGLE_DECLARE_VARIABLES();
559 __GLX_SINGLE_LOAD_VARIABLES();
560 __GLX_SINGLE_BEGIN(X_GLsop_SelectBuffer
, 4);
561 __GLX_SINGLE_PUT_LONG(0, numnames
);
564 gc
->selectBuf
= buffer
;
568 __indirect_glRenderMode(GLenum mode
)
570 __GLX_SINGLE_DECLARE_VARIABLES();
572 xGLXRenderModeReply reply
;
577 __GLX_SINGLE_LOAD_VARIABLES();
578 __GLX_SINGLE_BEGIN(X_GLsop_RenderMode
, 4);
579 __GLX_SINGLE_PUT_LONG(0, mode
);
580 __GLX_SINGLE_READ_XREPLY();
581 __GLX_SINGLE_GET_RETVAL(retval
, GLint
);
583 if (reply
.newMode
!= mode
) {
585 ** Switch to new mode did not take effect, therefore an error
586 ** occured. When an error happens the server won't send us any
591 /* Read the feedback or selection data */
592 if (gc
->renderMode
== GL_FEEDBACK
) {
593 __GLX_SINGLE_GET_SIZE(compsize
);
594 __GLX_SINGLE_GET_FLOAT_ARRAY(gc
->feedbackBuf
, compsize
);
596 else if (gc
->renderMode
== GL_SELECT
) {
597 __GLX_SINGLE_GET_SIZE(compsize
);
598 __GLX_SINGLE_GET_LONG_ARRAY(gc
->selectBuf
, compsize
);
600 gc
->renderMode
= mode
;
608 __indirect_glFinish(void)
610 __GLX_SINGLE_DECLARE_VARIABLES();
611 xGLXSingleReply reply
;
613 __GLX_SINGLE_LOAD_VARIABLES();
614 __GLX_SINGLE_BEGIN(X_GLsop_Finish
, 0);
615 __GLX_SINGLE_READ_XREPLY();
621 * Extract the major and minor version numbers from a version string.
624 version_from_string(const char *ver
, int *major_version
, int *minor_version
)
630 major
= strtol(ver
, (char **) &end
, 10);
631 minor
= strtol(end
+ 1, NULL
, 10);
632 *major_version
= major
;
633 *minor_version
= minor
;
638 __indirect_glGetString(GLenum name
)
640 __GLXcontext
*gc
= __glXGetCurrentContext();
641 Display
*dpy
= gc
->currentDpy
;
648 ** Return the cached copy if the string has already been fetched
665 return gc
->extensions
;
668 __glXSetError(gc
, GL_INVALID_ENUM
);
673 ** Get requested string from server
676 (void) __glXFlushRenderBuffer(gc
, gc
->pc
);
677 s
= (GLubyte
*) __glXGetStringFromServer(dpy
, gc
->majorOpcode
,
679 gc
->currentContextTag
, name
);
681 /* Throw data on the floor */
682 __glXSetError(gc
, GL_OUT_OF_MEMORY
);
686 ** Update local cache
701 version_from_string((char *) s
,
702 &gc
->server_major
, &gc
->server_minor
);
703 __glXGetGLVersion(&client_major
, &client_minor
);
705 if ((gc
->server_major
< client_major
)
706 || ((gc
->server_major
== client_major
)
707 && (gc
->server_minor
<= client_minor
))) {
711 /* Allow 7 bytes for the client-side GL version. This allows
712 * for upto version 999.999. I'm not holding my breath for
713 * that one! The extra 4 is for the ' ()\0' that will be
716 const size_t size
= 7 + strlen((char *) s
) + 4;
718 gc
->version
= Xmalloc(size
);
719 if (gc
->version
== NULL
) {
720 /* If we couldn't allocate memory for the new string,
721 * make a best-effort and just copy the client-side version
722 * to the string and use that. It probably doesn't
723 * matter what is done here. If there not memory available
724 * for a short string, the system is probably going to die
727 snprintf((char *) s
, strlen((char *) s
) + 1, "%u.%u",
728 client_major
, client_minor
);
732 snprintf((char *) gc
->version
, size
, "%u.%u (%s)",
733 client_major
, client_minor
, s
);
745 /* This code is currently disabled. I was reminded that some
746 * vendors intentionally exclude some extensions from their
747 * extension string that are part of the core version they
748 * advertise. In particular, on Nvidia drivers this means that
749 * the functionality is supported by the driver, but is not
750 * hardware accelerated. For example, a TNT will show core
751 * version 1.5, but most of the post-1.2 functionality is a
754 * I don't want to break applications that rely on this odd
755 * behavior. At the same time, the code is written and tested,
756 * so I didn't want to throw it away. Therefore, the code is here
757 * but disabled. In the future, we may wish to and an environment
758 * variable to enable it.
762 /* Call glGetString just to make sure that gc->server_major and
763 * gc->server_minor are set. This version may be higher than we
764 * can completely support, but it may imply support for some
765 * extensions that we can support.
767 * For example, at the time of this writing, the client-side
768 * library only supports upto core GL version 1.2. However, cubic
769 * textures, multitexture, multisampling, and some other 1.3
770 * features are supported. If the server reports back version
771 * 1.3, but does not report all of those extensions, we will
774 (void *) glGetString(GL_VERSION
);
775 major
= gc
->server_major
, minor
= gc
->server_minor
;
778 __glXCalculateUsableGLExtensions(gc
, (char *) s
, major
, minor
);
789 __indirect_glIsEnabled(GLenum cap
)
791 __GLX_SINGLE_DECLARE_VARIABLES();
792 __GLXattribute
*state
= (__GLXattribute
*) (gc
->client_state_private
);
793 xGLXSingleReply reply
;
794 GLboolean retval
= 0;
801 case GL_VERTEX_ARRAY
:
802 case GL_NORMAL_ARRAY
:
805 case GL_EDGE_FLAG_ARRAY
:
806 case GL_SECONDARY_COLOR_ARRAY
:
807 case GL_FOG_COORD_ARRAY
:
808 retval
= __glXGetArrayEnable(state
, cap
, 0, &enable
);
810 return (GLboolean
) enable
;
812 case GL_TEXTURE_COORD_ARRAY
:
813 retval
= __glXGetArrayEnable(state
, GL_TEXTURE_COORD_ARRAY
,
814 __glXGetActiveTextureUnit(state
), &enable
);
816 return (GLboolean
) enable
;
820 __GLX_SINGLE_LOAD_VARIABLES();
821 __GLX_SINGLE_BEGIN(X_GLsop_IsEnabled
, 4);
822 __GLX_SINGLE_PUT_LONG(0, cap
);
823 __GLX_SINGLE_READ_XREPLY();
824 __GLX_SINGLE_GET_RETVAL(retval
, GLboolean
);
830 __indirect_glGetPointerv(GLenum pname
, void **params
)
832 __GLXcontext
*gc
= __glXGetCurrentContext();
833 __GLXattribute
*state
= (__GLXattribute
*) (gc
->client_state_private
);
834 Display
*dpy
= gc
->currentDpy
;
840 case GL_VERTEX_ARRAY_POINTER
:
841 case GL_NORMAL_ARRAY_POINTER
:
842 case GL_COLOR_ARRAY_POINTER
:
843 case GL_INDEX_ARRAY_POINTER
:
844 case GL_EDGE_FLAG_ARRAY_POINTER
:
845 __glXGetArrayPointer(state
, pname
- GL_VERTEX_ARRAY_POINTER
846 + GL_VERTEX_ARRAY
, 0, params
);
848 case GL_TEXTURE_COORD_ARRAY_POINTER
:
849 __glXGetArrayPointer(state
, GL_TEXTURE_COORD_ARRAY
,
850 __glXGetActiveTextureUnit(state
), params
);
852 case GL_SECONDARY_COLOR_ARRAY_POINTER
:
853 case GL_FOG_COORD_ARRAY_POINTER
:
854 __glXGetArrayPointer(state
, pname
- GL_FOG_COORD_ARRAY_POINTER
855 + GL_FOG_COORD_ARRAY
, 0, params
);
857 case GL_FEEDBACK_BUFFER_POINTER
:
858 *params
= (void *) gc
->feedbackBuf
;
860 case GL_SELECTION_BUFFER_POINTER
:
861 *params
= (void *) gc
->selectBuf
;
864 __glXSetError(gc
, GL_INVALID_ENUM
);
872 * This was previously auto-generated, but we need to special-case
873 * how we handle writing into the 'residences' buffer when n%4!=0.
875 #define X_GLsop_AreTexturesResident 143
877 __indirect_glAreTexturesResident(GLsizei n
, const GLuint
* textures
,
878 GLboolean
* residences
)
880 __GLXcontext
*const gc
= __glXGetCurrentContext();
881 Display
*const dpy
= gc
->currentDpy
;
882 GLboolean retval
= (GLboolean
) 0;
883 const GLuint cmdlen
= 4 + __GLX_PAD((n
* 4));
884 if (__builtin_expect((n
>= 0) && (dpy
!= NULL
), 1)) {
886 xcb_connection_t
*c
= XGetXCBConnection(dpy
);
887 (void) __glXFlushRenderBuffer(gc
, gc
->pc
);
888 xcb_glx_are_textures_resident_reply_t
*reply
=
889 xcb_glx_are_textures_resident_reply(c
,
890 xcb_glx_are_textures_resident
891 (c
, gc
->currentContextTag
, n
,
893 (void) memcpy(residences
, xcb_glx_are_textures_resident_data(reply
),
894 xcb_glx_are_textures_resident_data_length(reply
) *
896 retval
= reply
->ret_val
;
900 __glXSetupSingleRequest(gc
, X_GLsop_AreTexturesResident
, cmdlen
);
901 (void) memcpy((void *) (pc
+ 0), (void *) (&n
), 4);
902 (void) memcpy((void *) (pc
+ 4), (void *) (textures
), (n
* 4));
904 /* n is not a multiple of four.
905 * When reply_is_always_array is TRUE, __glXReadReply() will
906 * put a multiple of four bytes into the dest buffer. If the
907 * caller's buffer is not a multiple of four in size, we'll write
908 * out of bounds. So use a temporary buffer that's a few bytes
911 GLboolean
*res4
= malloc((n
+ 3) & ~3);
912 retval
= (GLboolean
) __glXReadReply(dpy
, 1, res4
, GL_TRUE
);
913 memcpy(residences
, res4
, n
);
917 retval
= (GLboolean
) __glXReadReply(dpy
, 1, residences
, GL_TRUE
);
928 * This was previously auto-generated, but we need to special-case
929 * how we handle writing into the 'residences' buffer when n%4!=0.
931 #define X_GLvop_AreTexturesResidentEXT 11
933 glAreTexturesResidentEXT(GLsizei n
, const GLuint
* textures
,
934 GLboolean
* residences
)
936 __GLXcontext
*const gc
= __glXGetCurrentContext();
939 return CALL_AreTexturesResident(GET_DISPATCH(),
940 (n
, textures
, residences
));
942 __GLXcontext
*const gc
= __glXGetCurrentContext();
943 Display
*const dpy
= gc
->currentDpy
;
944 GLboolean retval
= (GLboolean
) 0;
945 const GLuint cmdlen
= 4 + __GLX_PAD((n
* 4));
946 if (__builtin_expect((n
>= 0) && (dpy
!= NULL
), 1)) {
948 __glXSetupVendorRequest(gc
, X_GLXVendorPrivateWithReply
,
949 X_GLvop_AreTexturesResidentEXT
,
951 (void) memcpy((void *) (pc
+ 0), (void *) (&n
), 4);
952 (void) memcpy((void *) (pc
+ 4), (void *) (textures
), (n
* 4));
954 /* see comments in __indirect_glAreTexturesResident() */
955 GLboolean
*res4
= malloc((n
+ 3) & ~3);
956 retval
= (GLboolean
) __glXReadReply(dpy
, 1, res4
, GL_TRUE
);
957 memcpy(residences
, res4
, n
);
961 retval
= (GLboolean
) __glXReadReply(dpy
, 1, residences
, GL_TRUE
);