140af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick/*
240af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * (C) Copyright IBM Corporation 2005
340af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * All Rights Reserved.
440af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick *
540af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a
640af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * copy of this software and associated documentation files (the "Software"),
740af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * to deal in the Software without restriction, including without limitation
840af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sub license,
940af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * and/or sell copies of the Software, and to permit persons to whom the
1040af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * Software is furnished to do so, subject to the following conditions:
1140af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick *
1240af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * The above copyright notice and this permission notice (including the next
1340af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * paragraph) shall be included in all copies or substantial portions of the
1440af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * Software.
1540af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick *
1640af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1740af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1840af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
1940af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * IBM,
2040af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
2140af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
2240af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2340af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * SOFTWARE.
2440af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick */
2540af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
2640af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick#include <inttypes.h>
2740af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick#include <GL/gl.h>
2840af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick#include "indirect.h"
2940af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick#include "glxclient.h"
3040af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick#include "indirect_vertex_array.h"
3140af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick#include <GL/glxproto.h>
3240af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
33016fc30839f0fb67bb37d4a7353a7e38749deab5Ian Romanick#if !defined(__GNUC__)
34707c017af68df24441e86b8a69831633a4106ca3Alan Coopersmith#  define __builtin_expect(x, y) x
35707c017af68df24441e86b8a69831633a4106ca3Alan Coopersmith#endif
36707c017af68df24441e86b8a69831633a4106ca3Alan Coopersmith
37d2fb24a6714ca4eacaf50e8741fd9b012f7a3560Brian Paulstatic void
38ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristófdo_vertex_attrib_enable(GLuint index, GLboolean val)
3940af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick{
40c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
41ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
4240af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
43ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   if (!__glXSetArrayEnable(state, GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB,
44ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf                            index, val)) {
45ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_ENUM);
46ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   }
4740af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick}
4840af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
4940af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
50ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristófvoid
51ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf__indirect_glEnableVertexAttribArrayARB(GLuint index)
5240af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick{
53ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   do_vertex_attrib_enable(index, GL_TRUE);
5440af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick}
5540af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
5640af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
57ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristófvoid
58ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf__indirect_glDisableVertexAttribArrayARB(GLuint index)
5940af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick{
60ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   do_vertex_attrib_enable(index, GL_FALSE);
6140af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick}
6240af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
6340af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
6440af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanickstatic void
65ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristófget_parameter(unsigned opcode, unsigned size, GLenum target, GLuint index,
66ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf              void *params)
6740af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick{
68c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *const gc = __glXGetCurrentContext();
69ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   Display *const dpy = gc->currentDpy;
70ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   const GLuint cmdlen = 12;
71ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf
72ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   if (__builtin_expect(dpy != NULL, 1)) {
73ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      GLubyte const *pc = __glXSetupVendorRequest(gc,
74ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf                                                  X_GLXVendorPrivateWithReply,
75ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf                                                  opcode, cmdlen);
76ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf
77ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      *((GLenum *) (pc + 0)) = target;
78ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      *((GLuint *) (pc + 4)) = index;
79ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      *((GLuint *) (pc + 8)) = 0;
80ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf
81ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      (void) __glXReadReply(dpy, size, params, GL_FALSE);
82ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      UnlockDisplay(dpy);
83ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      SyncHandle();
84ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   }
85ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   return;
8640af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick}
8740af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
8840af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
89ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristófvoid
90ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf__indirect_glGetProgramEnvParameterfvARB(GLenum target, GLuint index,
91ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf                                         GLfloat * params)
9240af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick{
93ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   get_parameter(1296, 4, target, index, params);
9440af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick}
9540af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
9640af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
97ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristófvoid
98ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf__indirect_glGetProgramEnvParameterdvARB(GLenum target, GLuint index,
99ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf                                         GLdouble * params)
10040af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick{
101ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   get_parameter(1297, 8, target, index, params);
10240af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick}
10340af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
10440af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
105ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristófvoid
106ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf__indirect_glGetProgramLocalParameterfvARB(GLenum target, GLuint index,
107ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf                                           GLfloat * params)
10840af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick{
109ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   get_parameter(1305, 4, target, index, params);
11040af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick}
11140af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
11240af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
113ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristófvoid
114ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf__indirect_glGetProgramLocalParameterdvARB(GLenum target, GLuint index,
115ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf                                           GLdouble * params)
11640af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick{
117ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   get_parameter(1306, 8, target, index, params);
11840af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick}
11940af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
12040af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
121ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristófvoid
122ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf__indirect_glGetVertexAttribPointervNV(GLuint index, GLenum pname,
123ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf                                       GLvoid ** pointer)
12440af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick{
125c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *const gc = __glXGetCurrentContext();
126ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
127ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf
128ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB) {
129ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_ENUM);
130ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   }
131ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf
132ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   if (!__glXGetArrayPointer(state, GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB,
133ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf                             index, pointer)) {
134ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_VALUE);
135ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   }
13640af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick}
13740af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
13840af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
13940af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick/**
14040af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * Get the selected attribute from the vertex array state vector.
14140af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick *
14240af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * \returns
14340af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * On success \c GL_TRUE is returned.  Otherwise, \c GL_FALSE is returned.
14440af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick */
14540af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanickstatic GLboolean
146ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristófget_attrib_array_data(__GLXattribute * state, GLuint index, GLenum cap,
147ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf                      GLintptr * data)
14840af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick{
149ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   GLboolean retval = GL_FALSE;
150ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   const GLenum attrib = GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB;
151ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf
152ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   switch (cap) {
153ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB:
154ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      retval = __glXGetArrayEnable(state, attrib, index, data);
155ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      break;
15640af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
157ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB:
158ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      retval = __glXGetArraySize(state, attrib, index, data);
159ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      break;
16040af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
161ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB:
162ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      retval = __glXGetArrayStride(state, attrib, index, data);
163ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      break;
16440af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
165ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB:
166ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      retval = __glXGetArrayType(state, attrib, index, data);
167ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      break;
16840af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
169ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB:
170ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      retval = __glXGetArrayNormalized(state, attrib, index, data);
171ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      break;
172ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   }
17340af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
17440af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
175ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   return retval;
17640af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick}
17740af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
17840af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
179ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristófstatic void
180c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergget_vertex_attrib(struct glx_context * gc, unsigned vop,
181ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf                  GLuint index, GLenum pname, xReply * reply)
18240af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick{
183ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   Display *const dpy = gc->currentDpy;
184ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   GLubyte *const pc = __glXSetupVendorRequest(gc,
185ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf                                               X_GLXVendorPrivateWithReply,
186ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf                                               vop, 8);
187ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf
188ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   *((uint32_t *) (pc + 0)) = index;
189ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   *((uint32_t *) (pc + 4)) = pname;
190ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf
191ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   (void) _XReply(dpy, reply, 0, False);
19240af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick}
19340af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
19440af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
195ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristófvoid
196ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf__indirect_glGetVertexAttribivARB(GLuint index, GLenum pname, GLint * params)
19740af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick{
198c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *const gc = __glXGetCurrentContext();
199ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   Display *const dpy = gc->currentDpy;
200ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
201ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   xGLXSingleReply reply;
20240af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
20340af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
204ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   get_vertex_attrib(gc, 1303, index, pname, (xReply *) & reply);
20540af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
206ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   if (reply.size != 0) {
207ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      GLintptr data;
208811d8b86eb43b140de86e2674d50b19223d74c5eGuillaume Melquiond
209811d8b86eb43b140de86e2674d50b19223d74c5eGuillaume Melquiond
210ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      if (get_attrib_array_data(state, index, pname, &data)) {
211ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf         *params = (GLint) data;
212ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      }
213ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      else {
214ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf         if (reply.size == 1) {
215ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf            *params = (GLint) reply.pad3;
216ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf         }
217ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf         else {
218ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf            _XRead(dpy, (void *) params, 4 * reply.size);
219ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf         }
220ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      }
221ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   }
22240af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
223ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   UnlockDisplay(dpy);
224ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   SyncHandle();
22540af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick}
22640af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
22740af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
228ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristófvoid
229ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf__indirect_glGetVertexAttribfvARB(GLuint index, GLenum pname,
230ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf                                  GLfloat * params)
23140af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick{
232c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *const gc = __glXGetCurrentContext();
233ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   Display *const dpy = gc->currentDpy;
234ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
235ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   xGLXSingleReply reply;
23640af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
23740af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
238ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   get_vertex_attrib(gc, 1302, index, pname, (xReply *) & reply);
23940af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
240ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   if (reply.size != 0) {
241ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      GLintptr data;
24240af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
24340af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
244ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      if (get_attrib_array_data(state, index, pname, &data)) {
245ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf         *params = (GLfloat) data;
246ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      }
247ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      else {
248ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf         if (reply.size == 1) {
249ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf            (void) memcpy(params, &reply.pad3, sizeof(GLfloat));
250ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf         }
251ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf         else {
252ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf            _XRead(dpy, (void *) params, 4 * reply.size);
253ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf         }
254ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      }
255ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   }
25640af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
257ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   UnlockDisplay(dpy);
258ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   SyncHandle();
25940af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick}
26040af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
26140af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
262ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristófvoid
263ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf__indirect_glGetVertexAttribdvARB(GLuint index, GLenum pname,
264ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf                                  GLdouble * params)
26540af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick{
266c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *const gc = __glXGetCurrentContext();
267ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   Display *const dpy = gc->currentDpy;
268ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
269ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   xGLXSingleReply reply;
27040af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
27140af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
272ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   get_vertex_attrib(gc, 1301, index, pname, (xReply *) & reply);
27340af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
274ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   if (reply.size != 0) {
275ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      GLintptr data;
27640af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
27740af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
278ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      if (get_attrib_array_data(state, index, pname, &data)) {
279ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf         *params = (GLdouble) data;
280ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      }
281ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      else {
282ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf         if (reply.size == 1) {
283ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf            (void) memcpy(params, &reply.pad3, sizeof(GLdouble));
284ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf         }
285ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf         else {
286ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf            _XRead(dpy, (void *) params, 8 * reply.size);
287ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf         }
288ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf      }
289ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   }
29040af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
291ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   UnlockDisplay(dpy);
292ccc03b427aabb35035be530055dd10f38dfd7c59RALOVICH, Kristóf   SyncHandle();
29340af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick}
294