1fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick/*
2fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * (C) Copyright IBM Corporation 2004, 2005
3fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * All Rights Reserved.
40896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
5fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a
6fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * copy of this software and associated documentation files (the "Software"),
7fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * to deal in the Software without restriction, including without limitation
8fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sub license,
9fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * and/or sell copies of the Software, and to permit persons to whom the
10fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * Software is furnished to do so, subject to the following conditions:
110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
12fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * The above copyright notice and this permission notice (including the next
13fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * paragraph) shall be included in all copies or substantial portions of the
14fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * Software.
150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
16fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
19fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * IBM,
20fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
22fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * SOFTWARE.
24fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick */
25fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
26fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick#include <inttypes.h>
27fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick#include <assert.h>
28fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick#include <string.h>
29fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
3003dc437363429d275b7f8cae74201a8e7993a52bIan Romanick#include "glxclient.h"
3103dc437363429d275b7f8cae74201a8e7993a52bIan Romanick#include "indirect.h"
32fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick#include <GL/glxproto.h>
33fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick#include "glxextensions.h"
34fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick#include "indirect_vertex_array.h"
35f027f8d3a832f9820acba8892e2540094b01c9aeGeorge Sapountzis#include "indirect_vertex_array_priv.h"
36fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
3703dc437363429d275b7f8cae74201a8e7993a52bIan Romanick#define __GLX_PAD(n) (((n)+3) & ~3)
3803dc437363429d275b7f8cae74201a8e7993a52bIan Romanick
39fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick/**
40fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * \file indirect_vertex_array.c
41fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * Implement GLX protocol for vertex arrays and vertex buffer objects.
420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
43fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * The most important function in this fill is \c fill_array_info_cache.
44fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * The \c array_state_vector contains a cache of the ARRAY_INFO data sent
45fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * in the DrawArrays protocol.  Certain operations, such as enabling or
46fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * disabling an array, can invalidate this cache.  \c fill_array_info_cache
47fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * fills-in this data.  Additionally, it examines the enabled state and
48fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * other factors to determine what "version" of DrawArrays protocoal can be
49fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * used.
500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
51fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * Current, only two versions of DrawArrays protocol are implemented.  The
52fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * first version is the "none" protocol.  This is the fallback when the
53fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * server does not support GL 1.1 / EXT_vertex_arrays.  It is implemented
54fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * by sending batches of immediate mode commands that are equivalent to the
55fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * DrawArrays protocol.
56fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick *
57fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * The other protocol that is currently implemented is the "old" protocol.
58fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * This is the GL 1.1 DrawArrays protocol.  The only difference between GL
59fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * 1.1 and EXT_vertex_arrays is the opcode used for the DrawArrays command.
60fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * This protocol is called "old" because the ARB is in the process of
61fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * defining a new protocol, which will probably be called wither "new" or
62fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * "vbo", to support multiple texture coordinate arrays, generic attributes,
63fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * and vertex buffer objects.
64fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick *
6527e3f7f21d4405edbdbe98b5b62b1eaeec0d4aabIan Romanick * \author Ian Romanick <ian.d.romanick@intel.com>
66fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick */
67fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
68c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófstatic void emit_DrawArrays_none(GLenum mode, GLint first, GLsizei count);
69c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófstatic void emit_DrawArrays_old(GLenum mode, GLint first, GLsizei count);
70c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
71c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófstatic void emit_DrawElements_none(GLenum mode, GLsizei count, GLenum type,
72c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                   const GLvoid * indices);
73c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófstatic void emit_DrawElements_old(GLenum mode, GLsizei count, GLenum type,
74c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                  const GLvoid * indices);
75c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
76c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
77c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófstatic GLubyte *emit_element_none(GLubyte * dst,
78c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                  const struct array_state_vector *arrays,
79c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                  unsigned index);
80c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófstatic GLubyte *emit_element_old(GLubyte * dst,
81c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                 const struct array_state_vector *arrays,
82c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                 unsigned index);
83c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófstatic struct array_state *get_array_entry(const struct array_state_vector
84c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                           *arrays, GLenum key,
85c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                           unsigned index);
86c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófstatic void fill_array_info_cache(struct array_state_vector *arrays);
87c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergstatic GLboolean validate_mode(struct glx_context * gc, GLenum mode);
88c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergstatic GLboolean validate_count(struct glx_context * gc, GLsizei count);
89c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergstatic GLboolean validate_type(struct glx_context * gc, GLenum type);
90fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
91fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
92fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick/**
930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * Table of sizes, in bytes, of a GL types.  All of the type enums are be in
94fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * the range 0x1400 - 0x140F.  That includes types added by extensions (i.e.,
95fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * \c GL_HALF_FLOAT_NV).  This elements of this table correspond to the
96fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * type enums masked with 0x0f.
970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
98fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * \notes
99fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * \c GL_HALF_FLOAT_NV is not included.  Neither are \c GL_2_BYTES,
100fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * \c GL_3_BYTES, or \c GL_4_BYTES.
101fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick */
102fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanickconst GLuint __glXTypeSize_table[16] = {
103c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   1, 1, 2, 2, 4, 4, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0
104fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick};
105fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
106fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
107e2060348630b59a446bac7f734fdde40033093abKristof Ralovich/**
108e2060348630b59a446bac7f734fdde40033093abKristof Ralovich * Free the per-context array state that was allocated with
109e2060348630b59a446bac7f734fdde40033093abKristof Ralovich * __glXInitVertexArrayState().
110e2060348630b59a446bac7f734fdde40033093abKristof Ralovich */
111e2060348630b59a446bac7f734fdde40033093abKristof Ralovichvoid
112c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXFreeVertexArrayState(struct glx_context * gc)
113e2060348630b59a446bac7f734fdde40033093abKristof Ralovich{
114c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
115c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
116c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
117c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (arrays) {
118c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if (arrays->stack) {
119c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         free(arrays->stack);
120c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         arrays->stack = NULL;
121c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
122c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if (arrays->arrays) {
123c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         free(arrays->arrays);
124c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         arrays->arrays = NULL;
125c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
126c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      free(arrays);
127c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      state->array_state = NULL;
128c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
129e2060348630b59a446bac7f734fdde40033093abKristof Ralovich}
130e2060348630b59a446bac7f734fdde40033093abKristof Ralovich
131fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
132fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick/**
133fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * Initialize vertex array state of a GLX context.
1340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
135fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * \param gc  GLX context whose vertex array state is to be initialized.
1360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
137fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * \warning
138c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg * This function may only be called after struct glx_context::gl_extension_bits,
139c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg * struct glx_context::server_minor, and __GLXcontext::server_major have been
140fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * initialized.  These values are used to determine what vertex arrays are
141fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * supported.
1420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
143fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * \bug
144fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * Return values from malloc are not properly tested.
145fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick */
146fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanickvoid
147c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXInitVertexArrayState(struct glx_context * gc)
148fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
149c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
150c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays;
151c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
152c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned array_count;
153c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   int texture_units = 1, vertex_program_attribs = 0;
154c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned i, j;
155c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
156c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   GLboolean got_fog = GL_FALSE;
157c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   GLboolean got_secondary_color = GL_FALSE;
158c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
159c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
160c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays = calloc(1, sizeof(struct array_state_vector));
161c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   state->array_state = arrays;
162c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
163c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->old_DrawArrays_possible = !state->NoDrawArraysProtocol;
164c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->new_DrawArrays_possible = GL_FALSE;
165c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->DrawArrays = NULL;
166c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
167c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->active_texture_unit = 0;
168c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
169c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
170c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   /* Determine how many arrays are actually needed.  Only arrays that
171c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf    * are supported by the server are create.  For example, if the server
172c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf    * supports only 2 texture units, then only 2 texture coordinate arrays
173c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf    * are created.
1740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    *
175c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf    * At the very least, GL_VERTEX_ARRAY, GL_NORMAL_ARRAY,
176c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf    * GL_COLOR_ARRAY, GL_INDEX_ARRAY, GL_TEXTURE_COORD_ARRAY, and
177c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf    * GL_EDGE_FLAG_ARRAY are supported.
178c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf    */
179c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
180c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   array_count = 5;
181c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
182c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (__glExtensionBitIsEnabled(gc, GL_EXT_fog_coord_bit)
183c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf       || (gc->server_major > 1) || (gc->server_minor >= 4)) {
184c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      got_fog = GL_TRUE;
185c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      array_count++;
186c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
187c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
188c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (__glExtensionBitIsEnabled(gc, GL_EXT_secondary_color_bit)
189c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf       || (gc->server_major > 1) || (gc->server_minor >= 4)) {
190c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      got_secondary_color = GL_TRUE;
191c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      array_count++;
192c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
193c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
194c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (__glExtensionBitIsEnabled(gc, GL_ARB_multitexture_bit)
195c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf       || (gc->server_major > 1) || (gc->server_minor >= 3)) {
196c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __indirect_glGetIntegerv(GL_MAX_TEXTURE_UNITS, &texture_units);
197c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
198c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
199c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (__glExtensionBitIsEnabled(gc, GL_ARB_vertex_program_bit)) {
200c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __indirect_glGetProgramivARB(GL_VERTEX_PROGRAM_ARB,
201c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                   GL_MAX_PROGRAM_ATTRIBS_ARB,
202c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                   &vertex_program_attribs);
203c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
204c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
205c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->num_texture_units = texture_units;
206c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->num_vertex_program_attribs = vertex_program_attribs;
207c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   array_count += texture_units + vertex_program_attribs;
208c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->num_arrays = array_count;
209c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays = calloc(array_count, sizeof(struct array_state));
210c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
211c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[0].data_type = GL_FLOAT;
212c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[0].count = 3;
213c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[0].key = GL_NORMAL_ARRAY;
214c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[0].normalized = GL_TRUE;
215c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[0].old_DrawArrays_possible = GL_TRUE;
216c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
217c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[1].data_type = GL_FLOAT;
218c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[1].count = 4;
219c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[1].key = GL_COLOR_ARRAY;
220c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[1].normalized = GL_TRUE;
221c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[1].old_DrawArrays_possible = GL_TRUE;
222c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
223c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[2].data_type = GL_FLOAT;
224c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[2].count = 1;
225c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[2].key = GL_INDEX_ARRAY;
226c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[2].old_DrawArrays_possible = GL_TRUE;
227c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
228c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[3].data_type = GL_UNSIGNED_BYTE;
229c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[3].count = 1;
230c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[3].key = GL_EDGE_FLAG_ARRAY;
231c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[3].old_DrawArrays_possible = GL_TRUE;
232c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
233c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   for (i = 0; i < texture_units; i++) {
234c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[4 + i].data_type = GL_FLOAT;
235c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[4 + i].count = 4;
236c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[4 + i].key = GL_TEXTURE_COORD_ARRAY;
237c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
238c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[4 + i].old_DrawArrays_possible = (i == 0);
239c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[4 + i].index = i;
240c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
241c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[4 + i].header[1] = i + GL_TEXTURE0;
242c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
243c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
244c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   i = 4 + texture_units;
245c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
246c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (got_fog) {
247c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[i].data_type = GL_FLOAT;
248c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[i].count = 1;
249c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[i].key = GL_FOG_COORDINATE_ARRAY;
250c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[i].old_DrawArrays_possible = GL_TRUE;
251c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      i++;
252c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
253c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
254c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (got_secondary_color) {
255c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[i].data_type = GL_FLOAT;
256c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[i].count = 3;
257c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[i].key = GL_SECONDARY_COLOR_ARRAY;
258c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[i].old_DrawArrays_possible = GL_TRUE;
259c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[i].normalized = GL_TRUE;
260c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      i++;
261c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
262c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
263c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
264c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   for (j = 0; j < vertex_program_attribs; j++) {
265c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      const unsigned idx = (vertex_program_attribs - (j + 1));
266c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
267c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
268c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[idx + i].data_type = GL_FLOAT;
269c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[idx + i].count = 4;
270c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[idx + i].key = GL_VERTEX_ATTRIB_ARRAY_POINTER;
271c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
272c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[idx + i].old_DrawArrays_possible = 0;
273c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[idx + i].index = idx;
274c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
275c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[idx + i].header[1] = idx;
276c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
277c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
278c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   i += vertex_program_attribs;
279c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
280c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
281c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   /* Vertex array *must* be last becuase of the way that
282c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf    * emit_DrawArrays_none works.
283c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf    */
284c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
285c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[i].data_type = GL_FLOAT;
286c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[i].count = 4;
287c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[i].key = GL_VERTEX_ARRAY;
288c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->arrays[i].old_DrawArrays_possible = GL_TRUE;
289c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
290c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   assert((i + 1) == arrays->num_arrays);
291c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
292c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->stack_index = 0;
293c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->stack = malloc(sizeof(struct array_stack_state)
29483f1183e769777df5ada4bf7add3390881f88d02Markus Fleschutz                          * arrays->num_arrays
29583f1183e769777df5ada4bf7add3390881f88d02Markus Fleschutz                          * __GL_CLIENT_ATTRIB_STACK_DEPTH);
296fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
297fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
298fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
299fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick/**
300fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * Calculate the size of a single vertex for the "none" protocol.  This is
301fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * essentially the size of all the immediate-mode commands required to
302fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * implement the enabled vertex arrays.
303fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick */
304fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanickstatic size_t
305c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófcalculate_single_vertex_size_none(const struct array_state_vector *arrays)
306fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
307c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   size_t single_vertex_size = 0;
308c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned i;
309fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
310fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
311c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   for (i = 0; i < arrays->num_arrays; i++) {
312c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if (arrays->arrays[i].enabled) {
313c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         single_vertex_size += ((uint16_t *) arrays->arrays[i].header)[0];
314c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
315c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
316c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
317c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   return single_vertex_size;
318fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
319fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
320fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
321fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick/**
322fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * Emit a single element using non-DrawArrays protocol.
323fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick */
324fdb07636f2e6324c5250cd5ee97778b7f5933beaIan RomanickGLubyte *
325c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófemit_element_none(GLubyte * dst,
326c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                  const struct array_state_vector * arrays, unsigned index)
327fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
328c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned i;
329fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
330fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
331c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   for (i = 0; i < arrays->num_arrays; i++) {
332c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if (arrays->arrays[i].enabled) {
333c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         const size_t offset = index * arrays->arrays[i].true_stride;
334fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
335c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         /* The generic attributes can have more data than is in the
336c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf          * elements.  This is because a vertex array can be a 2 element,
337c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf          * normalized, unsigned short, but the "closest" immediate mode
338c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf          * protocol is for a 4Nus.  Since the sizes are small, the
339c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf          * performance impact on modern processors should be negligible.
340c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf          */
341c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         (void) memset(dst, 0, ((uint16_t *) arrays->arrays[i].header)[0]);
34240af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
343c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         (void) memcpy(dst, arrays->arrays[i].header,
344c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                       arrays->arrays[i].header_size);
345fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
346c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         dst += arrays->arrays[i].header_size;
347fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
348c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         (void) memcpy(dst, ((GLubyte *) arrays->arrays[i].data) + offset,
349c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                       arrays->arrays[i].element_size);
350fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
351c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         dst += __GLX_PAD(arrays->arrays[i].element_size);
352c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
353c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
354fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
355c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   return dst;
356fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
357fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
358fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
359fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick/**
360fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * Emit a single element using "old" DrawArrays protocol from
361fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * EXT_vertex_arrays / OpenGL 1.1.
362fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick */
363fdb07636f2e6324c5250cd5ee97778b7f5933beaIan RomanickGLubyte *
364c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófemit_element_old(GLubyte * dst,
365c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                 const struct array_state_vector * arrays, unsigned index)
366fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
367c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned i;
368fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
369fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
370c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   for (i = 0; i < arrays->num_arrays; i++) {
371c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if (arrays->arrays[i].enabled) {
372c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         const size_t offset = index * arrays->arrays[i].true_stride;
373fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
374c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         (void) memcpy(dst, ((GLubyte *) arrays->arrays[i].data) + offset,
375c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                       arrays->arrays[i].element_size);
376fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
377c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         dst += __GLX_PAD(arrays->arrays[i].element_size);
378c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
379c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
380fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
381c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   return dst;
382fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
383fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
384fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
385fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanickstruct array_state *
386c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófget_array_entry(const struct array_state_vector *arrays,
387c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                GLenum key, unsigned index)
388fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
389c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned i;
390c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
391c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   for (i = 0; i < arrays->num_arrays; i++) {
392c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if ((arrays->arrays[i].key == key)
393c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf          && (arrays->arrays[i].index == index)) {
394c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         return &arrays->arrays[i];
395c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
396c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
397c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
398c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   return NULL;
399fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
400fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
401fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
402fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanickstatic GLboolean
403c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófallocate_array_info_cache(struct array_state_vector *arrays,
404c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                          size_t required_size)
405fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
406979f35fb78f39cec5de53795ce91f674bfb9df52Ian Romanick#define MAX_HEADER_SIZE 20
407c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (arrays->array_info_cache_buffer_size < required_size) {
408c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      GLubyte *temp = realloc(arrays->array_info_cache_base,
409c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                              required_size + MAX_HEADER_SIZE);
410fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
411c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if (temp == NULL) {
412c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         return GL_FALSE;
413c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
414fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
415c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->array_info_cache_base = temp;
416c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->array_info_cache = temp + MAX_HEADER_SIZE;
417c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->array_info_cache_buffer_size = required_size;
418c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
419fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
420c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->array_info_cache_size = required_size;
421c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   return GL_TRUE;
422fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
423fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
424fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
425fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick/**
426fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick */
427fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanickvoid
428c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóffill_array_info_cache(struct array_state_vector *arrays)
429fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
430c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   GLboolean old_DrawArrays_possible;
431c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned i;
432c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
433c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
434c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   /* Determine how many arrays are enabled.
435c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf    */
436c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
437c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->enabled_client_array_count = 0;
438c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   old_DrawArrays_possible = arrays->old_DrawArrays_possible;
439c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   for (i = 0; i < arrays->num_arrays; i++) {
440c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if (arrays->arrays[i].enabled) {
441c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         arrays->enabled_client_array_count++;
442c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         old_DrawArrays_possible &= arrays->arrays[i].old_DrawArrays_possible;
443c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
444c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
445c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
446c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (arrays->new_DrawArrays_possible) {
447c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      assert(!arrays->new_DrawArrays_possible);
448c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
449c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   else if (old_DrawArrays_possible) {
450c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      const size_t required_size = arrays->enabled_client_array_count * 12;
451c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      uint32_t *info;
452c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
453c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
454c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if (!allocate_array_info_cache(arrays, required_size)) {
455c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         return;
456c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
457c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
458c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
459c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      info = (uint32_t *) arrays->array_info_cache;
460c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      for (i = 0; i < arrays->num_arrays; i++) {
461c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         if (arrays->arrays[i].enabled) {
462c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf            *(info++) = arrays->arrays[i].data_type;
463c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf            *(info++) = arrays->arrays[i].count;
464c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf            *(info++) = arrays->arrays[i].key;
465c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         }
466c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
467c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
468c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->DrawArrays = emit_DrawArrays_old;
469c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->DrawElements = emit_DrawElements_old;
470c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
471c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   else {
472c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->DrawArrays = emit_DrawArrays_none;
473c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->DrawElements = emit_DrawElements_none;
474c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
475c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
476c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->array_info_cache_valid = GL_TRUE;
477fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
478fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
479fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
480fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick/**
481fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * Emit a \c glDrawArrays command using the "none" protocol.  That is,
482fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * emit immediate-mode commands that are equivalent to the requiested
483fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * \c glDrawArrays command.  This is used with servers that don't support
484fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * the OpenGL 1.1 / EXT_vertex_arrays DrawArrays protocol or in cases where
485fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * vertex state is enabled that is not compatible with that protocol.
486fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick */
487fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanickvoid
488c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófemit_DrawArrays_none(GLenum mode, GLint first, GLsizei count)
489fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
490c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
491c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const __GLXattribute *state =
492c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      (const __GLXattribute *) (gc->client_state_private);
493c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
494fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
495c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   size_t single_vertex_size;
496c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   GLubyte *pc;
497c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned i;
498c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t begin_cmd[2] = { 8, X_GLrop_Begin };
499c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t end_cmd[2] = { 4, X_GLrop_End };
500fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
501fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
502c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   single_vertex_size = calculate_single_vertex_size_none(arrays);
503fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
504c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   pc = gc->pc;
505fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
506c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   (void) memcpy(pc, begin_cmd, 4);
507c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   *(int *) (pc + 4) = mode;
508fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
509c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   pc += 8;
510fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
511c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   for (i = 0; i < count; i++) {
512c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if ((pc + single_vertex_size) >= gc->bufEnd) {
513c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         pc = __glXFlushRenderBuffer(gc, pc);
514c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
515fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
516c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      pc = emit_element_none(pc, arrays, first + i);
517c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
518fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
519c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if ((pc + 4) >= gc->bufEnd) {
520c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      pc = __glXFlushRenderBuffer(gc, pc);
521c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
522fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
523c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   (void) memcpy(pc, end_cmd, 4);
524c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   pc += 4;
525fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
526c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   gc->pc = pc;
527c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (gc->pc > gc->limit) {
528c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      (void) __glXFlushRenderBuffer(gc, gc->pc);
529c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
530fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
531fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
532fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
533fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick/**
534fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * Emit the header data for the GL 1.1 / EXT_vertex_arrays DrawArrays
535fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * protocol.
5360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
537fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * \param gc                    GLX context.
538fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * \param arrays                Array state.
539fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * \param elements_per_request  Location to store the number of elements that
540fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick *                              can fit in a single Render / RenderLarge
541fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick *                              command.
542fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * \param total_request         Total number of requests for a RenderLarge
543fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick *                              command.  If a Render command is used, this
544fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick *                              will be zero.
545fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * \param mode                  Drawing mode.
546fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * \param count                 Number of vertices.
5470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
548fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * \returns
549fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * A pointer to the buffer for array data.
550fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick */
551fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanickstatic GLubyte *
552c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergemit_DrawArrays_header_old(struct glx_context * gc,
553c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                           struct array_state_vector *arrays,
554c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                           size_t * elements_per_request,
555c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                           unsigned int *total_requests,
556c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                           GLenum mode, GLsizei count)
557fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
558c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   size_t command_size;
559c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   size_t single_vertex_size;
560c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const unsigned header_size = 16;
561c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned i;
562c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   GLubyte *pc;
563c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
564c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
565c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   /* Determine the size of the whole command.  This includes the header,
566c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf    * the ARRAY_INFO data and the array data.  Once this size is calculated,
567c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf    * it will be known whether a Render or RenderLarge command is needed.
568c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf    */
569c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
570c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   single_vertex_size = 0;
571c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   for (i = 0; i < arrays->num_arrays; i++) {
572c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if (arrays->arrays[i].enabled) {
573c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         single_vertex_size += __GLX_PAD(arrays->arrays[i].element_size);
574c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
575c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
576c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
577c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   command_size = arrays->array_info_cache_size + header_size
578fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick      + (single_vertex_size * count);
579fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
580fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
581c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   /* Write the header for either a Render command or a RenderLarge
582c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf    * command.  After the header is written, write the ARRAY_INFO data.
583c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf    */
584c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
585c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (command_size > gc->maxSmallRenderCommandSize) {
586c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      /* maxSize is the maximum amount of data can be stuffed into a single
587c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf       * packet.  sz_xGLXRenderReq is added because bufSize is the maximum
588c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf       * packet size minus sz_xGLXRenderReq.
589c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf       */
590c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      const size_t maxSize = (gc->bufSize + sz_xGLXRenderReq)
591c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         - sz_xGLXRenderLargeReq;
592c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      unsigned vertex_requests;
593fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
594fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
595c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      /* Calculate the number of data packets that will be required to send
596c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf       * the whole command.  To do this, the number of verticies that
597c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf       * will fit in a single buffer must be calculated.
5980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       *
599c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf       * The important value here is elements_per_request.  This is the
600c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf       * number of complete array elements that will fit in a single
601c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf       * buffer.  There may be some wasted space at the end of the buffer,
602c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf       * but splitting elements across buffer boundries would be painful.
603c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf       */
604fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
605c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      elements_per_request[0] = maxSize / single_vertex_size;
606fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
607c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      vertex_requests = (count + elements_per_request[0] - 1)
608c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         / elements_per_request[0];
609fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
610c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      *total_requests = vertex_requests + 1;
611fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
612fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
613c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXFlushRenderBuffer(gc, gc->pc);
614fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
615c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      command_size += 4;
616fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
617c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      pc = ((GLubyte *) arrays->array_info_cache) - (header_size + 4);
618c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      *(uint32_t *) (pc + 0) = command_size;
619c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      *(uint32_t *) (pc + 4) = X_GLrop_DrawArrays;
620c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      *(uint32_t *) (pc + 8) = count;
621c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      *(uint32_t *) (pc + 12) = arrays->enabled_client_array_count;
622c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      *(uint32_t *) (pc + 16) = mode;
623fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
624c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSendLargeChunk(gc, 1, *total_requests, pc,
625c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                          header_size + 4 + arrays->array_info_cache_size);
626fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
627c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      pc = gc->pc;
628c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
629c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   else {
630c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if ((gc->pc + command_size) >= gc->bufEnd) {
631c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         (void) __glXFlushRenderBuffer(gc, gc->pc);
632c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
633fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
634c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      pc = gc->pc;
635c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      *(uint16_t *) (pc + 0) = command_size;
636c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      *(uint16_t *) (pc + 2) = X_GLrop_DrawArrays;
637c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      *(uint32_t *) (pc + 4) = count;
638c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      *(uint32_t *) (pc + 8) = arrays->enabled_client_array_count;
639c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      *(uint32_t *) (pc + 12) = mode;
640fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
641c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      pc += header_size;
642fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
643c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      (void) memcpy(pc, arrays->array_info_cache,
644c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                    arrays->array_info_cache_size);
645c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      pc += arrays->array_info_cache_size;
646b81efaaa1ac8676a1092e4354079ffcbe7960af2Ian Romanick
647c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      *elements_per_request = count;
648c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      *total_requests = 0;
649c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
650fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
651fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
652c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   return pc;
653fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
654fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
655fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
656fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick/**
657fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick */
658fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanickvoid
659c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófemit_DrawArrays_old(GLenum mode, GLint first, GLsizei count)
660fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
661c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
662c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const __GLXattribute *state =
663c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      (const __GLXattribute *) (gc->client_state_private);
664c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
665fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
666c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   GLubyte *pc;
667c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   size_t elements_per_request;
668c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned total_requests = 0;
669c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned i;
670c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   size_t total_sent = 0;
671fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
672fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
673c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   pc = emit_DrawArrays_header_old(gc, arrays, &elements_per_request,
674c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                   &total_requests, mode, count);
675fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
676fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
677c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   /* Write the arrays.
678c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf    */
679fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
680c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (total_requests == 0) {
681c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      assert(elements_per_request >= count);
682fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
683c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      for (i = 0; i < count; i++) {
684c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         pc = emit_element_old(pc, arrays, i + first);
685c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
686fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
687c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      assert(pc <= gc->bufEnd);
688fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
689c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      gc->pc = pc;
690c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if (gc->pc > gc->limit) {
691c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         (void) __glXFlushRenderBuffer(gc, gc->pc);
692c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
693c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
694c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   else {
695c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      unsigned req;
696fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
697fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
698c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      for (req = 2; req <= total_requests; req++) {
699c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         if (count < elements_per_request) {
700c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf            elements_per_request = count;
701c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         }
702fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
703c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         pc = gc->pc;
704c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         for (i = 0; i < elements_per_request; i++) {
705c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf            pc = emit_element_old(pc, arrays, i + first);
706c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         }
707fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
708c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         first += elements_per_request;
709fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
710c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         total_sent += (size_t) (pc - gc->pc);
711c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         __glXSendLargeChunk(gc, req, total_requests, gc->pc, pc - gc->pc);
712c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
713c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         count -= elements_per_request;
714c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
715c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
716fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
717fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
718fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
719fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanickvoid
720c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófemit_DrawElements_none(GLenum mode, GLsizei count, GLenum type,
721c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                       const GLvoid * indices)
722fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
723c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
724c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const __GLXattribute *state =
725c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      (const __GLXattribute *) (gc->client_state_private);
726c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
727c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t begin_cmd[2] = { 8, X_GLrop_Begin };
728c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t end_cmd[2] = { 4, X_GLrop_End };
729fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
730c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   GLubyte *pc;
731c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   size_t single_vertex_size;
732c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned i;
733fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
734fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
735c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   single_vertex_size = calculate_single_vertex_size_none(arrays);
736fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
737fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
738c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if ((gc->pc + single_vertex_size) >= gc->bufEnd) {
739c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      gc->pc = __glXFlushRenderBuffer(gc, gc->pc);
740c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
741fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
742c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   pc = gc->pc;
743fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
744c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   (void) memcpy(pc, begin_cmd, 4);
745c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   *(int *) (pc + 4) = mode;
746fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
747c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   pc += 8;
748fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
749c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   for (i = 0; i < count; i++) {
750c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      unsigned index = 0;
751fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
752c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if ((pc + single_vertex_size) >= gc->bufEnd) {
753c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         pc = __glXFlushRenderBuffer(gc, pc);
754c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
755fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
756c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      switch (type) {
757c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_UNSIGNED_INT:
758c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         index = (unsigned) (((GLuint *) indices)[i]);
759c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
760c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_UNSIGNED_SHORT:
761c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         index = (unsigned) (((GLushort *) indices)[i]);
762c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
763c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_UNSIGNED_BYTE:
764c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         index = (unsigned) (((GLubyte *) indices)[i]);
765c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
766c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
767c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      pc = emit_element_none(pc, arrays, index);
768c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
769fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
770c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if ((pc + 4) >= gc->bufEnd) {
771c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      pc = __glXFlushRenderBuffer(gc, pc);
772c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
773fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
774c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   (void) memcpy(pc, end_cmd, 4);
775c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   pc += 4;
776fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
777c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   gc->pc = pc;
778c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (gc->pc > gc->limit) {
779c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      (void) __glXFlushRenderBuffer(gc, gc->pc);
780c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
781fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
782fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
783fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
784fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick/**
785fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick */
786fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanickvoid
787c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófemit_DrawElements_old(GLenum mode, GLsizei count, GLenum type,
788c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                      const GLvoid * indices)
789fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
790c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
791c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const __GLXattribute *state =
792c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      (const __GLXattribute *) (gc->client_state_private);
793c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
794c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
795c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   GLubyte *pc;
796c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   size_t elements_per_request;
797c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned total_requests = 0;
798c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned i;
799c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned req;
800c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned req_element = 0;
801c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
802c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
803c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   pc = emit_DrawArrays_header_old(gc, arrays, &elements_per_request,
804c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                   &total_requests, mode, count);
805c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
806c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
807c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   /* Write the arrays.
808c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf    */
809c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
810c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   req = 2;
811c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   while (count > 0) {
812c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if (count < elements_per_request) {
813c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         elements_per_request = count;
814c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
815c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
816c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      switch (type) {
817c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_UNSIGNED_INT:{
818c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf            const GLuint *ui_ptr = (const GLuint *) indices + req_element;
819c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
820c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf            for (i = 0; i < elements_per_request; i++) {
821c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf               const GLint index = (GLint) * (ui_ptr++);
822c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf               pc = emit_element_old(pc, arrays, index);
823c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf            }
824c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf            break;
825c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         }
826c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_UNSIGNED_SHORT:{
827c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf            const GLushort *us_ptr = (const GLushort *) indices + req_element;
828c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
829c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf            for (i = 0; i < elements_per_request; i++) {
830c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf               const GLint index = (GLint) * (us_ptr++);
831c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf               pc = emit_element_old(pc, arrays, index);
832c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf            }
833c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf            break;
834c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         }
835c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_UNSIGNED_BYTE:{
836c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf            const GLubyte *ub_ptr = (const GLubyte *) indices + req_element;
837c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
838c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf            for (i = 0; i < elements_per_request; i++) {
839c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf               const GLint index = (GLint) * (ub_ptr++);
840c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf               pc = emit_element_old(pc, arrays, index);
841c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf            }
842c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf            break;
843c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         }
844c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
845c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
846c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if (total_requests != 0) {
847c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         __glXSendLargeChunk(gc, req, total_requests, gc->pc, pc - gc->pc);
848c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         pc = gc->pc;
849c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         req++;
850c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
851c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
852c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      count -= elements_per_request;
853c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      req_element += elements_per_request;
854c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
855c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
856c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
857c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   assert((total_requests == 0) || ((req - 1) == total_requests));
858c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
859c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (total_requests == 0) {
860c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      assert(pc <= gc->bufEnd);
861c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
862c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      gc->pc = pc;
863c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if (gc->pc > gc->limit) {
864c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         (void) __glXFlushRenderBuffer(gc, gc->pc);
865c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
866c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
867fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
868fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
869fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
870fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick/**
871fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * Validate that the \c mode parameter to \c glDrawArrays, et. al. is valid.
872fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * If it is not valid, then an error code is set in the GLX context.
8730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
874fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * \returns
875fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * \c GL_TRUE if the argument is valid, \c GL_FALSE if is not.
876fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick */
877fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanickstatic GLboolean
878c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergvalidate_mode(struct glx_context * gc, GLenum mode)
879fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
880c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   switch (mode) {
881c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_POINTS:
882c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_LINE_STRIP:
883c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_LINE_LOOP:
884c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_LINES:
885c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_TRIANGLE_STRIP:
886c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_TRIANGLE_FAN:
887c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_TRIANGLES:
888c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_QUAD_STRIP:
889c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_QUADS:
890c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_POLYGON:
891c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
892c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   default:
893c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_ENUM);
894c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return GL_FALSE;
895c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
896c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
897c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   return GL_TRUE;
898fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
899fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
900fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
901fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick/**
902fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * Validate that the \c count parameter to \c glDrawArrays, et. al. is valid.
903fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * A value less than zero is invalid and will result in \c GL_INVALID_VALUE
904fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * being set.  A value of zero will not result in an error being set, but
905fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * will result in \c GL_FALSE being returned.
9060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
907fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * \returns
908fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick * \c GL_TRUE if the argument is valid, \c GL_FALSE if it is not.
909fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick */
910fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanickstatic GLboolean
911c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergvalidate_count(struct glx_context * gc, GLsizei count)
912fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
913c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (count < 0) {
914c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_VALUE);
915c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
916fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
917c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   return (count > 0);
918fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
919fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
920fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
92103dc437363429d275b7f8cae74201a8e7993a52bIan Romanick/**
92203dc437363429d275b7f8cae74201a8e7993a52bIan Romanick * Validate that the \c type parameter to \c glDrawElements, et. al. is
92303dc437363429d275b7f8cae74201a8e7993a52bIan Romanick * valid.  Only \c GL_UNSIGNED_BYTE, \c GL_UNSIGNED_SHORT, and
92403dc437363429d275b7f8cae74201a8e7993a52bIan Romanick * \c GL_UNSIGNED_INT are valid.
92503dc437363429d275b7f8cae74201a8e7993a52bIan Romanick *
92603dc437363429d275b7f8cae74201a8e7993a52bIan Romanick * \returns
92703dc437363429d275b7f8cae74201a8e7993a52bIan Romanick * \c GL_TRUE if the argument is valid, \c GL_FALSE if it is not.
92803dc437363429d275b7f8cae74201a8e7993a52bIan Romanick */
929c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófstatic GLboolean
930c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergvalidate_type(struct glx_context * gc, GLenum type)
93103dc437363429d275b7f8cae74201a8e7993a52bIan Romanick{
932c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   switch (type) {
933c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_UNSIGNED_INT:
934c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_UNSIGNED_SHORT:
935c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_UNSIGNED_BYTE:
936c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return GL_TRUE;
937c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   default:
938c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_ENUM);
939c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return GL_FALSE;
940c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
94103dc437363429d275b7f8cae74201a8e7993a52bIan Romanick}
94203dc437363429d275b7f8cae74201a8e7993a52bIan Romanick
94303dc437363429d275b7f8cae74201a8e7993a52bIan Romanick
944c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófvoid
945c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__indirect_glDrawArrays(GLenum mode, GLint first, GLsizei count)
946fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
947c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
948c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const __GLXattribute *state =
949c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      (const __GLXattribute *) (gc->client_state_private);
950c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
951c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
952c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
953c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (validate_mode(gc, mode) && validate_count(gc, count)) {
954c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if (!arrays->array_info_cache_valid) {
955c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         fill_array_info_cache(arrays);
956c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
957c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
958c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->DrawArrays(mode, first, count);
959c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
960fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
961fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
962fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
963c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófvoid
964c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__indirect_glArrayElement(GLint index)
965fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
966c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
967c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const __GLXattribute *state =
968c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      (const __GLXattribute *) (gc->client_state_private);
969c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
970fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
971c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   size_t single_vertex_size;
972fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
973fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
974c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   single_vertex_size = calculate_single_vertex_size_none(arrays);
975fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
976c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if ((gc->pc + single_vertex_size) >= gc->bufEnd) {
977c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      gc->pc = __glXFlushRenderBuffer(gc, gc->pc);
978c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
979fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
980c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   gc->pc = emit_element_none(gc->pc, arrays, index);
981fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
982c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (gc->pc > gc->limit) {
983c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      (void) __glXFlushRenderBuffer(gc, gc->pc);
984c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
985fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
986fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
987fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
988c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófvoid
989c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__indirect_glDrawElements(GLenum mode, GLsizei count, GLenum type,
990c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                          const GLvoid * indices)
991fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
992c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
993c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const __GLXattribute *state =
994c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      (const __GLXattribute *) (gc->client_state_private);
995c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
996fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
997fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
998c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (validate_mode(gc, mode) && validate_count(gc, count)
999c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf       && validate_type(gc, type)) {
1000c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if (!arrays->array_info_cache_valid) {
1001c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         fill_array_info_cache(arrays);
1002c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
1003fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1004c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->DrawElements(mode, count, type, indices);
1005c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1006fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1007fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1008fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1009c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófvoid
1010c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__indirect_glDrawRangeElements(GLenum mode, GLuint start, GLuint end,
1011c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                               GLsizei count, GLenum type,
1012c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                               const GLvoid * indices)
1013fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1014c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
1015c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const __GLXattribute *state =
1016c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      (const __GLXattribute *) (gc->client_state_private);
1017c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
1018fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1019fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1020c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (validate_mode(gc, mode) && validate_count(gc, count)
1021c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf       && validate_type(gc, type)) {
1022c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if (end < start) {
1023c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         __glXSetError(gc, GL_INVALID_VALUE);
1024c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         return;
1025c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
1026fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1027c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if (!arrays->array_info_cache_valid) {
1028c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         fill_array_info_cache(arrays);
1029c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
1030fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1031c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->DrawElements(mode, count, type, indices);
1032c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1033fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1034fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1035fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1036c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófvoid
10374cd751bcc48798f19b089f6cff58bfca2f18fe36Brian Paul__indirect_glMultiDrawArraysEXT(GLenum mode, const GLint *first,
10384cd751bcc48798f19b089f6cff58bfca2f18fe36Brian Paul                                const GLsizei *count, GLsizei primcount)
1039fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1040c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
1041c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const __GLXattribute *state =
1042c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      (const __GLXattribute *) (gc->client_state_private);
1043c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
1044c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   GLsizei i;
1045c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1046c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1047c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (validate_mode(gc, mode)) {
1048c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if (!arrays->array_info_cache_valid) {
1049c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         fill_array_info_cache(arrays);
1050c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
1051c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1052c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      for (i = 0; i < primcount; i++) {
1053c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         if (validate_count(gc, count[i])) {
1054c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf            arrays->DrawArrays(mode, first[i], count[i]);
1055c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         }
1056c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
1057c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1058fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1059fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1060fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1061c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófvoid
1062c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__indirect_glMultiDrawElementsEXT(GLenum mode, const GLsizei * count,
1063c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                  GLenum type, const GLvoid ** indices,
1064c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                  GLsizei primcount)
1065fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1066c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
1067c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const __GLXattribute *state =
1068c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      (const __GLXattribute *) (gc->client_state_private);
1069c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
1070c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   GLsizei i;
1071c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1072c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1073c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (validate_mode(gc, mode) && validate_type(gc, type)) {
1074c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if (!arrays->array_info_cache_valid) {
1075c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         fill_array_info_cache(arrays);
1076c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
1077c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1078c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      for (i = 0; i < primcount; i++) {
1079c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         if (validate_count(gc, count[i])) {
1080c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf            arrays->DrawElements(mode, count[i], type, indices[i]);
1081c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         }
1082c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
1083c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1084fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1085fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1086fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1087b81efaaa1ac8676a1092e4354079ffcbe7960af2Ian Romanick#define COMMON_ARRAY_DATA_INIT(a, PTR, TYPE, STRIDE, COUNT, NORMALIZED, HDR_SIZE, OPCODE) \
10880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  do {                                                                  \
10890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    (a)->data = PTR;                                                    \
10900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    (a)->data_type = TYPE;                                              \
10910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    (a)->user_stride = STRIDE;                                          \
10920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    (a)->count = COUNT;                                                 \
10930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    (a)->normalized = NORMALIZED;                                       \
10940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                                                        \
10950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    (a)->element_size = __glXTypeSize( TYPE ) * COUNT;                  \
10960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    (a)->true_stride = (STRIDE == 0)                                    \
10970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      ? (a)->element_size : STRIDE;                                     \
10980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                                                        \
10990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    (a)->header_size = HDR_SIZE;                                        \
11000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    ((uint16_t *) (a)->header)[0] = __GLX_PAD((a)->header_size + (a)->element_size); \
11010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    ((uint16_t *) (a)->header)[1] = OPCODE;                             \
11020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  } while(0)
1103fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1104fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1105c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófvoid
1106c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__indirect_glVertexPointer(GLint size, GLenum type, GLsizei stride,
1107c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                           const GLvoid * pointer)
1108fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1109c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t short_ops[5] = {
1110c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      0, 0, X_GLrop_Vertex2sv, X_GLrop_Vertex3sv, X_GLrop_Vertex4sv
1111c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   };
1112c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t int_ops[5] = {
1113c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      0, 0, X_GLrop_Vertex2iv, X_GLrop_Vertex3iv, X_GLrop_Vertex4iv
1114c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   };
1115c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t float_ops[5] = {
1116c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      0, 0, X_GLrop_Vertex2fv, X_GLrop_Vertex3fv, X_GLrop_Vertex4fv
1117c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   };
1118c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t double_ops[5] = {
1119c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      0, 0, X_GLrop_Vertex2dv, X_GLrop_Vertex3dv, X_GLrop_Vertex4dv
1120c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   };
1121c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   uint16_t opcode;
1122c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
1123c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
1124c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
1125c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state *a;
1126c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1127c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1128c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (size < 2 || size > 4 || stride < 0) {
1129c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_VALUE);
1130c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return;
1131c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1132c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1133c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   switch (type) {
1134c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_SHORT:
1135c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = short_ops[size];
1136c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1137c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_INT:
1138c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = int_ops[size];
1139c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1140c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_FLOAT:
1141c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = float_ops[size];
1142c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1143c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_DOUBLE:
1144c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = double_ops[size];
1145c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1146c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   default:
1147c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_ENUM);
1148c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return;
1149c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1150c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1151c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   a = get_array_entry(arrays, GL_VERTEX_ARRAY, 0);
1152c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   assert(a != NULL);
1153c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   COMMON_ARRAY_DATA_INIT(a, pointer, type, stride, size, GL_FALSE, 4,
1154c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                          opcode);
1155c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1156c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (a->enabled) {
1157c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->array_info_cache_valid = GL_FALSE;
1158c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1159fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1160fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1161fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1162c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófvoid
1163c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__indirect_glNormalPointer(GLenum type, GLsizei stride,
1164c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                           const GLvoid * pointer)
1165fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1166c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   uint16_t opcode;
1167c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
1168c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
1169c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
1170c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state *a;
1171c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1172c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1173c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (stride < 0) {
1174c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_VALUE);
1175c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return;
1176c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1177c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1178c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   switch (type) {
1179c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_BYTE:
1180c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = X_GLrop_Normal3bv;
1181c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1182c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_SHORT:
1183c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = X_GLrop_Normal3sv;
1184c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1185c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_INT:
1186c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = X_GLrop_Normal3iv;
1187c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1188c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_FLOAT:
1189c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = X_GLrop_Normal3fv;
1190c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1191c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_DOUBLE:
1192c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = X_GLrop_Normal3dv;
1193c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1194c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   default:
1195c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_ENUM);
1196c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return;
1197c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1198c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1199c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   a = get_array_entry(arrays, GL_NORMAL_ARRAY, 0);
1200c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   assert(a != NULL);
1201c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   COMMON_ARRAY_DATA_INIT(a, pointer, type, stride, 3, GL_TRUE, 4, opcode);
1202c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1203c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (a->enabled) {
1204c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->array_info_cache_valid = GL_FALSE;
1205c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1206fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1207fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1208fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1209c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófvoid
1210c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__indirect_glColorPointer(GLint size, GLenum type, GLsizei stride,
1211c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                          const GLvoid * pointer)
1212fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1213c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t byte_ops[5] = {
1214c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      0, 0, 0, X_GLrop_Color3bv, X_GLrop_Color4bv
1215c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   };
1216c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t ubyte_ops[5] = {
1217c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      0, 0, 0, X_GLrop_Color3ubv, X_GLrop_Color4ubv
1218c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   };
1219c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t short_ops[5] = {
1220c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      0, 0, 0, X_GLrop_Color3sv, X_GLrop_Color4sv
1221c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   };
1222c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t ushort_ops[5] = {
1223c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      0, 0, 0, X_GLrop_Color3usv, X_GLrop_Color4usv
1224c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   };
1225c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t int_ops[5] = {
1226c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      0, 0, 0, X_GLrop_Color3iv, X_GLrop_Color4iv
1227c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   };
1228c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t uint_ops[5] = {
1229c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      0, 0, 0, X_GLrop_Color3uiv, X_GLrop_Color4uiv
1230c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   };
1231c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t float_ops[5] = {
1232c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      0, 0, 0, X_GLrop_Color3fv, X_GLrop_Color4fv
1233c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   };
1234c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t double_ops[5] = {
1235c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      0, 0, 0, X_GLrop_Color3dv, X_GLrop_Color4dv
1236c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   };
1237c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   uint16_t opcode;
1238c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
1239c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
1240c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
1241c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state *a;
1242c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1243c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1244c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (size < 3 || size > 4 || stride < 0) {
1245c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_VALUE);
1246c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return;
1247c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1248c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1249c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   switch (type) {
1250c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_BYTE:
1251c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = byte_ops[size];
1252c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1253c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_UNSIGNED_BYTE:
1254c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = ubyte_ops[size];
1255c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1256c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_SHORT:
1257c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = short_ops[size];
1258c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1259c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_UNSIGNED_SHORT:
1260c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = ushort_ops[size];
1261c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1262c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_INT:
1263c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = int_ops[size];
1264c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1265c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_UNSIGNED_INT:
1266c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = uint_ops[size];
1267c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1268c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_FLOAT:
1269c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = float_ops[size];
1270c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1271c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_DOUBLE:
1272c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = double_ops[size];
1273c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1274c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   default:
1275c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_ENUM);
1276c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return;
1277c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1278c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1279c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   a = get_array_entry(arrays, GL_COLOR_ARRAY, 0);
1280c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   assert(a != NULL);
1281c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   COMMON_ARRAY_DATA_INIT(a, pointer, type, stride, size, GL_TRUE, 4, opcode);
1282c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1283c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (a->enabled) {
1284c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->array_info_cache_valid = GL_FALSE;
1285c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1286fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1287fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1288fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1289c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófvoid
1290c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__indirect_glIndexPointer(GLenum type, GLsizei stride, const GLvoid * pointer)
1291fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1292c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   uint16_t opcode;
1293c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
1294c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
1295c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
1296c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state *a;
1297c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1298c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1299c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (stride < 0) {
1300c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_VALUE);
1301c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return;
1302c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1303c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1304c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   switch (type) {
1305c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_UNSIGNED_BYTE:
1306c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = X_GLrop_Indexubv;
1307c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1308c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_SHORT:
1309c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = X_GLrop_Indexsv;
1310c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1311c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_INT:
1312c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = X_GLrop_Indexiv;
1313c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1314c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_FLOAT:
1315c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = X_GLrop_Indexfv;
1316c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1317c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_DOUBLE:
1318c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = X_GLrop_Indexdv;
1319c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1320c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   default:
1321c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_ENUM);
1322c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return;
1323c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1324c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1325c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   a = get_array_entry(arrays, GL_INDEX_ARRAY, 0);
1326c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   assert(a != NULL);
1327c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   COMMON_ARRAY_DATA_INIT(a, pointer, type, stride, 1, GL_FALSE, 4, opcode);
1328c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1329c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (a->enabled) {
1330c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->array_info_cache_valid = GL_FALSE;
1331c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1332fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1333fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1334fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1335c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófvoid
1336c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__indirect_glEdgeFlagPointer(GLsizei stride, const GLvoid * pointer)
1337fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1338c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
1339c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
1340c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
1341c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state *a;
1342c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1343c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1344c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (stride < 0) {
1345c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_VALUE);
1346c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return;
1347c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1348c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1349c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1350c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   a = get_array_entry(arrays, GL_EDGE_FLAG_ARRAY, 0);
1351c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   assert(a != NULL);
1352c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   COMMON_ARRAY_DATA_INIT(a, pointer, GL_UNSIGNED_BYTE, stride, 1, GL_FALSE,
1353c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                          4, X_GLrop_EdgeFlagv);
1354c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1355c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (a->enabled) {
1356c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->array_info_cache_valid = GL_FALSE;
1357c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1358fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1359fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1360fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1361c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófvoid
1362c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__indirect_glTexCoordPointer(GLint size, GLenum type, GLsizei stride,
1363c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                             const GLvoid * pointer)
1364fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1365c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t short_ops[5] = {
1366c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      0, X_GLrop_TexCoord1sv, X_GLrop_TexCoord2sv, X_GLrop_TexCoord3sv,
13670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      X_GLrop_TexCoord4sv
1368c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   };
1369c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t int_ops[5] = {
1370c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      0, X_GLrop_TexCoord1iv, X_GLrop_TexCoord2iv, X_GLrop_TexCoord3iv,
13710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      X_GLrop_TexCoord4iv
1372c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   };
1373c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t float_ops[5] = {
1374c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      0, X_GLrop_TexCoord1dv, X_GLrop_TexCoord2fv, X_GLrop_TexCoord3fv,
13750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      X_GLrop_TexCoord4fv
1376c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   };
1377c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t double_ops[5] = {
1378c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      0, X_GLrop_TexCoord1dv, X_GLrop_TexCoord2dv, X_GLrop_TexCoord3dv,
13790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      X_GLrop_TexCoord4dv
1380c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   };
1381c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1382c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t mshort_ops[5] = {
1383c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      0, X_GLrop_MultiTexCoord1svARB, X_GLrop_MultiTexCoord2svARB,
13840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      X_GLrop_MultiTexCoord3svARB, X_GLrop_MultiTexCoord4svARB
1385c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   };
1386c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t mint_ops[5] = {
1387c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      0, X_GLrop_MultiTexCoord1ivARB, X_GLrop_MultiTexCoord2ivARB,
13880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      X_GLrop_MultiTexCoord3ivARB, X_GLrop_MultiTexCoord4ivARB
1389c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   };
1390c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t mfloat_ops[5] = {
1391c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      0, X_GLrop_MultiTexCoord1dvARB, X_GLrop_MultiTexCoord2fvARB,
13920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      X_GLrop_MultiTexCoord3fvARB, X_GLrop_MultiTexCoord4fvARB
1393c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   };
1394c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t mdouble_ops[5] = {
1395c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      0, X_GLrop_MultiTexCoord1dvARB, X_GLrop_MultiTexCoord2dvARB,
13960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      X_GLrop_MultiTexCoord3dvARB, X_GLrop_MultiTexCoord4dvARB
1397c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   };
1398c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1399c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   uint16_t opcode;
1400c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
1401c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
1402c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
1403c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state *a;
1404c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned header_size;
1405c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned index;
1406c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1407c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1408c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (size < 1 || size > 4 || stride < 0) {
1409c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_VALUE);
1410c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return;
1411c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1412c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1413c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   index = arrays->active_texture_unit;
1414c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (index == 0) {
1415c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      switch (type) {
1416c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_SHORT:
1417c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = short_ops[size];
1418c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1419c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_INT:
1420c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = int_ops[size];
1421c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1422c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_FLOAT:
1423c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = float_ops[size];
1424c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1425c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_DOUBLE:
1426c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = double_ops[size];
1427c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1428c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      default:
1429c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         __glXSetError(gc, GL_INVALID_ENUM);
1430c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         return;
1431c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
1432c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1433c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      header_size = 4;
1434c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1435c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   else {
1436c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      switch (type) {
1437c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_SHORT:
1438c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = mshort_ops[size];
1439c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1440c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_INT:
1441c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = mint_ops[size];
1442c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1443c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_FLOAT:
1444c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = mfloat_ops[size];
1445c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1446c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_DOUBLE:
1447c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = mdouble_ops[size];
1448c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1449c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      default:
1450c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         __glXSetError(gc, GL_INVALID_ENUM);
1451c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         return;
1452c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
1453c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1454c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      header_size = 8;
1455c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1456c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1457c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   a = get_array_entry(arrays, GL_TEXTURE_COORD_ARRAY, index);
1458c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   assert(a != NULL);
1459c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   COMMON_ARRAY_DATA_INIT(a, pointer, type, stride, size, GL_FALSE,
1460c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                          header_size, opcode);
1461c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1462c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (a->enabled) {
1463c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->array_info_cache_valid = GL_FALSE;
1464c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1465fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1466fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1467fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1468c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófvoid
1469c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__indirect_glSecondaryColorPointerEXT(GLint size, GLenum type, GLsizei stride,
1470c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                      const GLvoid * pointer)
1471fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1472c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   uint16_t opcode;
1473c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
1474c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
1475c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
1476c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state *a;
1477c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1478c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1479c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (size != 3 || stride < 0) {
1480c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_VALUE);
1481c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return;
1482c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1483c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1484c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   switch (type) {
1485c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_BYTE:
1486c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = 4126;
1487c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1488c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_UNSIGNED_BYTE:
1489c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = 4131;
1490c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1491c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_SHORT:
1492c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = 4127;
1493c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1494c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_UNSIGNED_SHORT:
1495c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = 4132;
1496c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1497c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_INT:
1498c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = 4128;
1499c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1500c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_UNSIGNED_INT:
1501c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = 4133;
1502c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1503c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_FLOAT:
1504c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = 4129;
1505c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1506c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_DOUBLE:
1507c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = 4130;
1508c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1509c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   default:
1510c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_ENUM);
1511c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return;
1512c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1513c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1514c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   a = get_array_entry(arrays, GL_SECONDARY_COLOR_ARRAY, 0);
1515c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (a == NULL) {
1516c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_OPERATION);
1517c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return;
1518c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1519c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1520c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   COMMON_ARRAY_DATA_INIT(a, pointer, type, stride, size, GL_TRUE, 4, opcode);
1521c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1522c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (a->enabled) {
1523c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->array_info_cache_valid = GL_FALSE;
1524c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1525fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1526fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1527fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1528c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófvoid
1529c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__indirect_glFogCoordPointerEXT(GLenum type, GLsizei stride,
1530c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                const GLvoid * pointer)
1531fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1532c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   uint16_t opcode;
1533c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
1534c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
1535c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
1536c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state *a;
1537c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1538c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1539c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (stride < 0) {
1540c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_VALUE);
1541c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return;
1542c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1543c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1544c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   switch (type) {
1545c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_FLOAT:
1546c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = 4124;
1547c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1548c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_DOUBLE:
1549c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      opcode = 4125;
1550c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      break;
1551c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   default:
1552c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_ENUM);
1553c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return;
1554c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1555c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1556c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   a = get_array_entry(arrays, GL_FOG_COORD_ARRAY, 0);
1557c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (a == NULL) {
1558c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_OPERATION);
1559c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return;
1560c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1561c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1562c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   COMMON_ARRAY_DATA_INIT(a, pointer, type, stride, 1, GL_FALSE, 4, opcode);
1563c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1564c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (a->enabled) {
1565c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->array_info_cache_valid = GL_FALSE;
1566c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1567fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1568fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1569fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1570c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófvoid
1571c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__indirect_glVertexAttribPointerARB(GLuint index, GLint size,
1572c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                    GLenum type, GLboolean normalized,
1573c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                    GLsizei stride, const GLvoid * pointer)
157440af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick{
1575c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t short_ops[5] = { 0, 4189, 4190, 4191, 4192 };
1576c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t float_ops[5] = { 0, 4193, 4194, 4195, 4196 };
1577c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   static const uint16_t double_ops[5] = { 0, 4197, 4198, 4199, 4200 };
1578c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1579c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   uint16_t opcode;
1580c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
1581c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   __GLXattribute *state = (__GLXattribute *) (gc->client_state_private);
1582c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
1583c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state *a;
1584c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned true_immediate_count;
1585c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned true_immediate_size;
1586c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1587c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1588c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if ((size < 1) || (size > 4) || (stride < 0)
1589c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf       || (index > arrays->num_vertex_program_attribs)) {
1590c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_VALUE);
1591c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return;
1592c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1593c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1594c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (normalized && (type != GL_FLOAT) && (type != GL_DOUBLE)) {
1595c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      switch (type) {
1596c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_BYTE:
1597c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = X_GLrop_VertexAttrib4NbvARB;
1598c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1599c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_UNSIGNED_BYTE:
1600c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = X_GLrop_VertexAttrib4NubvARB;
1601c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1602c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_SHORT:
1603c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = X_GLrop_VertexAttrib4NsvARB;
1604c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1605c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_UNSIGNED_SHORT:
1606c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = X_GLrop_VertexAttrib4NusvARB;
1607c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1608c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_INT:
1609c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = X_GLrop_VertexAttrib4NivARB;
1610c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1611c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_UNSIGNED_INT:
1612c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = X_GLrop_VertexAttrib4NuivARB;
1613c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1614c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      default:
1615c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         __glXSetError(gc, GL_INVALID_ENUM);
1616c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         return;
1617c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
1618c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1619c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      true_immediate_count = 4;
1620c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1621c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   else {
1622c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      true_immediate_count = size;
1623c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1624c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      switch (type) {
1625c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_BYTE:
1626c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = X_GLrop_VertexAttrib4bvARB;
1627c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         true_immediate_count = 4;
1628c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1629c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_UNSIGNED_BYTE:
1630c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = X_GLrop_VertexAttrib4ubvARB;
1631c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         true_immediate_count = 4;
1632c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1633c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_SHORT:
1634c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = short_ops[size];
1635c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1636c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_UNSIGNED_SHORT:
1637c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = X_GLrop_VertexAttrib4usvARB;
1638c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         true_immediate_count = 4;
1639c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1640c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_INT:
1641c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = X_GLrop_VertexAttrib4ivARB;
1642c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         true_immediate_count = 4;
1643c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1644c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_UNSIGNED_INT:
1645c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = X_GLrop_VertexAttrib4uivARB;
1646c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         true_immediate_count = 4;
1647c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1648c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_FLOAT:
1649c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = float_ops[size];
1650c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1651c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_DOUBLE:
1652c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         opcode = double_ops[size];
1653c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1654c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      default:
1655c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         __glXSetError(gc, GL_INVALID_ENUM);
1656c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         return;
1657c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
1658c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1659c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1660c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   a = get_array_entry(arrays, GL_VERTEX_ATTRIB_ARRAY_POINTER, index);
1661c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (a == NULL) {
1662c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_OPERATION);
1663c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return;
1664c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1665c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1666c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   COMMON_ARRAY_DATA_INIT(a, pointer, type, stride, size, normalized, 8,
1667c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                          opcode);
1668c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1669c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   true_immediate_size = __glXTypeSize(type) * true_immediate_count;
1670c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   ((uint16_t *) (a)->header)[0] = __GLX_PAD(a->header_size
1671c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                             + true_immediate_size);
1672c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1673c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (a->enabled) {
1674c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->array_info_cache_valid = GL_FALSE;
1675c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
167640af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick}
167740af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
167840af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
167940af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick/**
168040af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * I don't have 100% confidence that this is correct.  The different rules
168140af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * about whether or not generic vertex attributes alias "classic" vertex
168240af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * attributes (i.e., attrib1 ?= primary color) between ARB_vertex_program,
168340af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * ARB_vertex_shader, and NV_vertex_program are a bit confusing.  My
168440af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * feeling is that the client-side doesn't have to worry about it.  The
168540af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * client just sends all the data to the server and lets the server deal
168640af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick * with it.
168740af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick */
1688c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófvoid
1689c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__indirect_glVertexAttribPointerNV(GLuint index, GLint size,
1690c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                   GLenum type, GLsizei stride,
1691c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                   const GLvoid * pointer)
169240af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick{
1693c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
1694c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   GLboolean normalized = GL_FALSE;
1695c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1696c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1697c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   switch (type) {
1698c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_UNSIGNED_BYTE:
1699c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      if (size != 4) {
1700c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         __glXSetError(gc, GL_INVALID_VALUE);
1701c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         return;
1702c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
1703c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      normalized = GL_TRUE;
1704c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1705c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_SHORT:
1706c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_FLOAT:
1707c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   case GL_DOUBLE:
1708c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __indirect_glVertexAttribPointerARB(index, size, type,
1709c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                          normalized, stride, pointer);
1710c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return;
1711c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   default:
1712c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_ENUM);
1713c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return;
1714c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
171540af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick}
171640af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
171740af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
1718c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristófvoid
1719c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__indirect_glClientActiveTextureARB(GLenum texture)
1720fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1721c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *const gc = __glXGetCurrentContext();
1722c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   __GLXattribute *const state =
1723c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      (__GLXattribute *) (gc->client_state_private);
1724c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *const arrays = state->array_state;
1725c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const GLint unit = (GLint) texture - GL_TEXTURE0;
1726fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1727fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1728c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if ((unit < 0) || (unit >= arrays->num_texture_units)) {
1729c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetError(gc, GL_INVALID_ENUM);
1730c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      return;
1731c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1732fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1733c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->active_texture_unit = unit;
1734fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1735fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1736fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1737fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick/**
173867108adb48f3be927d7fb92ba8f6bd5c9d165222Ian Romanick * Modify the enable state for the selected array
1739fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick */
1740fdb07636f2e6324c5250cd5ee97778b7f5933beaIan RomanickGLboolean
1741c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__glXSetArrayEnable(__GLXattribute * state, GLenum key, unsigned index,
174267108adb48f3be927d7fb92ba8f6bd5c9d165222Ian Romanick                    GLboolean enable)
1743fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1744c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
1745c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state *a;
1746c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1747fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1748c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   /* Texture coordinate arrays have an implict index set when the
1749c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf    * application calls glClientActiveTexture.
1750c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf    */
1751c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (key == GL_TEXTURE_COORD_ARRAY) {
1752c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      index = arrays->active_texture_unit;
1753c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1754fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1755c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   a = get_array_entry(arrays, key, index);
1756fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1757c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if ((a != NULL) && (a->enabled != enable)) {
1758c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      a->enabled = enable;
1759c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->array_info_cache_valid = GL_FALSE;
1760c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1761fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1762c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   return (a != NULL);
1763fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1764fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1765fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1766fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanickvoid
1767c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__glXArrayDisableAll(__GLXattribute * state)
1768fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1769c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
1770c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned i;
1771fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1772fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1773c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   for (i = 0; i < arrays->num_arrays; i++) {
1774c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->arrays[i].enabled = GL_FALSE;
1775c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1776fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1777c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->array_info_cache_valid = GL_FALSE;
1778fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1779fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1780fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1781fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick/**
1782fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick */
1783fdb07636f2e6324c5250cd5ee97778b7f5933beaIan RomanickGLboolean
1784c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__glXGetArrayEnable(const __GLXattribute * const state,
1785c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                    GLenum key, unsigned index, GLintptr * dest)
1786fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1787c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const struct array_state_vector *arrays = state->array_state;
1788c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const struct array_state *a =
1789c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      get_array_entry((struct array_state_vector *) arrays,
1790c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                      key, index);
1791fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1792c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (a != NULL) {
1793c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      *dest = (GLintptr) a->enabled;
1794c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1795fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1796c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   return (a != NULL);
1797fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1798fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1799fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1800fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick/**
1801fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick */
1802fdb07636f2e6324c5250cd5ee97778b7f5933beaIan RomanickGLboolean
1803c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__glXGetArrayType(const __GLXattribute * const state,
1804c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                  GLenum key, unsigned index, GLintptr * dest)
1805fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1806c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const struct array_state_vector *arrays = state->array_state;
1807c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const struct array_state *a =
1808c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      get_array_entry((struct array_state_vector *) arrays,
1809c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                      key, index);
1810fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1811c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (a != NULL) {
1812c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      *dest = (GLintptr) a->data_type;
1813c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1814fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1815c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   return (a != NULL);
1816fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1817fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1818fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1819fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick/**
1820fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick */
1821fdb07636f2e6324c5250cd5ee97778b7f5933beaIan RomanickGLboolean
1822c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__glXGetArraySize(const __GLXattribute * const state,
1823c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                  GLenum key, unsigned index, GLintptr * dest)
1824fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1825c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const struct array_state_vector *arrays = state->array_state;
1826c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const struct array_state *a =
1827c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      get_array_entry((struct array_state_vector *) arrays,
1828c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                      key, index);
1829fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1830c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (a != NULL) {
1831c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      *dest = (GLintptr) a->count;
1832c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1833fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1834c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   return (a != NULL);
1835fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1836fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1837fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1838fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick/**
1839fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick */
1840fdb07636f2e6324c5250cd5ee97778b7f5933beaIan RomanickGLboolean
1841c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__glXGetArrayStride(const __GLXattribute * const state,
1842c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                    GLenum key, unsigned index, GLintptr * dest)
1843fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1844c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const struct array_state_vector *arrays = state->array_state;
1845c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const struct array_state *a =
1846c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      get_array_entry((struct array_state_vector *) arrays,
1847c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                      key, index);
1848fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1849c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (a != NULL) {
1850c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      *dest = (GLintptr) a->user_stride;
1851c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1852fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1853c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   return (a != NULL);
1854fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1855fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1856fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1857fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick/**
1858fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick */
1859fdb07636f2e6324c5250cd5ee97778b7f5933beaIan RomanickGLboolean
1860c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__glXGetArrayPointer(const __GLXattribute * const state,
1861c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                     GLenum key, unsigned index, void **dest)
1862fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1863c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const struct array_state_vector *arrays = state->array_state;
1864c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const struct array_state *a =
1865c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      get_array_entry((struct array_state_vector *) arrays,
1866c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                      key, index);
1867fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1868fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1869c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (a != NULL) {
1870c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      *dest = (void *) (a->data);
1871c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
187240af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
1873c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   return (a != NULL);
187440af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick}
187540af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
187640af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
187740af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick/**
187840af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick */
187940af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan RomanickGLboolean
1880c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__glXGetArrayNormalized(const __GLXattribute * const state,
1881c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                        GLenum key, unsigned index, GLintptr * dest)
188240af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick{
1883c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const struct array_state_vector *arrays = state->array_state;
1884c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   const struct array_state *a =
1885c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      get_array_entry((struct array_state_vector *) arrays,
1886c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                      key, index);
188740af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
188840af76bbaa9e8909d63d8eeab4689ed2dfe1e19cIan Romanick
1889c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   if (a != NULL) {
1890c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      *dest = (GLintptr) a->normalized;
1891c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1892fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1893c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   return (a != NULL);
1894fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1895fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1896fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1897fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick/**
1898fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick */
1899fdb07636f2e6324c5250cd5ee97778b7f5933beaIan RomanickGLuint
1900c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__glXGetActiveTextureUnit(const __GLXattribute * const state)
1901fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1902c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   return state->array_state->active_texture_unit;
1903fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1904fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1905fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1906fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanickvoid
1907c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__glXPushArrayState(__GLXattribute * state)
1908fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1909c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
1910c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_stack_state *stack =
1911c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      &arrays->stack[(arrays->stack_index * arrays->num_arrays)];
1912c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned i;
1913c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1914c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   /* XXX are we pushing _all_ the necessary fields? */
1915c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   for (i = 0; i < arrays->num_arrays; i++) {
1916c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      stack[i].data = arrays->arrays[i].data;
1917c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      stack[i].data_type = arrays->arrays[i].data_type;
1918c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      stack[i].user_stride = arrays->arrays[i].user_stride;
1919c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      stack[i].count = arrays->arrays[i].count;
1920c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      stack[i].key = arrays->arrays[i].key;
1921c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      stack[i].index = arrays->arrays[i].index;
1922c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      stack[i].enabled = arrays->arrays[i].enabled;
1923c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1924c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1925c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->active_texture_unit_stack[arrays->stack_index] =
1926fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick      arrays->active_texture_unit;
1927fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1928c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->stack_index++;
1929fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1930fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1931fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick
1932fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanickvoid
1933c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf__glXPopArrayState(__GLXattribute * state)
1934fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick{
1935c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_state_vector *arrays = state->array_state;
1936c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   struct array_stack_state *stack;
1937c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   unsigned i;
1938c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1939c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1940c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->stack_index--;
1941c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   stack = &arrays->stack[(arrays->stack_index * arrays->num_arrays)];
1942c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1943c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   for (i = 0; i < arrays->num_arrays; i++) {
1944c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      switch (stack[i].key) {
1945c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_NORMAL_ARRAY:
1946c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         __indirect_glNormalPointer(stack[i].data_type,
1947c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                    stack[i].user_stride, stack[i].data);
1948c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1949c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_COLOR_ARRAY:
1950c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         __indirect_glColorPointer(stack[i].count,
1951c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                   stack[i].data_type,
1952c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                   stack[i].user_stride, stack[i].data);
1953c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1954c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_INDEX_ARRAY:
1955c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         __indirect_glIndexPointer(stack[i].data_type,
1956c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                   stack[i].user_stride, stack[i].data);
1957c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1958c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_EDGE_FLAG_ARRAY:
1959c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         __indirect_glEdgeFlagPointer(stack[i].user_stride, stack[i].data);
1960c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1961c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_TEXTURE_COORD_ARRAY:
1962c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         arrays->active_texture_unit = stack[i].index;
1963c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         __indirect_glTexCoordPointer(stack[i].count,
1964c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                      stack[i].data_type,
1965c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                      stack[i].user_stride, stack[i].data);
1966c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1967c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_SECONDARY_COLOR_ARRAY:
1968c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         __indirect_glSecondaryColorPointerEXT(stack[i].count,
1969c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                               stack[i].data_type,
1970c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                               stack[i].user_stride,
1971c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                               stack[i].data);
1972c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1973c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      case GL_FOG_COORDINATE_ARRAY:
1974c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         __indirect_glFogCoordPointerEXT(stack[i].data_type,
1975c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                                         stack[i].user_stride, stack[i].data);
1976c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf         break;
1977c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1978c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      }
1979c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1980c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      __glXSetArrayEnable(state, stack[i].key, stack[i].index,
1981c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf                          stack[i].enabled);
1982c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   }
1983c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf
1984c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf   arrays->active_texture_unit =
1985c868ab3dd1df44e4768f0bf98c07a674541a0a88RALOVICH, Kristóf      arrays->active_texture_unit_stack[arrays->stack_index];
1986fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick}
1987