/*
 * Mesa 3-D graphics library
 *
 * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
 *
 * 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 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.
 */



#ifndef API_LOOPBACK_H
#define API_LOOPBACK_H

#include "main/compiler.h"
#include "main/glheader.h" // ?
#include "main/macros.h" // ?
#include "main/mtypes.h" // ?
#include "glapi/glapi.h" // ?
#include "glapi/glthread.h" // ?
#include "main/dispatch.h" // ?
#include "main/context.h" // ?

struct _glapi_table;
struct gl_context;

extern void
_mesa_loopback_init_api_table(const struct gl_context *ctx,
                              struct _glapi_table *dest);
void GLAPIENTRY
_mesa_Color3b( GLbyte red, GLbyte green, GLbyte blue );
void GLAPIENTRY
_mesa_Color3d( GLdouble red, GLdouble green, GLdouble blue );
void GLAPIENTRY
_mesa_Color3i( GLint red, GLint green, GLint blue );
void GLAPIENTRY
_mesa_Color3s( GLshort red, GLshort green, GLshort blue );
void GLAPIENTRY
_mesa_Color3ui( GLuint red, GLuint green, GLuint blue );
void GLAPIENTRY
_mesa_Color3us( GLushort red, GLushort green, GLushort blue );
void GLAPIENTRY
_mesa_Color3ub( GLubyte red, GLubyte green, GLubyte blue );
void GLAPIENTRY
_mesa_Color3bv( const GLbyte *v );
void GLAPIENTRY
_mesa_Color3dv( const GLdouble *v );
void GLAPIENTRY
_mesa_Color3iv( const GLint *v );
void GLAPIENTRY
_mesa_Color3sv( const GLshort *v );
void GLAPIENTRY
_mesa_Color3uiv( const GLuint *v );
void GLAPIENTRY
_mesa_Color3usv( const GLushort *v );
void GLAPIENTRY
_mesa_Color3ubv( const GLubyte *v );
void GLAPIENTRY
_mesa_Color4b( GLbyte red, GLbyte green, GLbyte blue,
                    GLbyte alpha );
void GLAPIENTRY
_mesa_Color4d( GLdouble red, GLdouble green, GLdouble blue,
                    GLdouble alpha );
void GLAPIENTRY
_mesa_Color4i( GLint red, GLint green, GLint blue, GLint alpha );
void GLAPIENTRY
_mesa_Color4s( GLshort red, GLshort green, GLshort blue,
                    GLshort alpha );
void GLAPIENTRY
_mesa_Color4ui( GLuint red, GLuint green, GLuint blue, GLuint alpha );
void GLAPIENTRY
_mesa_Color4us( GLushort red, GLushort green, GLushort blue,
                     GLushort alpha );
void GLAPIENTRY
_mesa_Color4ub( GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha );
void GLAPIENTRY
_mesa_Color4iv( const GLint *v );
void GLAPIENTRY
_mesa_Color4bv( const GLbyte *v );
void GLAPIENTRY
_mesa_Color4dv( const GLdouble *v );
void GLAPIENTRY
_mesa_Color4sv( const GLshort *v);
void GLAPIENTRY
_mesa_Color4uiv( const GLuint *v);
void GLAPIENTRY
_mesa_Color4usv( const GLushort *v);
void GLAPIENTRY
_mesa_Color4ubv( const GLubyte *v);
void GLAPIENTRY
_mesa_FogCoordd( GLdouble d );
void GLAPIENTRY
_mesa_FogCoorddv( const GLdouble *v );
void GLAPIENTRY
_mesa_Indexd( GLdouble c );
void GLAPIENTRY
_mesa_Indexi( GLint c );
void GLAPIENTRY
_mesa_Indexs( GLshort c );
void GLAPIENTRY
_mesa_Indexub( GLubyte c );
void GLAPIENTRY
_mesa_Indexdv( const GLdouble *c );
void GLAPIENTRY
_mesa_Indexiv( const GLint *c );
void GLAPIENTRY
_mesa_Indexsv( const GLshort *c );
void GLAPIENTRY
_mesa_Indexubv( const GLubyte *c );
void GLAPIENTRY
_mesa_EdgeFlagv(const GLboolean *flag);
void GLAPIENTRY
_mesa_Normal3b( GLbyte nx, GLbyte ny, GLbyte nz );
void GLAPIENTRY
_mesa_Normal3d( GLdouble nx, GLdouble ny, GLdouble nz );
void GLAPIENTRY
_mesa_Normal3i( GLint nx, GLint ny, GLint nz );
void GLAPIENTRY
_mesa_Normal3s( GLshort nx, GLshort ny, GLshort nz );
void GLAPIENTRY
_mesa_Normal3bv( const GLbyte *v );
void GLAPIENTRY
_mesa_Normal3dv( const GLdouble *v );
void GLAPIENTRY
_mesa_Normal3iv( const GLint *v );
void GLAPIENTRY
_mesa_Normal3sv( const GLshort *v );
void GLAPIENTRY
_mesa_TexCoord1d( GLdouble s );
void GLAPIENTRY
_mesa_TexCoord1i( GLint s );
void GLAPIENTRY
_mesa_TexCoord1s( GLshort s );
void GLAPIENTRY
_mesa_TexCoord2d( GLdouble s, GLdouble t );
void GLAPIENTRY
_mesa_TexCoord2s( GLshort s, GLshort t );
void GLAPIENTRY
_mesa_TexCoord2i( GLint s, GLint t );
void GLAPIENTRY
_mesa_TexCoord3d( GLdouble s, GLdouble t, GLdouble r );
void GLAPIENTRY
_mesa_TexCoord3i( GLint s, GLint t, GLint r );
void GLAPIENTRY
_mesa_TexCoord3s( GLshort s, GLshort t, GLshort r );
void GLAPIENTRY
_mesa_TexCoord4d( GLdouble s, GLdouble t, GLdouble r, GLdouble q );
void GLAPIENTRY
_mesa_TexCoord4i( GLint s, GLint t, GLint r, GLint q );
void GLAPIENTRY
_mesa_TexCoord4s( GLshort s, GLshort t, GLshort r, GLshort q );
void GLAPIENTRY
_mesa_TexCoord1dv( const GLdouble *v );
void GLAPIENTRY
_mesa_TexCoord1iv( const GLint *v );
void GLAPIENTRY
_mesa_TexCoord1sv( const GLshort *v );
void GLAPIENTRY
_mesa_TexCoord2dv( const GLdouble *v );
void GLAPIENTRY
_mesa_TexCoord2iv( const GLint *v );
void GLAPIENTRY
_mesa_TexCoord2sv( const GLshort *v );
void GLAPIENTRY
_mesa_TexCoord3dv( const GLdouble *v );
void GLAPIENTRY
_mesa_TexCoord3iv( const GLint *v );
void GLAPIENTRY
_mesa_TexCoord3sv( const GLshort *v );
void GLAPIENTRY
_mesa_TexCoord4dv( const GLdouble *v );
void GLAPIENTRY
_mesa_TexCoord4iv( const GLint *v );
void GLAPIENTRY
_mesa_TexCoord4sv( const GLshort *v );
void GLAPIENTRY
_mesa_Vertex2d( GLdouble x, GLdouble y );
void GLAPIENTRY
_mesa_Vertex2i( GLint x, GLint y );
void GLAPIENTRY
_mesa_Vertex2s( GLshort x, GLshort y );
void GLAPIENTRY
_mesa_Vertex3d( GLdouble x, GLdouble y, GLdouble z );
void GLAPIENTRY
_mesa_Vertex3i( GLint x, GLint y, GLint z );
void GLAPIENTRY
_mesa_Vertex3s( GLshort x, GLshort y, GLshort z );
void GLAPIENTRY
_mesa_Vertex4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w );
void GLAPIENTRY
_mesa_Vertex4i( GLint x, GLint y, GLint z, GLint w );
void GLAPIENTRY
_mesa_Vertex4s( GLshort x, GLshort y, GLshort z, GLshort w );
void GLAPIENTRY
_mesa_Vertex2dv( const GLdouble *v );
void GLAPIENTRY
_mesa_Vertex2iv( const GLint *v );
void GLAPIENTRY
_mesa_Vertex2sv( const GLshort *v );
void GLAPIENTRY
_mesa_Vertex3dv( const GLdouble *v );
void GLAPIENTRY
_mesa_Vertex3iv( const GLint *v );
void GLAPIENTRY
_mesa_Vertex3sv( const GLshort *v );
void GLAPIENTRY
_mesa_Vertex4dv( const GLdouble *v );
void GLAPIENTRY
_mesa_Vertex4iv( const GLint *v );
void GLAPIENTRY
_mesa_Vertex4sv( const GLshort *v );
void GLAPIENTRY
_mesa_MultiTexCoord1d(GLenum target, GLdouble s);
void GLAPIENTRY
_mesa_MultiTexCoord1dv(GLenum target, const GLdouble *v);
void GLAPIENTRY
_mesa_MultiTexCoord1i(GLenum target, GLint s);
void GLAPIENTRY
_mesa_MultiTexCoord1iv(GLenum target, const GLint *v);
void GLAPIENTRY
_mesa_MultiTexCoord1s(GLenum target, GLshort s);
void GLAPIENTRY
_mesa_MultiTexCoord1sv(GLenum target, const GLshort *v);
void GLAPIENTRY
_mesa_MultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
void GLAPIENTRY
_mesa_MultiTexCoord2dv(GLenum target, const GLdouble *v);
void GLAPIENTRY
_mesa_MultiTexCoord2i(GLenum target, GLint s, GLint t);
void GLAPIENTRY
_mesa_MultiTexCoord2iv(GLenum target, const GLint *v);
void GLAPIENTRY
_mesa_MultiTexCoord2s(GLenum target, GLshort s, GLshort t);
void GLAPIENTRY
_mesa_MultiTexCoord2sv(GLenum target, const GLshort *v);
void GLAPIENTRY
_mesa_MultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
void GLAPIENTRY
_mesa_MultiTexCoord3dv(GLenum target, const GLdouble *v);
void GLAPIENTRY
_mesa_MultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
void GLAPIENTRY
_mesa_MultiTexCoord3iv(GLenum target, const GLint *v);
void GLAPIENTRY
_mesa_MultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
void GLAPIENTRY
_mesa_MultiTexCoord3sv(GLenum target, const GLshort *v);
void GLAPIENTRY
_mesa_MultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r,
                            GLdouble q);
void GLAPIENTRY
_mesa_MultiTexCoord4dv(GLenum target, const GLdouble *v);
void GLAPIENTRY
_mesa_MultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
void GLAPIENTRY
_mesa_MultiTexCoord4iv(GLenum target, const GLint *v);
void GLAPIENTRY
_mesa_MultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r,
                            GLshort q);
void GLAPIENTRY
_mesa_MultiTexCoord4sv(GLenum target, const GLshort *v);
void GLAPIENTRY
_mesa_EvalCoord2dv( const GLdouble *u );
void GLAPIENTRY
_mesa_EvalCoord2fv( const GLfloat *u );
void GLAPIENTRY
_mesa_EvalCoord2d( GLdouble u, GLdouble v );
void GLAPIENTRY
_mesa_EvalCoord1dv( const GLdouble *u );
void GLAPIENTRY
_mesa_EvalCoord1fv( const GLfloat *u );
void GLAPIENTRY
_mesa_EvalCoord1d( GLdouble u );
void GLAPIENTRY
_mesa_Materialf( GLenum face, GLenum pname, GLfloat param );
void GLAPIENTRY
_mesa_Materiali(GLenum face, GLenum pname, GLint param );
void GLAPIENTRY
_mesa_Materialiv(GLenum face, GLenum pname, const GLint *params );
void GLAPIENTRY
_mesa_Rectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
void GLAPIENTRY
_mesa_Rectdv(const GLdouble *v1, const GLdouble *v2);
void GLAPIENTRY
_mesa_Rectfv(const GLfloat *v1, const GLfloat *v2);
void GLAPIENTRY
_mesa_Recti(GLint x1, GLint y1, GLint x2, GLint y2);
void GLAPIENTRY
_mesa_Rectiv(const GLint *v1, const GLint *v2);
void GLAPIENTRY
_mesa_Rects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
void GLAPIENTRY
_mesa_Rectsv(const GLshort *v1, const GLshort *v2);
void GLAPIENTRY
_mesa_SecondaryColor3b( GLbyte red, GLbyte green, GLbyte blue );
void GLAPIENTRY
_mesa_SecondaryColor3d( GLdouble red, GLdouble green, GLdouble blue );
void GLAPIENTRY
_mesa_SecondaryColor3i( GLint red, GLint green, GLint blue );
void GLAPIENTRY
_mesa_SecondaryColor3s( GLshort red, GLshort green, GLshort blue );
void GLAPIENTRY
_mesa_SecondaryColor3ui( GLuint red, GLuint green, GLuint blue );
void GLAPIENTRY
_mesa_SecondaryColor3us( GLushort red, GLushort green, GLushort blue );
void GLAPIENTRY
_mesa_SecondaryColor3ub( GLubyte red, GLubyte green, GLubyte blue );
void GLAPIENTRY
_mesa_SecondaryColor3bv( const GLbyte *v );
void GLAPIENTRY
_mesa_SecondaryColor3dv( const GLdouble *v );
void GLAPIENTRY
_mesa_SecondaryColor3iv( const GLint *v );
void GLAPIENTRY
_mesa_SecondaryColor3sv( const GLshort *v );
void GLAPIENTRY
_mesa_SecondaryColor3uiv( const GLuint *v );
void GLAPIENTRY
_mesa_SecondaryColor3usv( const GLushort *v );
void GLAPIENTRY
_mesa_SecondaryColor3ubv( const GLubyte *v );
void GLAPIENTRY
_mesa_VertexAttrib1sNV(GLuint index, GLshort x);
void GLAPIENTRY
_mesa_VertexAttrib1dNV(GLuint index, GLdouble x);
void GLAPIENTRY
_mesa_VertexAttrib2sNV(GLuint index, GLshort x, GLshort y);
void GLAPIENTRY
_mesa_VertexAttrib2dNV(GLuint index, GLdouble x, GLdouble y);
void GLAPIENTRY
_mesa_VertexAttrib3sNV(GLuint index, GLshort x, GLshort y, GLshort z);
void GLAPIENTRY
_mesa_VertexAttrib3dNV(GLuint index, GLdouble x, GLdouble y, GLdouble z);
void GLAPIENTRY
_mesa_VertexAttrib4sNV(GLuint index, GLshort x, GLshort y, GLshort z,
                          GLshort w);
void GLAPIENTRY
_mesa_VertexAttrib4dNV(GLuint index, GLdouble x, GLdouble y, GLdouble z,
                          GLdouble w);
void GLAPIENTRY
_mesa_VertexAttrib4ubNV(GLuint index, GLubyte x, GLubyte y, GLubyte z,
                           GLubyte w);
void GLAPIENTRY
_mesa_VertexAttrib1svNV(GLuint index, const GLshort *v);
void GLAPIENTRY
_mesa_VertexAttrib1dvNV(GLuint index, const GLdouble *v);
void GLAPIENTRY
_mesa_VertexAttrib2svNV(GLuint index, const GLshort *v);
void GLAPIENTRY
_mesa_VertexAttrib2dvNV(GLuint index, const GLdouble *v);
void GLAPIENTRY
_mesa_VertexAttrib3svNV(GLuint index, const GLshort *v);
void GLAPIENTRY
_mesa_VertexAttrib3dvNV(GLuint index, const GLdouble *v);
void GLAPIENTRY
_mesa_VertexAttrib4svNV(GLuint index, const GLshort *v);
void GLAPIENTRY
_mesa_VertexAttrib4dvNV(GLuint index, const GLdouble *v);
void GLAPIENTRY
_mesa_VertexAttrib4ubvNV(GLuint index, const GLubyte *v);
void GLAPIENTRY
_mesa_VertexAttribs1svNV(GLuint index, GLsizei n, const GLshort *v);
void GLAPIENTRY
_mesa_VertexAttribs1fvNV(GLuint index, GLsizei n, const GLfloat *v);
void GLAPIENTRY
_mesa_VertexAttribs1dvNV(GLuint index, GLsizei n, const GLdouble *v);
void GLAPIENTRY
_mesa_VertexAttribs2svNV(GLuint index, GLsizei n, const GLshort *v);
void GLAPIENTRY
_mesa_VertexAttribs2fvNV(GLuint index, GLsizei n, const GLfloat *v);
void GLAPIENTRY
_mesa_VertexAttribs2dvNV(GLuint index, GLsizei n, const GLdouble *v);
void GLAPIENTRY
_mesa_VertexAttribs3svNV(GLuint index, GLsizei n, const GLshort *v);
void GLAPIENTRY
_mesa_VertexAttribs3fvNV(GLuint index, GLsizei n, const GLfloat *v);
void GLAPIENTRY
_mesa_VertexAttribs3dvNV(GLuint index, GLsizei n, const GLdouble *v);
void GLAPIENTRY
_mesa_VertexAttribs4svNV(GLuint index, GLsizei n, const GLshort *v);
void GLAPIENTRY
_mesa_VertexAttribs4fvNV(GLuint index, GLsizei n, const GLfloat *v);
void GLAPIENTRY
_mesa_VertexAttribs4dvNV(GLuint index, GLsizei n, const GLdouble *v);
void GLAPIENTRY
_mesa_VertexAttribs4ubvNV(GLuint index, GLsizei n, const GLubyte *v);
void GLAPIENTRY
_mesa_VertexAttrib1s(GLuint index, GLshort x);
void GLAPIENTRY
_mesa_VertexAttrib1d(GLuint index, GLdouble x);
void GLAPIENTRY
_mesa_VertexAttrib2s(GLuint index, GLshort x, GLshort y);
void GLAPIENTRY
_mesa_VertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
void GLAPIENTRY
_mesa_VertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
void GLAPIENTRY
_mesa_VertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
void GLAPIENTRY
_mesa_VertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z,
                           GLshort w);
void GLAPIENTRY
_mesa_VertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z,
                           GLdouble w);
void GLAPIENTRY
_mesa_VertexAttrib1sv(GLuint index, const GLshort *v);
void GLAPIENTRY
_mesa_VertexAttrib1dv(GLuint index, const GLdouble *v);
void GLAPIENTRY
_mesa_VertexAttrib2sv(GLuint index, const GLshort *v);
void GLAPIENTRY
_mesa_VertexAttrib2dv(GLuint index, const GLdouble *v);
void GLAPIENTRY
_mesa_VertexAttrib3sv(GLuint index, const GLshort *v);
void GLAPIENTRY
_mesa_VertexAttrib3dv(GLuint index, const GLdouble *v);
void GLAPIENTRY
_mesa_VertexAttrib4sv(GLuint index, const GLshort *v);
void GLAPIENTRY
_mesa_VertexAttrib4dv(GLuint index, const GLdouble *v);
void GLAPIENTRY
_mesa_VertexAttrib4bv(GLuint index, const GLbyte * v);
void GLAPIENTRY
_mesa_VertexAttrib4iv(GLuint index, const GLint * v);
void GLAPIENTRY
_mesa_VertexAttrib4ubv(GLuint index, const GLubyte * v);
void GLAPIENTRY
_mesa_VertexAttrib4usv(GLuint index, const GLushort * v);
void GLAPIENTRY
_mesa_VertexAttrib4uiv(GLuint index, const GLuint * v);
void GLAPIENTRY
_mesa_VertexAttrib4Nbv(GLuint index, const GLbyte * v);
void GLAPIENTRY
_mesa_VertexAttrib4Nsv(GLuint index, const GLshort * v);
void GLAPIENTRY
_mesa_VertexAttrib4Niv(GLuint index, const GLint * v);
void GLAPIENTRY
_mesa_VertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z,
                             GLubyte w);
void GLAPIENTRY
_mesa_VertexAttrib4Nubv(GLuint index, const GLubyte * v);
void GLAPIENTRY
_mesa_VertexAttrib4Nusv(GLuint index, const GLushort * v);
void GLAPIENTRY
_mesa_VertexAttrib4Nuiv(GLuint index, const GLuint * v);
void GLAPIENTRY
_mesa_VertexAttribI1iv(GLuint index, const GLint *v);
void GLAPIENTRY
_mesa_VertexAttribI1uiv(GLuint index, const GLuint *v);
void GLAPIENTRY
_mesa_VertexAttribI4bv(GLuint index, const GLbyte *v);
void GLAPIENTRY
_mesa_VertexAttribI4sv(GLuint index, const GLshort *v);
void GLAPIENTRY
_mesa_VertexAttribI4ubv(GLuint index, const GLubyte *v);
void GLAPIENTRY
_mesa_VertexAttribI4usv(GLuint index, const GLushort *v);


#endif /* API_LOOPBACK_H */
