--- /dev/null
+/*
+ * Copyright © 2012 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include <gtest/gtest.h>
+#include <GL/gl.h>
+
+extern "C" {
+#include "glapi/glapi.h"
+#include "glapi/glapitable.h"
+}
+
+struct name_offset {
+ const char *name;
+ int offset;
+};
+
+extern const struct name_offset linux_gl_abi[];
+
+TEST(GetProcAddress, ABIOffsetByName)
+{
+ /* 408 functions have had their locations in the dispatch table set since
+ * the dawn of time. Verify that all of these functions are at the correct
+ * locations.
+ */
+ for (unsigned i = 0; linux_gl_abi[i].name != NULL; i++) {
+ EXPECT_EQ(linux_gl_abi[i].offset,
+ _glapi_get_proc_offset(linux_gl_abi[i].name))
+ << "function name: " << linux_gl_abi[i].name;
+ }
+}
+
+TEST(GetProcAddress, TableBigEnoughForABI)
+{
+ /* FINISHME: This should check that the dispatch table is large enough to
+ * FINISHME: hold all of the unique functions for OpenGL 1.2, OpenGL ES
+ * FINISHME: 1.1, and OpenGL ES 2.0.
+ */
+ EXPECT_LT(408u, _glapi_get_dispatch_table_size());
+}
+
+const struct name_offset linux_gl_abi[] = {
+ { "glNewList", 0 },
+ { "glEndList", 1 },
+ { "glCallList", 2 },
+ { "glCallLists", 3 },
+ { "glDeleteLists", 4 },
+ { "glGenLists", 5 },
+ { "glListBase", 6 },
+ { "glBegin", 7 },
+ { "glBitmap", 8 },
+ { "glColor3b", 9 },
+ { "glColor3bv", 10 },
+ { "glColor3d", 11 },
+ { "glColor3dv", 12 },
+ { "glColor3f", 13 },
+ { "glColor3fv", 14 },
+ { "glColor3i", 15 },
+ { "glColor3iv", 16 },
+ { "glColor3s", 17 },
+ { "glColor3sv", 18 },
+ { "glColor3ub", 19 },
+ { "glColor3ubv", 20 },
+ { "glColor3ui", 21 },
+ { "glColor3uiv", 22 },
+ { "glColor3us", 23 },
+ { "glColor3usv", 24 },
+ { "glColor4b", 25 },
+ { "glColor4bv", 26 },
+ { "glColor4d", 27 },
+ { "glColor4dv", 28 },
+ { "glColor4f", 29 },
+ { "glColor4fv", 30 },
+ { "glColor4i", 31 },
+ { "glColor4iv", 32 },
+ { "glColor4s", 33 },
+ { "glColor4sv", 34 },
+ { "glColor4ub", 35 },
+ { "glColor4ubv", 36 },
+ { "glColor4ui", 37 },
+ { "glColor4uiv", 38 },
+ { "glColor4us", 39 },
+ { "glColor4usv", 40 },
+ { "glEdgeFlag", 41 },
+ { "glEdgeFlagv", 42 },
+ { "glEnd", 43 },
+ { "glIndexd", 44 },
+ { "glIndexdv", 45 },
+ { "glIndexf", 46 },
+ { "glIndexfv", 47 },
+ { "glIndexi", 48 },
+ { "glIndexiv", 49 },
+ { "glIndexs", 50 },
+ { "glIndexsv", 51 },
+ { "glNormal3b", 52 },
+ { "glNormal3bv", 53 },
+ { "glNormal3d", 54 },
+ { "glNormal3dv", 55 },
+ { "glNormal3f", 56 },
+ { "glNormal3fv", 57 },
+ { "glNormal3i", 58 },
+ { "glNormal3iv", 59 },
+ { "glNormal3s", 60 },
+ { "glNormal3sv", 61 },
+ { "glRasterPos2d", 62 },
+ { "glRasterPos2dv", 63 },
+ { "glRasterPos2f", 64 },
+ { "glRasterPos2fv", 65 },
+ { "glRasterPos2i", 66 },
+ { "glRasterPos2iv", 67 },
+ { "glRasterPos2s", 68 },
+ { "glRasterPos2sv", 69 },
+ { "glRasterPos3d", 70 },
+ { "glRasterPos3dv", 71 },
+ { "glRasterPos3f", 72 },
+ { "glRasterPos3fv", 73 },
+ { "glRasterPos3i", 74 },
+ { "glRasterPos3iv", 75 },
+ { "glRasterPos3s", 76 },
+ { "glRasterPos3sv", 77 },
+ { "glRasterPos4d", 78 },
+ { "glRasterPos4dv", 79 },
+ { "glRasterPos4f", 80 },
+ { "glRasterPos4fv", 81 },
+ { "glRasterPos4i", 82 },
+ { "glRasterPos4iv", 83 },
+ { "glRasterPos4s", 84 },
+ { "glRasterPos4sv", 85 },
+ { "glRectd", 86 },
+ { "glRectdv", 87 },
+ { "glRectf", 88 },
+ { "glRectfv", 89 },
+ { "glRecti", 90 },
+ { "glRectiv", 91 },
+ { "glRects", 92 },
+ { "glRectsv", 93 },
+ { "glTexCoord1d", 94 },
+ { "glTexCoord1dv", 95 },
+ { "glTexCoord1f", 96 },
+ { "glTexCoord1fv", 97 },
+ { "glTexCoord1i", 98 },
+ { "glTexCoord1iv", 99 },
+ { "glTexCoord1s", 100 },
+ { "glTexCoord1sv", 101 },
+ { "glTexCoord2d", 102 },
+ { "glTexCoord2dv", 103 },
+ { "glTexCoord2f", 104 },
+ { "glTexCoord2fv", 105 },
+ { "glTexCoord2i", 106 },
+ { "glTexCoord2iv", 107 },
+ { "glTexCoord2s", 108 },
+ { "glTexCoord2sv", 109 },
+ { "glTexCoord3d", 110 },
+ { "glTexCoord3dv", 111 },
+ { "glTexCoord3f", 112 },
+ { "glTexCoord3fv", 113 },
+ { "glTexCoord3i", 114 },
+ { "glTexCoord3iv", 115 },
+ { "glTexCoord3s", 116 },
+ { "glTexCoord3sv", 117 },
+ { "glTexCoord4d", 118 },
+ { "glTexCoord4dv", 119 },
+ { "glTexCoord4f", 120 },
+ { "glTexCoord4fv", 121 },
+ { "glTexCoord4i", 122 },
+ { "glTexCoord4iv", 123 },
+ { "glTexCoord4s", 124 },
+ { "glTexCoord4sv", 125 },
+ { "glVertex2d", 126 },
+ { "glVertex2dv", 127 },
+ { "glVertex2f", 128 },
+ { "glVertex2fv", 129 },
+ { "glVertex2i", 130 },
+ { "glVertex2iv", 131 },
+ { "glVertex2s", 132 },
+ { "glVertex2sv", 133 },
+ { "glVertex3d", 134 },
+ { "glVertex3dv", 135 },
+ { "glVertex3f", 136 },
+ { "glVertex3fv", 137 },
+ { "glVertex3i", 138 },
+ { "glVertex3iv", 139 },
+ { "glVertex3s", 140 },
+ { "glVertex3sv", 141 },
+ { "glVertex4d", 142 },
+ { "glVertex4dv", 143 },
+ { "glVertex4f", 144 },
+ { "glVertex4fv", 145 },
+ { "glVertex4i", 146 },
+ { "glVertex4iv", 147 },
+ { "glVertex4s", 148 },
+ { "glVertex4sv", 149 },
+ { "glClipPlane", 150 },
+ { "glColorMaterial", 151 },
+ { "glCullFace", 152 },
+ { "glFogf", 153 },
+ { "glFogfv", 154 },
+ { "glFogi", 155 },
+ { "glFogiv", 156 },
+ { "glFrontFace", 157 },
+ { "glHint", 158 },
+ { "glLightf", 159 },
+ { "glLightfv", 160 },
+ { "glLighti", 161 },
+ { "glLightiv", 162 },
+ { "glLightModelf", 163 },
+ { "glLightModelfv", 164 },
+ { "glLightModeli", 165 },
+ { "glLightModeliv", 166 },
+ { "glLineStipple", 167 },
+ { "glLineWidth", 168 },
+ { "glMaterialf", 169 },
+ { "glMaterialfv", 170 },
+ { "glMateriali", 171 },
+ { "glMaterialiv", 172 },
+ { "glPointSize", 173 },
+ { "glPolygonMode", 174 },
+ { "glPolygonStipple", 175 },
+ { "glScissor", 176 },
+ { "glShadeModel", 177 },
+ { "glTexParameterf", 178 },
+ { "glTexParameterfv", 179 },
+ { "glTexParameteri", 180 },
+ { "glTexParameteriv", 181 },
+ { "glTexImage1D", 182 },
+ { "glTexImage2D", 183 },
+ { "glTexEnvf", 184 },
+ { "glTexEnvfv", 185 },
+ { "glTexEnvi", 186 },
+ { "glTexEnviv", 187 },
+ { "glTexGend", 188 },
+ { "glTexGendv", 189 },
+ { "glTexGenf", 190 },
+ { "glTexGenfv", 191 },
+ { "glTexGeni", 192 },
+ { "glTexGeniv", 193 },
+ { "glFeedbackBuffer", 194 },
+ { "glSelectBuffer", 195 },
+ { "glRenderMode", 196 },
+ { "glInitNames", 197 },
+ { "glLoadName", 198 },
+ { "glPassThrough", 199 },
+ { "glPopName", 200 },
+ { "glPushName", 201 },
+ { "glDrawBuffer", 202 },
+ { "glClear", 203 },
+ { "glClearAccum", 204 },
+ { "glClearIndex", 205 },
+ { "glClearColor", 206 },
+ { "glClearStencil", 207 },
+ { "glClearDepth", 208 },
+ { "glStencilMask", 209 },
+ { "glColorMask", 210 },
+ { "glDepthMask", 211 },
+ { "glIndexMask", 212 },
+ { "glAccum", 213 },
+ { "glDisable", 214 },
+ { "glEnable", 215 },
+ { "glFinish", 216 },
+ { "glFlush", 217 },
+ { "glPopAttrib", 218 },
+ { "glPushAttrib", 219 },
+ { "glMap1d", 220 },
+ { "glMap1f", 221 },
+ { "glMap2d", 222 },
+ { "glMap2f", 223 },
+ { "glMapGrid1d", 224 },
+ { "glMapGrid1f", 225 },
+ { "glMapGrid2d", 226 },
+ { "glMapGrid2f", 227 },
+ { "glEvalCoord1d", 228 },
+ { "glEvalCoord1dv", 229 },
+ { "glEvalCoord1f", 230 },
+ { "glEvalCoord1fv", 231 },
+ { "glEvalCoord2d", 232 },
+ { "glEvalCoord2dv", 233 },
+ { "glEvalCoord2f", 234 },
+ { "glEvalCoord2fv", 235 },
+ { "glEvalMesh1", 236 },
+ { "glEvalPoint1", 237 },
+ { "glEvalMesh2", 238 },
+ { "glEvalPoint2", 239 },
+ { "glAlphaFunc", 240 },
+ { "glBlendFunc", 241 },
+ { "glLogicOp", 242 },
+ { "glStencilFunc", 243 },
+ { "glStencilOp", 244 },
+ { "glDepthFunc", 245 },
+ { "glPixelZoom", 246 },
+ { "glPixelTransferf", 247 },
+ { "glPixelTransferi", 248 },
+ { "glPixelStoref", 249 },
+ { "glPixelStorei", 250 },
+ { "glPixelMapfv", 251 },
+ { "glPixelMapuiv", 252 },
+ { "glPixelMapusv", 253 },
+ { "glReadBuffer", 254 },
+ { "glCopyPixels", 255 },
+ { "glReadPixels", 256 },
+ { "glDrawPixels", 257 },
+ { "glGetBooleanv", 258 },
+ { "glGetClipPlane", 259 },
+ { "glGetDoublev", 260 },
+ { "glGetError", 261 },
+ { "glGetFloatv", 262 },
+ { "glGetIntegerv", 263 },
+ { "glGetLightfv", 264 },
+ { "glGetLightiv", 265 },
+ { "glGetMapdv", 266 },
+ { "glGetMapfv", 267 },
+ { "glGetMapiv", 268 },
+ { "glGetMaterialfv", 269 },
+ { "glGetMaterialiv", 270 },
+ { "glGetPixelMapfv", 271 },
+ { "glGetPixelMapuiv", 272 },
+ { "glGetPixelMapusv", 273 },
+ { "glGetPolygonStipple", 274 },
+ { "glGetString", 275 },
+ { "glGetTexEnvfv", 276 },
+ { "glGetTexEnviv", 277 },
+ { "glGetTexGendv", 278 },
+ { "glGetTexGenfv", 279 },
+ { "glGetTexGeniv", 280 },
+ { "glGetTexImage", 281 },
+ { "glGetTexParameterfv", 282 },
+ { "glGetTexParameteriv", 283 },
+ { "glGetTexLevelParameterfv", 284 },
+ { "glGetTexLevelParameteriv", 285 },
+ { "glIsEnabled", 286 },
+ { "glIsList", 287 },
+ { "glDepthRange", 288 },
+ { "glFrustum", 289 },
+ { "glLoadIdentity", 290 },
+ { "glLoadMatrixf", 291 },
+ { "glLoadMatrixd", 292 },
+ { "glMatrixMode", 293 },
+ { "glMultMatrixf", 294 },
+ { "glMultMatrixd", 295 },
+ { "glOrtho", 296 },
+ { "glPopMatrix", 297 },
+ { "glPushMatrix", 298 },
+ { "glRotated", 299 },
+ { "glRotatef", 300 },
+ { "glScaled", 301 },
+ { "glScalef", 302 },
+ { "glTranslated", 303 },
+ { "glTranslatef", 304 },
+ { "glViewport", 305 },
+ { "glArrayElement", 306 },
+ { "glColorPointer", 308 },
+ { "glDisableClientState", 309 },
+ { "glDrawArrays", 310 },
+ { "glDrawElements", 311 },
+ { "glEdgeFlagPointer", 312 },
+ { "glEnableClientState", 313 },
+ { "glGetPointerv", 329 },
+ { "glIndexPointer", 314 },
+ { "glInterleavedArrays", 317 },
+ { "glNormalPointer", 318 },
+ { "glTexCoordPointer", 320 },
+ { "glVertexPointer", 321 },
+ { "glPolygonOffset", 319 },
+ { "glCopyTexImage1D", 323 },
+ { "glCopyTexImage2D", 324 },
+ { "glCopyTexSubImage1D", 325 },
+ { "glCopyTexSubImage2D", 326 },
+ { "glTexSubImage1D", 332 },
+ { "glTexSubImage2D", 333 },
+ { "glAreTexturesResident", 322 },
+ { "glBindTexture", 307 },
+ { "glDeleteTextures", 327 },
+ { "glGenTextures", 328 },
+ { "glIsTexture", 330 },
+ { "glPrioritizeTextures", 331 },
+ { "glIndexub", 315 },
+ { "glIndexubv", 316 },
+ { "glPopClientAttrib", 334 },
+ { "glPushClientAttrib", 335 },
+ { "glBlendColor", 336 },
+ { "glBlendEquation", 337 },
+ { "glDrawRangeElements", 338 },
+ { "glColorTable", 339 },
+ { "glColorTableParameterfv", 340 },
+ { "glColorTableParameteriv", 341 },
+ { "glCopyColorTable", 342 },
+ { "glGetColorTable", 343 },
+ { "glGetColorTableParameterfv", 344 },
+ { "glGetColorTableParameteriv", 345 },
+ { "glColorSubTable", 346 },
+ { "glCopyColorSubTable", 347 },
+ { "glConvolutionFilter1D", 348 },
+ { "glConvolutionFilter2D", 349 },
+ { "glConvolutionParameterf", 350 },
+ { "glConvolutionParameterfv", 351 },
+ { "glConvolutionParameteri", 352 },
+ { "glConvolutionParameteriv", 353 },
+ { "glCopyConvolutionFilter1D", 354 },
+ { "glCopyConvolutionFilter2D", 355 },
+ { "glGetConvolutionFilter", 356 },
+ { "glGetConvolutionParameterfv", 357 },
+ { "glGetConvolutionParameteriv", 358 },
+ { "glGetSeparableFilter", 359 },
+ { "glSeparableFilter2D", 360 },
+ { "glGetHistogram", 361 },
+ { "glGetHistogramParameterfv", 362 },
+ { "glGetHistogramParameteriv", 363 },
+ { "glGetMinmax", 364 },
+ { "glGetMinmaxParameterfv", 365 },
+ { "glGetMinmaxParameteriv", 366 },
+ { "glHistogram", 367 },
+ { "glMinmax", 368 },
+ { "glResetHistogram", 369 },
+ { "glResetMinmax", 370 },
+ { "glTexImage3D", 371 },
+ { "glTexSubImage3D", 372 },
+ { "glCopyTexSubImage3D", 373 },
+ { "glActiveTextureARB", 374 },
+ { "glClientActiveTextureARB", 375 },
+ { "glMultiTexCoord1dARB", 376 },
+ { "glMultiTexCoord1dvARB", 377 },
+ { "glMultiTexCoord1fARB", 378 },
+ { "glMultiTexCoord1fvARB", 379 },
+ { "glMultiTexCoord1iARB", 380 },
+ { "glMultiTexCoord1ivARB", 381 },
+ { "glMultiTexCoord1sARB", 382 },
+ { "glMultiTexCoord1svARB", 383 },
+ { "glMultiTexCoord2dARB", 384 },
+ { "glMultiTexCoord2dvARB", 385 },
+ { "glMultiTexCoord2fARB", 386 },
+ { "glMultiTexCoord2fvARB", 387 },
+ { "glMultiTexCoord2iARB", 388 },
+ { "glMultiTexCoord2ivARB", 389 },
+ { "glMultiTexCoord2sARB", 390 },
+ { "glMultiTexCoord2svARB", 391 },
+ { "glMultiTexCoord3dARB", 392 },
+ { "glMultiTexCoord3dvARB", 393 },
+ { "glMultiTexCoord3fARB", 394 },
+ { "glMultiTexCoord3fvARB", 395 },
+ { "glMultiTexCoord3iARB", 396 },
+ { "glMultiTexCoord3ivARB", 397 },
+ { "glMultiTexCoord3sARB", 398 },
+ { "glMultiTexCoord3svARB", 399 },
+ { "glMultiTexCoord4dARB", 400 },
+ { "glMultiTexCoord4dvARB", 401 },
+ { "glMultiTexCoord4fARB", 402 },
+ { "glMultiTexCoord4fvARB", 403 },
+ { "glMultiTexCoord4iARB", 404 },
+ { "glMultiTexCoord4ivARB", 405 },
+ { "glMultiTexCoord4sARB", 406 },
+ { "glMultiTexCoord4svARB", 407 },
+ { NULL, 0 }
+};