Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Mesa 3-D graphics library
  3.  * Version:  6.5.1
  4.  *
  5.  * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
  6.  *
  7.  * Permission is hereby granted, free of charge, to any person obtaining a
  8.  * copy of this software and associated documentation files (the "Software"),
  9.  * to deal in the Software without restriction, including without limitation
  10.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  11.  * and/or sell copies of the Software, and to permit persons to whom the
  12.  * Software is furnished to do so, subject to the following conditions:
  13.  *
  14.  * The above copyright notice and this permission notice shall be included
  15.  * in all copies or substantial portions of the Software.
  16.  *
  17.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  18.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  20.  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
  21.  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  22.  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  23.  */
  24.  
  25. /**
  26.  * This file implements the glArrayElement() function.
  27.  * It involves looking at the format/type of all the enabled vertex arrays
  28.  * and emitting a list of pointers to functions which set the per-vertex
  29.  * state for the element/index.
  30.  */
  31.  
  32.  
  33. /* Author:
  34.  *    Keith Whitwell <keith@tungstengraphics.com>
  35.  */
  36.  
  37. #include "glheader.h"
  38. #include "api_arrayelt.h"
  39. #include "bufferobj.h"
  40. #include "context.h"
  41. #include "imports.h"
  42. #include "macros.h"
  43. #include "main/dispatch.h"
  44.  
  45. typedef void (GLAPIENTRY *array_func)( const void * );
  46.  
  47. typedef struct {
  48.    const struct gl_client_array *array;
  49.    int offset;
  50. } AEarray;
  51.  
  52. typedef void (GLAPIENTRY *attrib_func)( GLuint indx, const void *data );
  53.  
  54. typedef struct {
  55.    const struct gl_client_array *array;
  56.    attrib_func func;
  57.    GLuint index;
  58. } AEattrib;
  59.  
  60. typedef struct {
  61.    AEarray arrays[32];
  62.    AEattrib attribs[VERT_ATTRIB_MAX + 1];
  63.    GLuint NewState;
  64.  
  65.    struct gl_buffer_object *vbo[VERT_ATTRIB_MAX];
  66.    GLuint nr_vbos;
  67.    GLboolean mapped_vbos;
  68.  
  69. } AEcontext;
  70.  
  71. #define AE_CONTEXT(ctx) ((AEcontext *)(ctx)->aelt_context)
  72.  
  73.  
  74. /*
  75.  * Convert GL_BYTE, GL_UNSIGNED_BYTE, .. GL_DOUBLE into an integer
  76.  * in the range [0, 7].  Luckily these type tokens are sequentially
  77.  * numbered in gl.h, except for GL_DOUBLE.
  78.  */
  79. #define TYPE_IDX(t) ( (t) == GL_DOUBLE ? 7 : (t) & 7 )
  80.  
  81. #define NUM_TYPES 8
  82.  
  83.  
  84. #if FEATURE_arrayelt
  85.  
  86.  
  87. static const int ColorFuncs[2][NUM_TYPES] = {
  88.    {
  89.       _gloffset_Color3bv,
  90.       _gloffset_Color3ubv,
  91.       _gloffset_Color3sv,
  92.       _gloffset_Color3usv,
  93.       _gloffset_Color3iv,
  94.       _gloffset_Color3uiv,
  95.       _gloffset_Color3fv,
  96.       _gloffset_Color3dv,
  97.    },
  98.    {
  99.       _gloffset_Color4bv,
  100.       _gloffset_Color4ubv,
  101.       _gloffset_Color4sv,
  102.       _gloffset_Color4usv,
  103.       _gloffset_Color4iv,
  104.       _gloffset_Color4uiv,
  105.       _gloffset_Color4fv,
  106.       _gloffset_Color4dv,
  107.    },
  108. };
  109.  
  110. static const int VertexFuncs[3][NUM_TYPES] = {
  111.    {
  112.       -1,
  113.       -1,
  114.       _gloffset_Vertex2sv,
  115.       -1,
  116.       _gloffset_Vertex2iv,
  117.       -1,
  118.       _gloffset_Vertex2fv,
  119.       _gloffset_Vertex2dv,
  120.    },
  121.    {
  122.       -1,
  123.       -1,
  124.       _gloffset_Vertex3sv,
  125.       -1,
  126.       _gloffset_Vertex3iv,
  127.       -1,
  128.       _gloffset_Vertex3fv,
  129.       _gloffset_Vertex3dv,
  130.    },
  131.    {
  132.       -1,
  133.       -1,
  134.       _gloffset_Vertex4sv,
  135.       -1,
  136.       _gloffset_Vertex4iv,
  137.       -1,
  138.       _gloffset_Vertex4fv,
  139.       _gloffset_Vertex4dv,
  140.    },
  141. };
  142.  
  143. static const int IndexFuncs[NUM_TYPES] = {
  144.    -1,
  145.    _gloffset_Indexubv,
  146.    _gloffset_Indexsv,
  147.    -1,
  148.    _gloffset_Indexiv,
  149.    -1,
  150.    _gloffset_Indexfv,
  151.    _gloffset_Indexdv,
  152. };
  153.  
  154. static const int NormalFuncs[NUM_TYPES] = {
  155.    _gloffset_Normal3bv,
  156.    -1,
  157.    _gloffset_Normal3sv,
  158.    -1,
  159.    _gloffset_Normal3iv,
  160.    -1,
  161.    _gloffset_Normal3fv,
  162.    _gloffset_Normal3dv,
  163. };
  164.  
  165. /* Note: _gloffset_* for these may not be a compile-time constant. */
  166. static int SecondaryColorFuncs[NUM_TYPES];
  167. static int FogCoordFuncs[NUM_TYPES];
  168.  
  169.  
  170. /**
  171.  ** GL_NV_vertex_program
  172.  **/
  173.  
  174. /* GL_BYTE attributes */
  175.  
  176. static void
  177. VertexAttrib1NbvNV(GLuint index, const GLbyte *v)
  178. {
  179.    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0])));
  180. }
  181.  
  182. static void
  183. VertexAttrib1bvNV(GLuint index, const GLbyte *v)
  184. {
  185.    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0]));
  186. }
  187.  
  188. static void
  189. VertexAttrib2NbvNV(GLuint index, const GLbyte *v)
  190. {
  191.    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1])));
  192. }
  193.  
  194. static void
  195. VertexAttrib2bvNV(GLuint index, const GLbyte *v)
  196. {
  197.    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1]));
  198. }
  199.  
  200. static void
  201. VertexAttrib3NbvNV(GLuint index, const GLbyte *v)
  202. {
  203.    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]),
  204.                                                BYTE_TO_FLOAT(v[1]),
  205.                                                BYTE_TO_FLOAT(v[2])));
  206. }
  207.  
  208. static void
  209. VertexAttrib3bvNV(GLuint index, const GLbyte *v)
  210. {
  211.    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2]));
  212. }
  213.  
  214. static void
  215. VertexAttrib4NbvNV(GLuint index, const GLbyte *v)
  216. {
  217.    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]),
  218.                                                BYTE_TO_FLOAT(v[1]),
  219.                                                BYTE_TO_FLOAT(v[2]),
  220.                                                BYTE_TO_FLOAT(v[3])));
  221. }
  222.  
  223. static void
  224. VertexAttrib4bvNV(GLuint index, const GLbyte *v)
  225. {
  226.    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2], (GLfloat)v[3]));
  227. }
  228.  
  229. /* GL_UNSIGNED_BYTE attributes */
  230.  
  231. static void
  232. VertexAttrib1NubvNV(GLuint index, const GLubyte *v)
  233. {
  234.    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, UBYTE_TO_FLOAT(v[0])));
  235. }
  236.  
  237. static void
  238. VertexAttrib1ubvNV(GLuint index, const GLubyte *v)
  239. {
  240.    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0]));
  241. }
  242.  
  243. static void
  244. VertexAttrib2NubvNV(GLuint index, const GLubyte *v)
  245. {
  246.    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, UBYTE_TO_FLOAT(v[0]),
  247.                                           UBYTE_TO_FLOAT(v[1])));
  248. }
  249.  
  250. static void
  251. VertexAttrib2ubvNV(GLuint index, const GLubyte *v)
  252. {
  253.    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1]));
  254. }
  255.  
  256. static void
  257. VertexAttrib3NubvNV(GLuint index, const GLubyte *v)
  258. {
  259.    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, UBYTE_TO_FLOAT(v[0]),
  260.                                                UBYTE_TO_FLOAT(v[1]),
  261.                                                UBYTE_TO_FLOAT(v[2])));
  262. }
  263. static void
  264. VertexAttrib3ubvNV(GLuint index, const GLubyte *v)
  265. {
  266.    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0],
  267.                                           (GLfloat)v[1], (GLfloat)v[2]));
  268. }
  269.  
  270. static void
  271. VertexAttrib4NubvNV(GLuint index, const GLubyte *v)
  272. {
  273.    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, UBYTE_TO_FLOAT(v[0]),
  274.                                           UBYTE_TO_FLOAT(v[1]),
  275.                                           UBYTE_TO_FLOAT(v[2]),
  276.                                           UBYTE_TO_FLOAT(v[3])));
  277. }
  278.  
  279. static void
  280. VertexAttrib4ubvNV(GLuint index, const GLubyte *v)
  281. {
  282.    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0],
  283.                                           (GLfloat)v[1], (GLfloat)v[2],
  284.                                           (GLfloat)v[3]));
  285. }
  286.  
  287. /* GL_SHORT attributes */
  288.  
  289. static void
  290. VertexAttrib1NsvNV(GLuint index, const GLshort *v)
  291. {
  292.    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, SHORT_TO_FLOAT(v[0])));
  293. }
  294.  
  295. static void
  296. VertexAttrib1svNV(GLuint index, const GLshort *v)
  297. {
  298.    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0]));
  299. }
  300.  
  301. static void
  302. VertexAttrib2NsvNV(GLuint index, const GLshort *v)
  303. {
  304.    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, SHORT_TO_FLOAT(v[0]),
  305.                                           SHORT_TO_FLOAT(v[1])));
  306. }
  307.  
  308. static void
  309. VertexAttrib2svNV(GLuint index, const GLshort *v)
  310. {
  311.    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1]));
  312. }
  313.  
  314. static void
  315. VertexAttrib3NsvNV(GLuint index, const GLshort *v)
  316. {
  317.    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, SHORT_TO_FLOAT(v[0]),
  318.                              SHORT_TO_FLOAT(v[1]),
  319.                              SHORT_TO_FLOAT(v[2])));
  320. }
  321.  
  322. static void
  323. VertexAttrib3svNV(GLuint index, const GLshort *v)
  324. {
  325.    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
  326.                                           (GLfloat)v[2]));
  327. }
  328.  
  329. static void
  330. VertexAttrib4NsvNV(GLuint index, const GLshort *v)
  331. {
  332.    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, SHORT_TO_FLOAT(v[0]),
  333.                              SHORT_TO_FLOAT(v[1]),
  334.                              SHORT_TO_FLOAT(v[2]),
  335.                              SHORT_TO_FLOAT(v[3])));
  336. }
  337.  
  338. static void
  339. VertexAttrib4svNV(GLuint index, const GLshort *v)
  340. {
  341.    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
  342.                                           (GLfloat)v[2], (GLfloat)v[3]));
  343. }
  344.  
  345. /* GL_UNSIGNED_SHORT attributes */
  346.  
  347. static void
  348. VertexAttrib1NusvNV(GLuint index, const GLushort *v)
  349. {
  350.    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0])));
  351. }
  352.  
  353. static void
  354. VertexAttrib1usvNV(GLuint index, const GLushort *v)
  355. {
  356.    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0]));
  357. }
  358.  
  359. static void
  360. VertexAttrib2NusvNV(GLuint index, const GLushort *v)
  361. {
  362.    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]),
  363.                              USHORT_TO_FLOAT(v[1])));
  364. }
  365.  
  366. static void
  367. VertexAttrib2usvNV(GLuint index, const GLushort *v)
  368. {
  369.    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0],
  370.                                           (GLfloat)v[1]));
  371. }
  372.  
  373. static void
  374. VertexAttrib3NusvNV(GLuint index, const GLushort *v)
  375. {
  376.    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]),
  377.                                                USHORT_TO_FLOAT(v[1]),
  378.                                                USHORT_TO_FLOAT(v[2])));
  379. }
  380.  
  381. static void
  382. VertexAttrib3usvNV(GLuint index, const GLushort *v)
  383. {
  384.    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
  385.                                           (GLfloat)v[2]));
  386. }
  387.  
  388. static void
  389. VertexAttrib4NusvNV(GLuint index, const GLushort *v)
  390. {
  391.    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]),
  392.                                                USHORT_TO_FLOAT(v[1]),
  393.                                                USHORT_TO_FLOAT(v[2]),
  394.                                                USHORT_TO_FLOAT(v[3])));
  395. }
  396.  
  397. static void
  398. VertexAttrib4usvNV(GLuint index, const GLushort *v)
  399. {
  400.    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
  401.                                           (GLfloat)v[2], (GLfloat)v[3]));
  402. }
  403.  
  404. /* GL_INT attributes */
  405.  
  406. static void
  407. VertexAttrib1NivNV(GLuint index, const GLint *v)
  408. {
  409.    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0])));
  410. }
  411.  
  412. static void
  413. VertexAttrib1ivNV(GLuint index, const GLint *v)
  414. {
  415.    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0]));
  416. }
  417.  
  418. static void
  419. VertexAttrib2NivNV(GLuint index, const GLint *v)
  420. {
  421.    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]),
  422.                                                INT_TO_FLOAT(v[1])));
  423. }
  424.  
  425. static void
  426. VertexAttrib2ivNV(GLuint index, const GLint *v)
  427. {
  428.    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1]));
  429. }
  430.  
  431. static void
  432. VertexAttrib3NivNV(GLuint index, const GLint *v)
  433. {
  434.    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]),
  435.                                                INT_TO_FLOAT(v[1]),
  436.                                                INT_TO_FLOAT(v[2])));
  437. }
  438.  
  439. static void
  440. VertexAttrib3ivNV(GLuint index, const GLint *v)
  441. {
  442.    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
  443.                                           (GLfloat)v[2]));
  444. }
  445.  
  446. static void
  447. VertexAttrib4NivNV(GLuint index, const GLint *v)
  448. {
  449.    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]),
  450.                                           INT_TO_FLOAT(v[1]),
  451.                                           INT_TO_FLOAT(v[2]),
  452.                                           INT_TO_FLOAT(v[3])));
  453. }
  454.  
  455. static void
  456. VertexAttrib4ivNV(GLuint index, const GLint *v)
  457. {
  458.    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
  459.                                           (GLfloat)v[2], (GLfloat)v[3]));
  460. }
  461.  
  462. /* GL_UNSIGNED_INT attributes */
  463.  
  464. static void
  465. VertexAttrib1NuivNV(GLuint index, const GLuint *v)
  466. {
  467.    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0])));
  468. }
  469.  
  470. static void
  471. VertexAttrib1uivNV(GLuint index, const GLuint *v)
  472. {
  473.    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0]));
  474. }
  475.  
  476. static void
  477. VertexAttrib2NuivNV(GLuint index, const GLuint *v)
  478. {
  479.    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]),
  480.                                           UINT_TO_FLOAT(v[1])));
  481. }
  482.  
  483. static void
  484. VertexAttrib2uivNV(GLuint index, const GLuint *v)
  485. {
  486.    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0],
  487.                                           (GLfloat)v[1]));
  488. }
  489.  
  490. static void
  491. VertexAttrib3NuivNV(GLuint index, const GLuint *v)
  492. {
  493.    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]),
  494.                                                UINT_TO_FLOAT(v[1]),
  495.                                                UINT_TO_FLOAT(v[2])));
  496. }
  497.  
  498. static void
  499. VertexAttrib3uivNV(GLuint index, const GLuint *v)
  500. {
  501.    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
  502.                                           (GLfloat)v[2]));
  503. }
  504.  
  505. static void
  506. VertexAttrib4NuivNV(GLuint index, const GLuint *v)
  507. {
  508.    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]),
  509.                                                UINT_TO_FLOAT(v[1]),
  510.                                                UINT_TO_FLOAT(v[2]),
  511.                                                UINT_TO_FLOAT(v[3])));
  512. }
  513.  
  514. static void
  515. VertexAttrib4uivNV(GLuint index, const GLuint *v)
  516. {
  517.    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
  518.                                           (GLfloat)v[2], (GLfloat)v[3]));
  519. }
  520.  
  521. /* GL_FLOAT attributes */
  522.  
  523. static void
  524. VertexAttrib1fvNV(GLuint index, const GLfloat *v)
  525. {
  526.    CALL_VertexAttrib1fvNV(GET_DISPATCH(), (index, v));
  527. }
  528.  
  529. static void
  530. VertexAttrib2fvNV(GLuint index, const GLfloat *v)
  531. {
  532.    CALL_VertexAttrib2fvNV(GET_DISPATCH(), (index, v));
  533. }
  534.  
  535. static void
  536. VertexAttrib3fvNV(GLuint index, const GLfloat *v)
  537. {
  538.    CALL_VertexAttrib3fvNV(GET_DISPATCH(), (index, v));
  539. }
  540.  
  541. static void
  542. VertexAttrib4fvNV(GLuint index, const GLfloat *v)
  543. {
  544.    CALL_VertexAttrib4fvNV(GET_DISPATCH(), (index, v));
  545. }
  546.  
  547. /* GL_DOUBLE attributes */
  548.  
  549. static void
  550. VertexAttrib1dvNV(GLuint index, const GLdouble *v)
  551. {
  552.    CALL_VertexAttrib1dvNV(GET_DISPATCH(), (index, v));
  553. }
  554.  
  555. static void
  556. VertexAttrib2dvNV(GLuint index, const GLdouble *v)
  557. {
  558.    CALL_VertexAttrib2dvNV(GET_DISPATCH(), (index, v));
  559. }
  560.  
  561. static void
  562. VertexAttrib3dvNV(GLuint index, const GLdouble *v)
  563. {
  564.    CALL_VertexAttrib3dvNV(GET_DISPATCH(), (index, v));
  565. }
  566.  
  567. static void
  568. VertexAttrib4dvNV(GLuint index, const GLdouble *v)
  569. {
  570.    CALL_VertexAttrib4dvNV(GET_DISPATCH(), (index, v));
  571. }
  572.  
  573.  
  574. /*
  575.  * Array [size][type] of VertexAttrib functions
  576.  */
  577. static attrib_func AttribFuncsNV[2][4][NUM_TYPES] = {
  578.    {
  579.       /* non-normalized */
  580.       {
  581.          /* size 1 */
  582.          (attrib_func) VertexAttrib1bvNV,
  583.          (attrib_func) VertexAttrib1ubvNV,
  584.          (attrib_func) VertexAttrib1svNV,
  585.          (attrib_func) VertexAttrib1usvNV,
  586.          (attrib_func) VertexAttrib1ivNV,
  587.          (attrib_func) VertexAttrib1uivNV,
  588.          (attrib_func) VertexAttrib1fvNV,
  589.          (attrib_func) VertexAttrib1dvNV
  590.       },
  591.       {
  592.          /* size 2 */
  593.          (attrib_func) VertexAttrib2bvNV,
  594.          (attrib_func) VertexAttrib2ubvNV,
  595.          (attrib_func) VertexAttrib2svNV,
  596.          (attrib_func) VertexAttrib2usvNV,
  597.          (attrib_func) VertexAttrib2ivNV,
  598.          (attrib_func) VertexAttrib2uivNV,
  599.          (attrib_func) VertexAttrib2fvNV,
  600.          (attrib_func) VertexAttrib2dvNV
  601.       },
  602.       {
  603.          /* size 3 */
  604.          (attrib_func) VertexAttrib3bvNV,
  605.          (attrib_func) VertexAttrib3ubvNV,
  606.          (attrib_func) VertexAttrib3svNV,
  607.          (attrib_func) VertexAttrib3usvNV,
  608.          (attrib_func) VertexAttrib3ivNV,
  609.          (attrib_func) VertexAttrib3uivNV,
  610.          (attrib_func) VertexAttrib3fvNV,
  611.          (attrib_func) VertexAttrib3dvNV
  612.       },
  613.       {
  614.          /* size 4 */
  615.          (attrib_func) VertexAttrib4bvNV,
  616.          (attrib_func) VertexAttrib4ubvNV,
  617.          (attrib_func) VertexAttrib4svNV,
  618.          (attrib_func) VertexAttrib4usvNV,
  619.          (attrib_func) VertexAttrib4ivNV,
  620.          (attrib_func) VertexAttrib4uivNV,
  621.          (attrib_func) VertexAttrib4fvNV,
  622.          (attrib_func) VertexAttrib4dvNV
  623.       }
  624.    },
  625.    {
  626.       /* normalized (except for float/double) */
  627.       {
  628.          /* size 1 */
  629.          (attrib_func) VertexAttrib1NbvNV,
  630.          (attrib_func) VertexAttrib1NubvNV,
  631.          (attrib_func) VertexAttrib1NsvNV,
  632.          (attrib_func) VertexAttrib1NusvNV,
  633.          (attrib_func) VertexAttrib1NivNV,
  634.          (attrib_func) VertexAttrib1NuivNV,
  635.          (attrib_func) VertexAttrib1fvNV,
  636.          (attrib_func) VertexAttrib1dvNV
  637.       },
  638.       {
  639.          /* size 2 */
  640.          (attrib_func) VertexAttrib2NbvNV,
  641.          (attrib_func) VertexAttrib2NubvNV,
  642.          (attrib_func) VertexAttrib2NsvNV,
  643.          (attrib_func) VertexAttrib2NusvNV,
  644.          (attrib_func) VertexAttrib2NivNV,
  645.          (attrib_func) VertexAttrib2NuivNV,
  646.          (attrib_func) VertexAttrib2fvNV,
  647.          (attrib_func) VertexAttrib2dvNV
  648.       },
  649.       {
  650.          /* size 3 */
  651.          (attrib_func) VertexAttrib3NbvNV,
  652.          (attrib_func) VertexAttrib3NubvNV,
  653.          (attrib_func) VertexAttrib3NsvNV,
  654.          (attrib_func) VertexAttrib3NusvNV,
  655.          (attrib_func) VertexAttrib3NivNV,
  656.          (attrib_func) VertexAttrib3NuivNV,
  657.          (attrib_func) VertexAttrib3fvNV,
  658.          (attrib_func) VertexAttrib3dvNV
  659.       },
  660.       {
  661.          /* size 4 */
  662.          (attrib_func) VertexAttrib4NbvNV,
  663.          (attrib_func) VertexAttrib4NubvNV,
  664.          (attrib_func) VertexAttrib4NsvNV,
  665.          (attrib_func) VertexAttrib4NusvNV,
  666.          (attrib_func) VertexAttrib4NivNV,
  667.          (attrib_func) VertexAttrib4NuivNV,
  668.          (attrib_func) VertexAttrib4fvNV,
  669.          (attrib_func) VertexAttrib4dvNV
  670.       }
  671.    }
  672. };
  673.  
  674.  
  675. /**
  676.  ** GL_ARB_vertex_program
  677.  **/
  678.  
  679. /* GL_BYTE attributes */
  680.  
  681. static void
  682. VertexAttrib1NbvARB(GLuint index, const GLbyte *v)
  683. {
  684.    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0])));
  685. }
  686.  
  687. static void
  688. VertexAttrib1bvARB(GLuint index, const GLbyte *v)
  689. {
  690.    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0]));
  691. }
  692.  
  693. static void
  694. VertexAttrib2NbvARB(GLuint index, const GLbyte *v)
  695. {
  696.    CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1])));
  697. }
  698.  
  699. static void
  700. VertexAttrib2bvARB(GLuint index, const GLbyte *v)
  701. {
  702.    CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1]));
  703. }
  704.  
  705. static void
  706. VertexAttrib3NbvARB(GLuint index, const GLbyte *v)
  707. {
  708.    CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]),
  709.                                                BYTE_TO_FLOAT(v[1]),
  710.                                                BYTE_TO_FLOAT(v[2])));
  711. }
  712.  
  713. static void
  714. VertexAttrib3bvARB(GLuint index, const GLbyte *v)
  715. {
  716.    CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2]));
  717. }
  718.  
  719. static void
  720. VertexAttrib4NbvARB(GLuint index, const GLbyte *v)
  721. {
  722.    CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]),
  723.                                                BYTE_TO_FLOAT(v[1]),
  724.                                                BYTE_TO_FLOAT(v[2]),
  725.                                                BYTE_TO_FLOAT(v[3])));
  726. }
  727.  
  728. static void
  729. VertexAttrib4bvARB(GLuint index, const GLbyte *v)
  730. {
  731.    CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2], (GLfloat)v[3]));
  732. }
  733.  
  734. /* GL_UNSIGNED_BYTE attributes */
  735.  
  736. static void
  737. VertexAttrib1NubvARB(GLuint index, const GLubyte *v)
  738. {
  739.    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, UBYTE_TO_FLOAT(v[0])));
  740. }
  741.  
  742. static void
  743. VertexAttrib1ubvARB(GLuint index, const GLubyte *v)
  744. {
  745.    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0]));
  746. }
  747.  
  748. static void
  749. VertexAttrib2NubvARB(GLuint index, const GLubyte *v)
  750. {
  751.    CALL_VertexAttrib2fARB(GET_DISPATCH(), (index,
  752.                                            UBYTE_TO_FLOAT(v[0]),
  753.                                            UBYTE_TO_FLOAT(v[1])));
  754. }
  755.  
  756. static void
  757. VertexAttrib2ubvARB(GLuint index, const GLubyte *v)
  758. {
  759.    CALL_VertexAttrib2fARB(GET_DISPATCH(), (index,
  760.                                            (GLfloat)v[0], (GLfloat)v[1]));
  761. }
  762.  
  763. static void
  764. VertexAttrib3NubvARB(GLuint index, const GLubyte *v)
  765. {
  766.    CALL_VertexAttrib3fARB(GET_DISPATCH(), (index,
  767.                                            UBYTE_TO_FLOAT(v[0]),
  768.                                            UBYTE_TO_FLOAT(v[1]),
  769.                                            UBYTE_TO_FLOAT(v[2])));
  770. }
  771. static void
  772. VertexAttrib3ubvARB(GLuint index, const GLubyte *v)
  773. {
  774.    CALL_VertexAttrib3fARB(GET_DISPATCH(), (index,
  775.                                            (GLfloat)v[0],
  776.                                            (GLfloat)v[1],
  777.                                            (GLfloat)v[2]));
  778. }
  779.  
  780. static void
  781. VertexAttrib4NubvARB(GLuint index, const GLubyte *v)
  782. {
  783.    CALL_VertexAttrib4fARB(GET_DISPATCH(),
  784.                           (index,
  785.                            UBYTE_TO_FLOAT(v[0]),
  786.                            UBYTE_TO_FLOAT(v[1]),
  787.                            UBYTE_TO_FLOAT(v[2]),
  788.                            UBYTE_TO_FLOAT(v[3])));
  789. }
  790.  
  791. static void
  792. VertexAttrib4ubvARB(GLuint index, const GLubyte *v)
  793. {
  794.    CALL_VertexAttrib4fARB(GET_DISPATCH(),
  795.                           (index,
  796.                            (GLfloat)v[0], (GLfloat)v[1],
  797.                            (GLfloat)v[2], (GLfloat)v[3]));
  798. }
  799.  
  800. /* GL_SHORT attributes */
  801.  
  802. static void
  803. VertexAttrib1NsvARB(GLuint index, const GLshort *v)
  804. {
  805.    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, SHORT_TO_FLOAT(v[0])));
  806. }
  807.  
  808. static void
  809. VertexAttrib1svARB(GLuint index, const GLshort *v)
  810. {
  811.    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0]));
  812. }
  813.  
  814. static void
  815. VertexAttrib2NsvARB(GLuint index, const GLshort *v)
  816. {
  817.    CALL_VertexAttrib2fARB(GET_DISPATCH(),
  818.                           (index, SHORT_TO_FLOAT(v[0]),
  819.                            SHORT_TO_FLOAT(v[1])));
  820. }
  821.  
  822. static void
  823. VertexAttrib2svARB(GLuint index, const GLshort *v)
  824. {
  825.    CALL_VertexAttrib2fARB(GET_DISPATCH(),
  826.                           (index, (GLfloat)v[0], (GLfloat)v[1]));
  827. }
  828.  
  829. static void
  830. VertexAttrib3NsvARB(GLuint index, const GLshort *v)
  831. {
  832.    CALL_VertexAttrib3fARB(GET_DISPATCH(),
  833.                           (index,
  834.                            SHORT_TO_FLOAT(v[0]),
  835.                            SHORT_TO_FLOAT(v[1]),
  836.                            SHORT_TO_FLOAT(v[2])));
  837. }
  838.  
  839. static void
  840. VertexAttrib3svARB(GLuint index, const GLshort *v)
  841. {
  842.    CALL_VertexAttrib3fARB(GET_DISPATCH(),
  843.                           (index,
  844.                            (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2]));
  845. }
  846.  
  847. static void
  848. VertexAttrib4NsvARB(GLuint index, const GLshort *v)
  849. {
  850.    CALL_VertexAttrib4fARB(GET_DISPATCH(),
  851.                           (index,
  852.                            SHORT_TO_FLOAT(v[0]),
  853.                            SHORT_TO_FLOAT(v[1]),
  854.                            SHORT_TO_FLOAT(v[2]),
  855.                            SHORT_TO_FLOAT(v[3])));
  856. }
  857.  
  858. static void
  859. VertexAttrib4svARB(GLuint index, const GLshort *v)
  860. {
  861.    CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
  862.                                            (GLfloat)v[2], (GLfloat)v[3]));
  863. }
  864.  
  865. /* GL_UNSIGNED_SHORT attributes */
  866.  
  867. static void
  868. VertexAttrib1NusvARB(GLuint index, const GLushort *v)
  869. {
  870.    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0])));
  871. }
  872.  
  873. static void
  874. VertexAttrib1usvARB(GLuint index, const GLushort *v)
  875. {
  876.    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0]));
  877. }
  878.  
  879. static void
  880. VertexAttrib2NusvARB(GLuint index, const GLushort *v)
  881. {
  882.    CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]),
  883.                              USHORT_TO_FLOAT(v[1])));
  884. }
  885.  
  886. static void
  887. VertexAttrib2usvARB(GLuint index, const GLushort *v)
  888. {
  889.    CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, (GLfloat)v[0],
  890.                                            (GLfloat)v[1]));
  891. }
  892.  
  893. static void
  894. VertexAttrib3NusvARB(GLuint index, const GLushort *v)
  895. {
  896.    CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]),
  897.                                                USHORT_TO_FLOAT(v[1]),
  898.                                                USHORT_TO_FLOAT(v[2])));
  899. }
  900.  
  901. static void
  902. VertexAttrib3usvARB(GLuint index, const GLushort *v)
  903. {
  904.    CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, (GLfloat)v[0],
  905.                                            (GLfloat)v[1], (GLfloat)v[2]));
  906. }
  907.  
  908. static void
  909. VertexAttrib4NusvARB(GLuint index, const GLushort *v)
  910. {
  911.    CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]),
  912.                                                USHORT_TO_FLOAT(v[1]),
  913.                                                USHORT_TO_FLOAT(v[2]),
  914.                                                USHORT_TO_FLOAT(v[3])));
  915. }
  916.  
  917. static void
  918. VertexAttrib4usvARB(GLuint index, const GLushort *v)
  919. {
  920.    CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2], (GLfloat)v[3]));
  921. }
  922.  
  923. /* GL_INT attributes */
  924.  
  925. static void
  926. VertexAttrib1NivARB(GLuint index, const GLint *v)
  927. {
  928.    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0])));
  929. }
  930.  
  931. static void
  932. VertexAttrib1ivARB(GLuint index, const GLint *v)
  933. {
  934.    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0]));
  935. }
  936.  
  937. static void
  938. VertexAttrib2NivARB(GLuint index, const GLint *v)
  939. {
  940.    CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]),
  941.                                                INT_TO_FLOAT(v[1])));
  942. }
  943.  
  944. static void
  945. VertexAttrib2ivARB(GLuint index, const GLint *v)
  946. {
  947.    CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, (GLfloat)v[0],
  948.                                            (GLfloat)v[1]));
  949. }
  950.  
  951. static void
  952. VertexAttrib3NivARB(GLuint index, const GLint *v)
  953. {
  954.    CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]),
  955.                                                INT_TO_FLOAT(v[1]),
  956.                                                INT_TO_FLOAT(v[2])));
  957. }
  958.  
  959. static void
  960. VertexAttrib3ivARB(GLuint index, const GLint *v)
  961. {
  962.    CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, (GLfloat)v[0],
  963.                                            (GLfloat)v[1], (GLfloat)v[2]));
  964. }
  965.  
  966. static void
  967. VertexAttrib4NivARB(GLuint index, const GLint *v)
  968. {
  969.    CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]),
  970.                                                INT_TO_FLOAT(v[1]),
  971.                                                INT_TO_FLOAT(v[2]),
  972.                                                INT_TO_FLOAT(v[3])));
  973. }
  974.  
  975. static void
  976. VertexAttrib4ivARB(GLuint index, const GLint *v)
  977. {
  978.    CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
  979.                                            (GLfloat)v[2], (GLfloat)v[3]));
  980. }
  981.  
  982. /* GL_UNSIGNED_INT attributes */
  983.  
  984. static void
  985. VertexAttrib1NuivARB(GLuint index, const GLuint *v)
  986. {
  987.    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0])));
  988. }
  989.  
  990. static void
  991. VertexAttrib1uivARB(GLuint index, const GLuint *v)
  992. {
  993.    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0]));
  994. }
  995.  
  996. static void
  997. VertexAttrib2NuivARB(GLuint index, const GLuint *v)
  998. {
  999.    CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]),
  1000.                                            UINT_TO_FLOAT(v[1])));
  1001. }
  1002.  
  1003. static void
  1004. VertexAttrib2uivARB(GLuint index, const GLuint *v)
  1005. {
  1006.    CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, (GLfloat)v[0],
  1007.                                            (GLfloat)v[1]));
  1008. }
  1009.  
  1010. static void
  1011. VertexAttrib3NuivARB(GLuint index, const GLuint *v)
  1012. {
  1013.    CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]),
  1014.                                            UINT_TO_FLOAT(v[1]),
  1015.                                            UINT_TO_FLOAT(v[2])));
  1016. }
  1017.  
  1018. static void
  1019. VertexAttrib3uivARB(GLuint index, const GLuint *v)
  1020. {
  1021.    CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, (GLfloat)v[0],
  1022.                                            (GLfloat)v[1], (GLfloat)v[2]));
  1023. }
  1024.  
  1025. static void
  1026. VertexAttrib4NuivARB(GLuint index, const GLuint *v)
  1027. {
  1028.    CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]),
  1029.                                            UINT_TO_FLOAT(v[1]),
  1030.                                            UINT_TO_FLOAT(v[2]),
  1031.                                            UINT_TO_FLOAT(v[3])));
  1032. }
  1033.  
  1034. static void
  1035. VertexAttrib4uivARB(GLuint index, const GLuint *v)
  1036. {
  1037.    CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
  1038.                                            (GLfloat)v[2], (GLfloat)v[3]));
  1039. }
  1040.  
  1041. /* GL_FLOAT attributes */
  1042.  
  1043. static void
  1044. VertexAttrib1fvARB(GLuint index, const GLfloat *v)
  1045. {
  1046.    CALL_VertexAttrib1fvARB(GET_DISPATCH(), (index, v));
  1047. }
  1048.  
  1049. static void
  1050. VertexAttrib2fvARB(GLuint index, const GLfloat *v)
  1051. {
  1052.    CALL_VertexAttrib2fvARB(GET_DISPATCH(), (index, v));
  1053. }
  1054.  
  1055. static void
  1056. VertexAttrib3fvARB(GLuint index, const GLfloat *v)
  1057. {
  1058.    CALL_VertexAttrib3fvARB(GET_DISPATCH(), (index, v));
  1059. }
  1060.  
  1061. static void
  1062. VertexAttrib4fvARB(GLuint index, const GLfloat *v)
  1063. {
  1064.    CALL_VertexAttrib4fvARB(GET_DISPATCH(), (index, v));
  1065. }
  1066.  
  1067. /* GL_DOUBLE attributes */
  1068.  
  1069. static void
  1070. VertexAttrib1dvARB(GLuint index, const GLdouble *v)
  1071. {
  1072.    CALL_VertexAttrib1dvARB(GET_DISPATCH(), (index, v));
  1073. }
  1074.  
  1075. static void
  1076. VertexAttrib2dvARB(GLuint index, const GLdouble *v)
  1077. {
  1078.    CALL_VertexAttrib2dvARB(GET_DISPATCH(), (index, v));
  1079. }
  1080.  
  1081. static void
  1082. VertexAttrib3dvARB(GLuint index, const GLdouble *v)
  1083. {
  1084.    CALL_VertexAttrib3dvARB(GET_DISPATCH(), (index, v));
  1085. }
  1086.  
  1087. static void
  1088. VertexAttrib4dvARB(GLuint index, const GLdouble *v)
  1089. {
  1090.    CALL_VertexAttrib4dvARB(GET_DISPATCH(), (index, v));
  1091. }
  1092.  
  1093.  
  1094. /**
  1095.  * Integer-valued attributes
  1096.  */
  1097. static void
  1098. VertexAttribI1bv(GLuint index, const GLbyte *v)
  1099. {
  1100.    CALL_VertexAttribI1iEXT(GET_DISPATCH(), (index, v[0]));
  1101. }
  1102.  
  1103. static void
  1104. VertexAttribI2bv(GLuint index, const GLbyte *v)
  1105. {
  1106.    CALL_VertexAttribI2iEXT(GET_DISPATCH(), (index, v[0], v[1]));
  1107. }
  1108.  
  1109. static void
  1110. VertexAttribI3bv(GLuint index, const GLbyte *v)
  1111. {
  1112.    CALL_VertexAttribI3iEXT(GET_DISPATCH(), (index, v[0], v[1], v[2]));
  1113. }
  1114.  
  1115. static void
  1116. VertexAttribI4bv(GLuint index, const GLbyte *v)
  1117. {
  1118.    CALL_VertexAttribI4bvEXT(GET_DISPATCH(), (index, v));
  1119. }
  1120.  
  1121.  
  1122. static void
  1123. VertexAttribI1ubv(GLuint index, const GLubyte *v)
  1124. {
  1125.    CALL_VertexAttribI1uiEXT(GET_DISPATCH(), (index, v[0]));
  1126. }
  1127.  
  1128. static void
  1129. VertexAttribI2ubv(GLuint index, const GLubyte *v)
  1130. {
  1131.    CALL_VertexAttribI2uiEXT(GET_DISPATCH(), (index, v[0], v[1]));
  1132. }
  1133.  
  1134. static void
  1135. VertexAttribI3ubv(GLuint index, const GLubyte *v)
  1136. {
  1137.    CALL_VertexAttribI3uiEXT(GET_DISPATCH(), (index, v[0], v[1], v[2]));
  1138. }
  1139.  
  1140. static void
  1141. VertexAttribI4ubv(GLuint index, const GLubyte *v)
  1142. {
  1143.    CALL_VertexAttribI4ubvEXT(GET_DISPATCH(), (index, v));
  1144. }
  1145.  
  1146.  
  1147.  
  1148. static void
  1149. VertexAttribI1sv(GLuint index, const GLshort *v)
  1150. {
  1151.    CALL_VertexAttribI1iEXT(GET_DISPATCH(), (index, v[0]));
  1152. }
  1153.  
  1154. static void
  1155. VertexAttribI2sv(GLuint index, const GLshort *v)
  1156. {
  1157.    CALL_VertexAttribI2iEXT(GET_DISPATCH(), (index, v[0], v[1]));
  1158. }
  1159.  
  1160. static void
  1161. VertexAttribI3sv(GLuint index, const GLshort *v)
  1162. {
  1163.    CALL_VertexAttribI3iEXT(GET_DISPATCH(), (index, v[0], v[1], v[2]));
  1164. }
  1165.  
  1166. static void
  1167. VertexAttribI4sv(GLuint index, const GLshort *v)
  1168. {
  1169.    CALL_VertexAttribI4svEXT(GET_DISPATCH(), (index, v));
  1170. }
  1171.  
  1172.  
  1173. static void
  1174. VertexAttribI1usv(GLuint index, const GLushort *v)
  1175. {
  1176.    CALL_VertexAttribI1uiEXT(GET_DISPATCH(), (index, v[0]));
  1177. }
  1178.  
  1179. static void
  1180. VertexAttribI2usv(GLuint index, const GLushort *v)
  1181. {
  1182.    CALL_VertexAttribI2uiEXT(GET_DISPATCH(), (index, v[0], v[1]));
  1183. }
  1184.  
  1185. static void
  1186. VertexAttribI3usv(GLuint index, const GLushort *v)
  1187. {
  1188.    CALL_VertexAttribI3uiEXT(GET_DISPATCH(), (index, v[0], v[1], v[2]));
  1189. }
  1190.  
  1191. static void
  1192. VertexAttribI4usv(GLuint index, const GLushort *v)
  1193. {
  1194.    CALL_VertexAttribI4usvEXT(GET_DISPATCH(), (index, v));
  1195. }
  1196.  
  1197.  
  1198.  
  1199. static void
  1200. VertexAttribI1iv(GLuint index, const GLint *v)
  1201. {
  1202.    CALL_VertexAttribI1iEXT(GET_DISPATCH(), (index, v[0]));
  1203. }
  1204.  
  1205. static void
  1206. VertexAttribI2iv(GLuint index, const GLint *v)
  1207. {
  1208.    CALL_VertexAttribI2iEXT(GET_DISPATCH(), (index, v[0], v[1]));
  1209. }
  1210.  
  1211. static void
  1212. VertexAttribI3iv(GLuint index, const GLint *v)
  1213. {
  1214.    CALL_VertexAttribI3iEXT(GET_DISPATCH(), (index, v[0], v[1], v[2]));
  1215. }
  1216.  
  1217. static void
  1218. VertexAttribI4iv(GLuint index, const GLint *v)
  1219. {
  1220.    CALL_VertexAttribI4ivEXT(GET_DISPATCH(), (index, v));
  1221. }
  1222.  
  1223.  
  1224. static void
  1225. VertexAttribI1uiv(GLuint index, const GLuint *v)
  1226. {
  1227.    CALL_VertexAttribI1uiEXT(GET_DISPATCH(), (index, v[0]));
  1228. }
  1229.  
  1230. static void
  1231. VertexAttribI2uiv(GLuint index, const GLuint *v)
  1232. {
  1233.    CALL_VertexAttribI2uiEXT(GET_DISPATCH(), (index, v[0], v[1]));
  1234. }
  1235.  
  1236. static void
  1237. VertexAttribI3uiv(GLuint index, const GLuint *v)
  1238. {
  1239.    CALL_VertexAttribI3uiEXT(GET_DISPATCH(), (index, v[0], v[1], v[2]));
  1240. }
  1241.  
  1242. static void
  1243. VertexAttribI4uiv(GLuint index, const GLuint *v)
  1244. {
  1245.    CALL_VertexAttribI4uivEXT(GET_DISPATCH(), (index, v));
  1246. }
  1247.  
  1248.  
  1249.  
  1250.  
  1251. /*
  1252.  * Array [unnormalized/normalized/integer][size][type] of VertexAttrib
  1253.  * functions
  1254.  */
  1255. static attrib_func AttribFuncsARB[3][4][NUM_TYPES] = {
  1256.    {
  1257.       /* non-normalized */
  1258.       {
  1259.          /* size 1 */
  1260.          (attrib_func) VertexAttrib1bvARB,
  1261.          (attrib_func) VertexAttrib1ubvARB,
  1262.          (attrib_func) VertexAttrib1svARB,
  1263.          (attrib_func) VertexAttrib1usvARB,
  1264.          (attrib_func) VertexAttrib1ivARB,
  1265.          (attrib_func) VertexAttrib1uivARB,
  1266.          (attrib_func) VertexAttrib1fvARB,
  1267.          (attrib_func) VertexAttrib1dvARB
  1268.       },
  1269.       {
  1270.          /* size 2 */
  1271.          (attrib_func) VertexAttrib2bvARB,
  1272.          (attrib_func) VertexAttrib2ubvARB,
  1273.          (attrib_func) VertexAttrib2svARB,
  1274.          (attrib_func) VertexAttrib2usvARB,
  1275.          (attrib_func) VertexAttrib2ivARB,
  1276.          (attrib_func) VertexAttrib2uivARB,
  1277.          (attrib_func) VertexAttrib2fvARB,
  1278.          (attrib_func) VertexAttrib2dvARB
  1279.       },
  1280.       {
  1281.          /* size 3 */
  1282.          (attrib_func) VertexAttrib3bvARB,
  1283.          (attrib_func) VertexAttrib3ubvARB,
  1284.          (attrib_func) VertexAttrib3svARB,
  1285.          (attrib_func) VertexAttrib3usvARB,
  1286.          (attrib_func) VertexAttrib3ivARB,
  1287.          (attrib_func) VertexAttrib3uivARB,
  1288.          (attrib_func) VertexAttrib3fvARB,
  1289.          (attrib_func) VertexAttrib3dvARB
  1290.       },
  1291.       {
  1292.          /* size 4 */
  1293.          (attrib_func) VertexAttrib4bvARB,
  1294.          (attrib_func) VertexAttrib4ubvARB,
  1295.          (attrib_func) VertexAttrib4svARB,
  1296.          (attrib_func) VertexAttrib4usvARB,
  1297.          (attrib_func) VertexAttrib4ivARB,
  1298.          (attrib_func) VertexAttrib4uivARB,
  1299.          (attrib_func) VertexAttrib4fvARB,
  1300.          (attrib_func) VertexAttrib4dvARB
  1301.       }
  1302.    },
  1303.    {
  1304.       /* normalized (except for float/double) */
  1305.       {
  1306.          /* size 1 */
  1307.          (attrib_func) VertexAttrib1NbvARB,
  1308.          (attrib_func) VertexAttrib1NubvARB,
  1309.          (attrib_func) VertexAttrib1NsvARB,
  1310.          (attrib_func) VertexAttrib1NusvARB,
  1311.          (attrib_func) VertexAttrib1NivARB,
  1312.          (attrib_func) VertexAttrib1NuivARB,
  1313.          (attrib_func) VertexAttrib1fvARB,
  1314.          (attrib_func) VertexAttrib1dvARB
  1315.       },
  1316.       {
  1317.          /* size 2 */
  1318.          (attrib_func) VertexAttrib2NbvARB,
  1319.          (attrib_func) VertexAttrib2NubvARB,
  1320.          (attrib_func) VertexAttrib2NsvARB,
  1321.          (attrib_func) VertexAttrib2NusvARB,
  1322.          (attrib_func) VertexAttrib2NivARB,
  1323.          (attrib_func) VertexAttrib2NuivARB,
  1324.          (attrib_func) VertexAttrib2fvARB,
  1325.          (attrib_func) VertexAttrib2dvARB
  1326.       },
  1327.       {
  1328.          /* size 3 */
  1329.          (attrib_func) VertexAttrib3NbvARB,
  1330.          (attrib_func) VertexAttrib3NubvARB,
  1331.          (attrib_func) VertexAttrib3NsvARB,
  1332.          (attrib_func) VertexAttrib3NusvARB,
  1333.          (attrib_func) VertexAttrib3NivARB,
  1334.          (attrib_func) VertexAttrib3NuivARB,
  1335.          (attrib_func) VertexAttrib3fvARB,
  1336.          (attrib_func) VertexAttrib3dvARB
  1337.       },
  1338.       {
  1339.          /* size 4 */
  1340.          (attrib_func) VertexAttrib4NbvARB,
  1341.          (attrib_func) VertexAttrib4NubvARB,
  1342.          (attrib_func) VertexAttrib4NsvARB,
  1343.          (attrib_func) VertexAttrib4NusvARB,
  1344.          (attrib_func) VertexAttrib4NivARB,
  1345.          (attrib_func) VertexAttrib4NuivARB,
  1346.          (attrib_func) VertexAttrib4fvARB,
  1347.          (attrib_func) VertexAttrib4dvARB
  1348.       }
  1349.    },
  1350.  
  1351.    {
  1352.       /* integer-valued */
  1353.       {
  1354.          /* size 1 */
  1355.          (attrib_func) VertexAttribI1bv,
  1356.          (attrib_func) VertexAttribI1ubv,
  1357.          (attrib_func) VertexAttribI1sv,
  1358.          (attrib_func) VertexAttribI1usv,
  1359.          (attrib_func) VertexAttribI1iv,
  1360.          (attrib_func) VertexAttribI1uiv,
  1361.          NULL, /* GL_FLOAT */
  1362.          NULL  /* GL_DOUBLE */
  1363.       },
  1364.       {
  1365.          /* size 2 */
  1366.          (attrib_func) VertexAttribI2bv,
  1367.          (attrib_func) VertexAttribI2ubv,
  1368.          (attrib_func) VertexAttribI2sv,
  1369.          (attrib_func) VertexAttribI2usv,
  1370.          (attrib_func) VertexAttribI2iv,
  1371.          (attrib_func) VertexAttribI2uiv,
  1372.          NULL, /* GL_FLOAT */
  1373.          NULL  /* GL_DOUBLE */
  1374.       },
  1375.       {
  1376.          /* size 3 */
  1377.          (attrib_func) VertexAttribI3bv,
  1378.          (attrib_func) VertexAttribI3ubv,
  1379.          (attrib_func) VertexAttribI3sv,
  1380.          (attrib_func) VertexAttribI3usv,
  1381.          (attrib_func) VertexAttribI3iv,
  1382.          (attrib_func) VertexAttribI3uiv,
  1383.          NULL, /* GL_FLOAT */
  1384.          NULL  /* GL_DOUBLE */
  1385.       },
  1386.       {
  1387.          /* size 4 */
  1388.          (attrib_func) VertexAttribI4bv,
  1389.          (attrib_func) VertexAttribI4ubv,
  1390.          (attrib_func) VertexAttribI4sv,
  1391.          (attrib_func) VertexAttribI4usv,
  1392.          (attrib_func) VertexAttribI4iv,
  1393.          (attrib_func) VertexAttribI4uiv,
  1394.          NULL, /* GL_FLOAT */
  1395.          NULL  /* GL_DOUBLE */
  1396.       }
  1397.    }
  1398. };
  1399.  
  1400. /**********************************************************************/
  1401.  
  1402.  
  1403. GLboolean _ae_create_context( struct gl_context *ctx )
  1404. {
  1405.    if (ctx->aelt_context)
  1406.       return GL_TRUE;
  1407.  
  1408.    /* These _gloffset_* values may not be compile-time constants */
  1409.    SecondaryColorFuncs[0] = _gloffset_SecondaryColor3bvEXT;
  1410.    SecondaryColorFuncs[1] = _gloffset_SecondaryColor3ubvEXT;
  1411.    SecondaryColorFuncs[2] = _gloffset_SecondaryColor3svEXT;
  1412.    SecondaryColorFuncs[3] = _gloffset_SecondaryColor3usvEXT;
  1413.    SecondaryColorFuncs[4] = _gloffset_SecondaryColor3ivEXT;
  1414.    SecondaryColorFuncs[5] = _gloffset_SecondaryColor3uivEXT;
  1415.    SecondaryColorFuncs[6] = _gloffset_SecondaryColor3fvEXT;
  1416.    SecondaryColorFuncs[7] = _gloffset_SecondaryColor3dvEXT;
  1417.  
  1418.    FogCoordFuncs[0] = -1;
  1419.    FogCoordFuncs[1] = -1;
  1420.    FogCoordFuncs[2] = -1;
  1421.    FogCoordFuncs[3] = -1;
  1422.    FogCoordFuncs[4] = -1;
  1423.    FogCoordFuncs[5] = -1;
  1424.    FogCoordFuncs[6] = _gloffset_FogCoordfvEXT;
  1425.    FogCoordFuncs[7] = _gloffset_FogCoorddvEXT;
  1426.  
  1427.    ctx->aelt_context = CALLOC( sizeof(AEcontext) );
  1428.    if (!ctx->aelt_context)
  1429.       return GL_FALSE;
  1430.  
  1431.    AE_CONTEXT(ctx)->NewState = ~0;
  1432.    return GL_TRUE;
  1433. }
  1434.  
  1435.  
  1436. void _ae_destroy_context( struct gl_context *ctx )
  1437. {
  1438.    if ( AE_CONTEXT( ctx ) ) {
  1439.       FREE( ctx->aelt_context );
  1440.       ctx->aelt_context = NULL;
  1441.    }
  1442. }
  1443.  
  1444. static void check_vbo( AEcontext *actx,
  1445.                        struct gl_buffer_object *vbo )
  1446. {
  1447.    if (_mesa_is_bufferobj(vbo) && !_mesa_bufferobj_mapped(vbo)) {
  1448.       GLuint i;
  1449.       for (i = 0; i < actx->nr_vbos; i++)
  1450.          if (actx->vbo[i] == vbo)
  1451.             return;
  1452.       assert(actx->nr_vbos < VERT_ATTRIB_MAX);
  1453.       actx->vbo[actx->nr_vbos++] = vbo;
  1454.    }
  1455. }
  1456.  
  1457.  
  1458. /**
  1459.  * Make a list of per-vertex functions to call for each glArrayElement call.
  1460.  * These functions access the array data (i.e. glVertex, glColor, glNormal,
  1461.  * etc).
  1462.  * Note: this may be called during display list construction.
  1463.  */
  1464. static void _ae_update_state( struct gl_context *ctx )
  1465. {
  1466.    AEcontext *actx = AE_CONTEXT(ctx);
  1467.    AEarray *aa = actx->arrays;
  1468.    AEattrib *at = actx->attribs;
  1469.    GLuint i;
  1470.    struct gl_array_object *arrayObj = ctx->Array.ArrayObj;
  1471.  
  1472.    actx->nr_vbos = 0;
  1473.  
  1474.    /* conventional vertex arrays */
  1475.    if (arrayObj->Index.Enabled) {
  1476.       aa->array = &arrayObj->Index;
  1477.       aa->offset = IndexFuncs[TYPE_IDX(aa->array->Type)];
  1478.       check_vbo(actx, aa->array->BufferObj);
  1479.       aa++;
  1480.    }
  1481.    if (arrayObj->EdgeFlag.Enabled) {
  1482.       aa->array = &arrayObj->EdgeFlag;
  1483.       aa->offset = _gloffset_EdgeFlagv;
  1484.       check_vbo(actx, aa->array->BufferObj);
  1485.       aa++;
  1486.    }
  1487.    if (arrayObj->Normal.Enabled) {
  1488.       aa->array = &arrayObj->Normal;
  1489.       aa->offset = NormalFuncs[TYPE_IDX(aa->array->Type)];
  1490.       check_vbo(actx, aa->array->BufferObj);
  1491.       aa++;
  1492.    }
  1493.    if (arrayObj->Color.Enabled) {
  1494.       aa->array = &arrayObj->Color;
  1495.       aa->offset = ColorFuncs[aa->array->Size-3][TYPE_IDX(aa->array->Type)];
  1496.       check_vbo(actx, aa->array->BufferObj);
  1497.       aa++;
  1498.    }
  1499.    if (arrayObj->SecondaryColor.Enabled) {
  1500.       aa->array = &arrayObj->SecondaryColor;
  1501.       aa->offset = SecondaryColorFuncs[TYPE_IDX(aa->array->Type)];
  1502.       check_vbo(actx, aa->array->BufferObj);
  1503.       aa++;
  1504.    }
  1505.    if (arrayObj->FogCoord.Enabled) {
  1506.       aa->array = &arrayObj->FogCoord;
  1507.       aa->offset = FogCoordFuncs[TYPE_IDX(aa->array->Type)];
  1508.       check_vbo(actx, aa->array->BufferObj);
  1509.       aa++;
  1510.    }
  1511.    for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) {
  1512.       struct gl_client_array *attribArray = &arrayObj->TexCoord[i];
  1513.       if (attribArray->Enabled) {
  1514.          /* NOTE: we use generic glVertexAttribNV functions here.
  1515.           * If we ever remove GL_NV_vertex_program this will have to change.
  1516.           */
  1517.          at->array = attribArray;
  1518.          ASSERT(!at->array->Normalized);
  1519.          at->func = AttribFuncsNV[at->array->Normalized]
  1520.                                  [at->array->Size-1]
  1521.                                  [TYPE_IDX(at->array->Type)];
  1522.          at->index = VERT_ATTRIB_TEX0 + i;
  1523.          check_vbo(actx, at->array->BufferObj);
  1524.          at++;
  1525.       }
  1526.    }
  1527.  
  1528.    /* generic vertex attribute arrays */  
  1529.    for (i = 1; i < Elements(arrayObj->VertexAttrib); i++) {  /* skip zero! */
  1530.       struct gl_client_array *attribArray = &arrayObj->VertexAttrib[i];
  1531.       if (attribArray->Enabled) {
  1532.          at->array = attribArray;
  1533.          /* Note: we can't grab the _glapi_Dispatch->VertexAttrib1fvNV
  1534.           * function pointer here (for float arrays) since the pointer may
  1535.           * change from one execution of _ae_ArrayElement() to
  1536.           * the next.  Doing so caused UT to break.
  1537.           */
  1538.          if (ctx->VertexProgram._Enabled
  1539.              && ctx->VertexProgram.Current->IsNVProgram) {
  1540.             at->func = AttribFuncsNV[at->array->Normalized]
  1541.                                     [at->array->Size-1]
  1542.                                     [TYPE_IDX(at->array->Type)];
  1543.          }
  1544.          else {
  1545.             GLint intOrNorm;
  1546.             if (at->array->Integer)
  1547.                intOrNorm = 2;
  1548.             else if (at->array->Normalized)
  1549.                intOrNorm = 1;
  1550.             else
  1551.                intOrNorm = 0;
  1552.  
  1553.             at->func = AttribFuncsARB[intOrNorm]
  1554.                                      [at->array->Size-1]
  1555.                                      [TYPE_IDX(at->array->Type)];
  1556.          }
  1557.          at->index = i;
  1558.          check_vbo(actx, at->array->BufferObj);
  1559.          at++;
  1560.       }
  1561.    }
  1562.  
  1563.    /* finally, vertex position */
  1564.    if (arrayObj->VertexAttrib[0].Enabled) {
  1565.       /* Use glVertex(v) instead of glVertexAttrib(0, v) to be sure it's
  1566.        * issued as the last (provoking) attribute).
  1567.        */
  1568.       aa->array = &arrayObj->VertexAttrib[0];
  1569.       assert(aa->array->Size >= 2); /* XXX fix someday? */
  1570.       aa->offset = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)];
  1571.       check_vbo(actx, aa->array->BufferObj);
  1572.       aa++;
  1573.    }
  1574.    else if (arrayObj->Vertex.Enabled) {
  1575.       aa->array = &arrayObj->Vertex;
  1576.       aa->offset = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)];
  1577.       check_vbo(actx, aa->array->BufferObj);
  1578.       aa++;
  1579.    }
  1580.  
  1581.    check_vbo(actx, ctx->Array.ElementArrayBufferObj);
  1582.  
  1583.    ASSERT(at - actx->attribs <= VERT_ATTRIB_MAX);
  1584.    ASSERT(aa - actx->arrays < 32);
  1585.    at->func = NULL;  /* terminate the list */
  1586.    aa->offset = -1;  /* terminate the list */
  1587.  
  1588.    actx->NewState = 0;
  1589. }
  1590.  
  1591. void _ae_map_vbos( struct gl_context *ctx )
  1592. {
  1593.    AEcontext *actx = AE_CONTEXT(ctx);
  1594.    GLuint i;
  1595.    
  1596.    if (actx->mapped_vbos)
  1597.       return;
  1598.  
  1599.    if (actx->NewState)
  1600.       _ae_update_state(ctx);
  1601.  
  1602.    for (i = 0; i < actx->nr_vbos; i++)
  1603.       ctx->Driver.MapBuffer(ctx,
  1604.                             GL_ARRAY_BUFFER_ARB,
  1605.                             GL_DYNAMIC_DRAW_ARB,
  1606.                             actx->vbo[i]);
  1607.  
  1608.    if (actx->nr_vbos)
  1609.       actx->mapped_vbos = GL_TRUE;
  1610. }
  1611.  
  1612. void _ae_unmap_vbos( struct gl_context *ctx )
  1613. {
  1614.    AEcontext *actx = AE_CONTEXT(ctx);
  1615.    GLuint i;
  1616.  
  1617.    if (!actx->mapped_vbos)
  1618.       return;
  1619.  
  1620.    assert (!actx->NewState);
  1621.  
  1622.    for (i = 0; i < actx->nr_vbos; i++)
  1623.       ctx->Driver.UnmapBuffer(ctx,
  1624.                               GL_ARRAY_BUFFER_ARB,
  1625.                               actx->vbo[i]);
  1626.  
  1627.    actx->mapped_vbos = GL_FALSE;
  1628. }
  1629.  
  1630.  
  1631. /**
  1632.  * Called via glArrayElement() and glDrawArrays().
  1633.  * Issue the glNormal, glVertex, glColor, glVertexAttrib, etc functions
  1634.  * for all enabled vertex arrays (for elt-th element).
  1635.  * Note: this may be called during display list construction.
  1636.  */
  1637. void GLAPIENTRY _ae_ArrayElement( GLint elt )
  1638. {
  1639.    GET_CURRENT_CONTEXT(ctx);
  1640.    const AEcontext *actx = AE_CONTEXT(ctx);
  1641.    const AEarray *aa;
  1642.    const AEattrib *at;
  1643.    const struct _glapi_table * const disp = GET_DISPATCH();
  1644.    GLboolean do_map;
  1645.  
  1646.    if (actx->NewState) {
  1647.       assert(!actx->mapped_vbos);
  1648.       _ae_update_state( ctx );
  1649.    }
  1650.  
  1651.    /* Determine if w need to map/unmap VBOs */
  1652.    do_map = actx->nr_vbos && !actx->mapped_vbos;
  1653.  
  1654.    if (do_map)
  1655.       _ae_map_vbos(ctx);
  1656.    
  1657.    /* emit generic attribute elements */
  1658.    for (at = actx->attribs; at->func; at++) {
  1659.       const GLubyte *src
  1660.          = ADD_POINTERS(at->array->BufferObj->Pointer, at->array->Ptr)
  1661.          + elt * at->array->StrideB;
  1662.       at->func( at->index, src );
  1663.    }
  1664.  
  1665.    /* emit conventional arrays elements */
  1666.    for (aa = actx->arrays; aa->offset != -1 ; aa++) {
  1667.       const GLubyte *src
  1668.          = ADD_POINTERS(aa->array->BufferObj->Pointer, aa->array->Ptr)
  1669.          + elt * aa->array->StrideB;
  1670.       CALL_by_offset( disp, (array_func), aa->offset,
  1671.                       ((const void *) src) );
  1672.    }
  1673.  
  1674.    if (do_map)
  1675.       _ae_unmap_vbos(ctx);
  1676. }
  1677.  
  1678.  
  1679. void _ae_invalidate_state( struct gl_context *ctx, GLuint new_state )
  1680. {
  1681.    AEcontext *actx = AE_CONTEXT(ctx);
  1682.  
  1683.    
  1684.    /* Only interested in this subset of mesa state.  Need to prune
  1685.     * this down as both tnl/ and the drivers can raise statechanges
  1686.     * for arcane reasons in the middle of seemingly atomic operations
  1687.     * like DrawElements, over which we'd like to keep a known set of
  1688.     * arrays and vbo's mapped.  
  1689.     *
  1690.     * Luckily, neither the drivers nor tnl muck with the state that
  1691.     * concerns us here:
  1692.     */
  1693.    new_state &= _NEW_ARRAY | _NEW_PROGRAM;
  1694.    if (new_state) {
  1695.       assert(!actx->mapped_vbos);
  1696.       actx->NewState |= new_state;
  1697.    }
  1698. }
  1699.  
  1700.  
  1701. void _mesa_install_arrayelt_vtxfmt(struct _glapi_table *disp,
  1702.                                    const GLvertexformat *vfmt)
  1703. {
  1704.    SET_ArrayElement(disp, vfmt->ArrayElement);
  1705. }
  1706.  
  1707.  
  1708. #endif /* FEATURE_arrayelt */
  1709.