Subversion Repositories Kolibri OS

Rev

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

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