1 /* 2 * (C) Copyright IBM Corporation 2005, 2006 3 * All Rights Reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sub license, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the next 13 * paragraph) shall be included in all copies or substantial portions of the 14 * Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 19 * IBM, 20 * AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 22 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 * SOFTWARE. 24 */ 25 26 /** 27 * \file indirect_table.h 28 * 29 * \author Ian Romanick <idr@us.ibm.com> 30 */ 31 32 #ifndef INDIRECT_TABLE_H 33 #define INDIRECT_TABLE_H 34 35 #include <inttypes.h> 36 37 /** 38 */ 39 struct __glXDispatchInfo { 40 /** 41 * Number of significant bits in the protocol opcode. Opcodes with values 42 * larger than ((1 << bits) - 1) are invalid. 43 */ 44 unsigned bits; 45 46 /** 47 */ 48 const int_fast16_t *dispatch_tree; 49 50 /** 51 * Array of protocol decode and dispatch functions index by the opcode 52 * search tree (i.e., \c dispatch_tree). The first element in each pair 53 * is the non-byte-swapped version, and the second element is the 54 * byte-swapped version. 55 */ 56 const void *(*dispatch_functions)[2]; 57 58 /** 59 * Pointer to size validation data. This table is indexed with the same 60 * value as ::dispatch_functions. 61 * 62 * The first element in the pair is the size, in bytes, of the fixed-size 63 * portion of the protocol. 64 * 65 * For opcodes that have a variable-size portion, the second value is an 66 * index in \c size_func_table to calculate that size. If there is no 67 * variable-size portion, this index will be ~0. 68 * 69 * \note 70 * If size checking is not to be performed on this type of protocol 71 * data, this pointer will be \c NULL. 72 */ 73 const int_fast16_t(*size_table)[2]; 74 75 /** 76 * Array of functions used to calculate the variable-size portion of 77 * protocol messages. Indexed by the second element of the entries 78 * in \c ::size_table. 79 * 80 * \note 81 * If size checking is not to be performed on this type of protocol 82 * data, this pointer will be \c NULL. 83 */ 84 const gl_proto_size_func *size_func_table; 85 }; 86 87 /** 88 * Sentinel value for an empty leaf in the \c dispatch_tree. 89 */ 90 #define EMPTY_LEAF INT_FAST16_MIN 91 92 /** 93 * Declare the index \c x as a leaf index. 94 */ 95 #define LEAF(x) -x 96 97 /** 98 * Determine if an index is a leaf index. 99 */ 100 #define IS_LEAF_INDEX(x) ((x) <= 0) 101 102 extern const struct __glXDispatchInfo Single_dispatch_info; 103 extern const struct __glXDispatchInfo Render_dispatch_info; 104 extern const struct __glXDispatchInfo VendorPriv_dispatch_info; 105 106 #endif /* INDIRECT_TABLE_H */ 107