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