#include "glxclient.h"
#include "glxextensions.h"
#include "glxconfig.h"

/*
** GLX_SGI_swap_control
*/
int
glXSwapIntervalSGI(int interval)
{
   (void) interval;
   return 0;
}


/*
** GLX_MESA_swap_control
*/
int
glXSwapIntervalMESA(unsigned int interval)
{
   (void) interval;
   return GLX_BAD_CONTEXT;
}


int
glXGetSwapIntervalMESA(void)
{
   return 0;
}


/*
** GLX_SGI_video_sync
*/
int
glXGetVideoSyncSGI(unsigned int *count)
{
   (void) count;
   return GLX_BAD_CONTEXT;
}

int
glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count)
{
   (void) count;
   return GLX_BAD_CONTEXT;
}


/*
** GLX_SGIX_swap_group
*/
void
glXJoinSwapGroupSGIX(Display * dpy, GLXDrawable drawable, GLXDrawable member)
{
   (void) dpy;
   (void) drawable;
   (void) member;
}


/*
** GLX_SGIX_swap_barrier
*/
void
glXBindSwapBarrierSGIX(Display * dpy, GLXDrawable drawable, int barrier)
{
   (void) dpy;
   (void) drawable;
   (void) barrier;
}

Bool
glXQueryMaxSwapBarriersSGIX(Display * dpy, int screen, int *max)
{
   (void) dpy;
   (void) screen;
   (void) max;
   return False;
}


/*
** GLX_OML_sync_control
*/
Bool
glXGetSyncValuesOML(Display * dpy, GLXDrawable drawable,
                    int64_t * ust, int64_t * msc, int64_t * sbc)
{
   (void) dpy;
   (void) drawable;
   (void) ust;
   (void) msc;
   (void) sbc;
   return False;
}

int64_t
glXSwapBuffersMscOML(Display * dpy, GLXDrawable drawable,
                     int64_t target_msc, int64_t divisor, int64_t remainder)
{
   (void) dpy;
   (void) drawable;
   (void) target_msc;
   (void) divisor;
   (void) remainder;
   return 0;
}


Bool
glXWaitForMscOML(Display * dpy, GLXDrawable drawable,
                 int64_t target_msc, int64_t divisor,
                 int64_t remainder, int64_t * ust,
                 int64_t * msc, int64_t * sbc)
{
   (void) dpy;
   (void) drawable;
   (void) target_msc;
   (void) divisor;
   (void) remainder;
   (void) ust;
   (void) msc;
   (void) sbc;
   return False;
}


Bool
glXWaitForSbcOML(Display * dpy, GLXDrawable drawable,
                 int64_t target_sbc, int64_t * ust,
                 int64_t * msc, int64_t * sbc)
{
   (void) dpy;
   (void) drawable;
   (void) target_sbc;
   (void) ust;
   (void) msc;
   (void) sbc;
   return False;
}


Bool
glXReleaseBuffersMESA(Display * dpy, GLXDrawable d)
{
   (void) dpy;
   (void) d;
   return False;
}


_X_EXPORT GLXPixmap
glXCreateGLXPixmapMESA(Display * dpy, XVisualInfo * visual,
                       Pixmap pixmap, Colormap cmap)
{
   (void) dpy;
   (void) visual;
   (void) pixmap;
   (void) cmap;
   return 0;
}


/**
 * GLX_MESA_copy_sub_buffer
 */
void
glXCopySubBufferMESA(Display * dpy, GLXDrawable drawable,
                     int x, int y, int width, int height)
{
   (void) dpy;
   (void) drawable;
   (void) x;
   (void) y;
   (void) width;
   (void) height;
}


_X_EXPORT int
glXQueryGLXPbufferSGIX(Display * dpy, GLXDrawable drawable,
                       int attribute, unsigned int *value)
{
   (void) dpy;
   (void) drawable;
   (void) attribute;
   (void) value;
   return 0;
}

_X_EXPORT GLXDrawable
glXCreateGLXPbufferSGIX(Display * dpy, GLXFBConfig config,
                        unsigned int width, unsigned int height,
                        int *attrib_list)
{
   (void) dpy;
   (void) config;
   (void) width;
   (void) height;
   (void) attrib_list;
   return None;
}

#if 0
/* GLX_SGIX_fbconfig */
_X_EXPORT int
glXGetFBConfigAttribSGIX(Display * dpy, void *config, int a, int *b)
{
   (void) dpy;
   (void) config;
   (void) a;
   (void) b;
   return 0;
}

_X_EXPORT void *
glXChooseFBConfigSGIX(Display * dpy, int a, int *b, int *c)
{
   (void) dpy;
   (void) a;
   (void) b;
   (void) c;
   return NULL;
}

_X_EXPORT GLXPixmap
glXCreateGLXPixmapWithConfigSGIX(Display * dpy, void *config, Pixmap p)
{
   (void) dpy;
   (void) config;
   (void) p;
   return None;
}

_X_EXPORT GLXContext
glXCreateContextWithConfigSGIX(Display * dpy, void *config, int a,
                               GLXContext b, Bool c)
{
   (void) dpy;
   (void) config;
   (void) a;
   (void) b;
   (void) c;
   return NULL;
}

_X_EXPORT XVisualInfo *
glXGetVisualFromFBConfigSGIX(Display * dpy, void *config)
{
   (void) dpy;
   (void) config;
   return NULL;
}

_X_EXPORT void *
glXGetFBConfigFromVisualSGIX(Display * dpy, XVisualInfo * visinfo)
{
   (void) dpy;
   (void) visinfo;
   return NULL;
}
#endif


_X_EXPORT
GLX_ALIAS_VOID(glXDestroyGLXPbufferSGIX,
               (Display * dpy, GLXDrawable pbuf),
               (dpy, pbuf), glXDestroyPbuffer)

     _X_EXPORT GLX_ALIAS_VOID(glXSelectEventSGIX,
                           (Display * dpy, GLXDrawable drawable,
                            unsigned long mask), (dpy, drawable, mask),
                           glXSelectEvent)

     _X_EXPORT GLX_ALIAS_VOID(glXGetSelectedEventSGIX,
                           (Display * dpy, GLXDrawable drawable,
                            unsigned long *mask), (dpy, drawable, mask),
                           glXGetSelectedEvent)
