/* DO NOT EDIT - This file generated automatically by glX_proto_send.py (from Mesa) script */

/*
 * (C) Copyright IBM Corporation 2004, 2005
 * 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, sub license,
 * 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 NON-INFRINGEMENT.  IN NO EVENT SHALL
 * IBM,
 * AND/OR THEIR SUPPLIERS 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 <GL/gl.h>
#include "indirect.h"
#include "glxclient.h"
#include "indirect_size.h"
#include "dispatch.h"
#include "glapi.h"
#include "glthread.h"
#include <GL/glxproto.h>
#ifdef USE_XCB
#include <X11/Xlib-xcb.h>
#include <xcb/xcb.h>
#include <xcb/glx.h>
#endif /* USE_XCB */

#define __GLX_PAD(n) (((n) + 3) & ~3)

#  if defined(__i386__) && defined(__GNUC__) && !defined(__CYGWIN__) && !defined(__MINGW32__)
#    define FASTCALL __attribute__((fastcall))
#  else
#    define FASTCALL
#  endif
#  if defined(__GNUC__)
#    define NOINLINE __attribute__((noinline))
#  else
#    define NOINLINE
#  endif

#if !defined __GNUC__ || __GNUC__ < 3
#  define __builtin_expect(x, y) x
#endif

/* If the size and opcode values are known at compile-time, this will, on
 * x86 at least, emit them with a single instruction.
 */
#define emit_header(dest, op, size)            \
    do { union { short s[2]; int i; } temp;    \
         temp.s[0] = (size); temp.s[1] = (op); \
         *((int *)(dest)) = temp.i; } while(0)

NOINLINE CARD32
__glXReadReply(Display * dpy, size_t size, void *dest,
               GLboolean reply_is_always_array)
{
    xGLXSingleReply reply;

    (void) _XReply(dpy, (xReply *) & reply, 0, False);
    if (size != 0) {
        if ((reply.length > 0) || reply_is_always_array) {
            const GLint bytes = (reply_is_always_array)
                ? (4 * reply.length) : (reply.size * size);
            const GLint extra = 4 - (bytes & 3);

            _XRead(dpy, dest, bytes);
            if (extra < 4) {
                _XEatData(dpy, extra);
            }
        } else {
            (void) memcpy(dest, &(reply.pad3), size);
        }
    }

    return reply.retval;
}

NOINLINE void
__glXReadPixelReply(Display * dpy, __GLXcontext * gc, unsigned max_dim,
                    GLint width, GLint height, GLint depth, GLenum format,
                    GLenum type, void *dest, GLboolean dimensions_in_reply)
{
    xGLXSingleReply reply;
    GLint size;

    (void) _XReply(dpy, (xReply *) & reply, 0, False);

    if (dimensions_in_reply) {
        width = reply.pad3;
        height = reply.pad4;
        depth = reply.pad5;

        if ((height == 0) || (max_dim < 2)) {
            height = 1;
        }
        if ((depth == 0) || (max_dim < 3)) {
            depth = 1;
        }
    }

    size = reply.length * 4;
    if (size != 0) {
        void *buf = Xmalloc(size);

        if (buf == NULL) {
            _XEatData(dpy, size);
            __glXSetError(gc, GL_OUT_OF_MEMORY);
        } else {
            const GLint extra = 4 - (size & 3);

            _XRead(dpy, buf, size);
            if (extra < 4) {
                _XEatData(dpy, extra);
            }

            __glEmptyImage(gc, 3, width, height, depth, format, type,
                           buf, dest);
            Xfree(buf);
        }
    }
}

#define X_GLXSingle 0

NOINLINE FASTCALL GLubyte *
__glXSetupSingleRequest(__GLXcontext * gc, GLint sop, GLint cmdlen)
{
    xGLXSingleReq *req;
    Display *const dpy = gc->currentDpy;

    (void) __glXFlushRenderBuffer(gc, gc->pc);
    LockDisplay(dpy);
    GetReqExtra(GLXSingle, cmdlen, req);
    req->reqType = gc->majorOpcode;
    req->contextTag = gc->currentContextTag;
    req->glxCode = sop;
    return (GLubyte *) (req) + sz_xGLXSingleReq;
}

NOINLINE FASTCALL GLubyte *
__glXSetupVendorRequest(__GLXcontext * gc, GLint code, GLint vop,
                        GLint cmdlen)
{
    xGLXVendorPrivateReq *req;
    Display *const dpy = gc->currentDpy;

    (void) __glXFlushRenderBuffer(gc, gc->pc);
    LockDisplay(dpy);
    GetReqExtra(GLXVendorPrivate, cmdlen, req);
    req->reqType = gc->majorOpcode;
    req->glxCode = code;
    req->vendorCode = vop;
    req->contextTag = gc->currentContextTag;
    return (GLubyte *) (req) + sz_xGLXVendorPrivateReq;
}

const GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 };

#define zero                        (__glXDefaultPixelStore+0)
#define one                         (__glXDefaultPixelStore+8)
#define default_pixel_store_1D      (__glXDefaultPixelStore+4)
#define default_pixel_store_1D_size 20
#define default_pixel_store_2D      (__glXDefaultPixelStore+4)
#define default_pixel_store_2D_size 20
#define default_pixel_store_3D      (__glXDefaultPixelStore+0)
#define default_pixel_store_3D_size 36
#define default_pixel_store_4D      (__glXDefaultPixelStore+0)
#define default_pixel_store_4D_size 36

static FASTCALL NOINLINE void
generic_3_byte(GLint rop, const void *ptr)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;

    emit_header(gc->pc, rop, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), ptr, 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

static FASTCALL NOINLINE void
generic_4_byte(GLint rop, const void *ptr)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;

    emit_header(gc->pc, rop, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), ptr, 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

static FASTCALL NOINLINE void
generic_6_byte(GLint rop, const void *ptr)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;

    emit_header(gc->pc, rop, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), ptr, 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

static FASTCALL NOINLINE void
generic_8_byte(GLint rop, const void *ptr)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;

    emit_header(gc->pc, rop, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), ptr, 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

static FASTCALL NOINLINE void
generic_12_byte(GLint rop, const void *ptr)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;

    emit_header(gc->pc, rop, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), ptr, 12);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

static FASTCALL NOINLINE void
generic_16_byte(GLint rop, const void *ptr)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;

    emit_header(gc->pc, rop, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), ptr, 16);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

static FASTCALL NOINLINE void
generic_24_byte(GLint rop, const void *ptr)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 28;

    emit_header(gc->pc, rop, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), ptr, 24);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

static FASTCALL NOINLINE void
generic_32_byte(GLint rop, const void *ptr)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 36;

    emit_header(gc->pc, rop, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), ptr, 32);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLsop_NewList 101
void
__indirect_glNewList(GLuint list, GLenum mode)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_new_list(c, gc->currentContextTag, list, mode);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_NewList, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&list), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&mode), 4);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_EndList 102
void
__indirect_glEndList(void)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 0;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_end_list(c, gc->currentContextTag);
#else
        (void) __glXSetupSingleRequest(gc, X_GLsop_EndList, cmdlen);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLrop_CallList 1
void
__indirect_glCallList(GLuint list)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_CallList, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&list), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_CallLists 2
void
__indirect_glCallLists(GLsizei n, GLenum type, const GLvoid * lists)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glCallLists_size(type);
    const GLuint cmdlen = 12 + __GLX_PAD((compsize * n));
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect((n >= 0) && (gc->currentDpy != NULL), 1)) {
        if (cmdlen <= gc->maxSmallRenderCommandSize) {
            if ((gc->pc + cmdlen) > gc->bufEnd) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
            emit_header(gc->pc, X_GLrop_CallLists, cmdlen);
            (void) memcpy((void *) (gc->pc + 4), (void *) (&n), 4);
            (void) memcpy((void *) (gc->pc + 8), (void *) (&type), 4);
            (void) memcpy((void *) (gc->pc + 12), (void *) (lists),
                          (compsize * n));
            gc->pc += cmdlen;
            if (__builtin_expect(gc->pc > gc->limit, 0)) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
        } else {
            const GLint op = X_GLrop_CallLists;
            const GLuint cmdlenLarge = cmdlen + 4;
            GLubyte *const pc = __glXFlushRenderBuffer(gc, gc->pc);
            (void) memcpy((void *) (pc + 0), (void *) (&cmdlenLarge), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&op), 4);
            (void) memcpy((void *) (pc + 8), (void *) (&n), 4);
            (void) memcpy((void *) (pc + 12), (void *) (&type), 4);
            __glXSendLargeCommand(gc, pc, 16, lists, (compsize * n));
        }
    }
}

#define X_GLsop_DeleteLists 103
void
__indirect_glDeleteLists(GLuint list, GLsizei range)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_delete_lists(c, gc->currentContextTag, list, range);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_DeleteLists, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&list), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&range), 4);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GenLists 104
GLuint
__indirect_glGenLists(GLsizei range)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    GLuint retval = (GLuint) 0;
#ifndef USE_XCB
    const GLuint cmdlen = 4;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_gen_lists_reply_t *reply =
            xcb_glx_gen_lists_reply(c,
                                    xcb_glx_gen_lists(c,
                                                      gc->currentContextTag,
                                                      range), NULL);
        retval = reply->ret_val;
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GenLists, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&range), 4);
        retval = (GLuint) __glXReadReply(dpy, 0, NULL, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return retval;
}

#define X_GLrop_ListBase 3
void
__indirect_glListBase(GLuint base)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_ListBase, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&base), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Begin 4
void
__indirect_glBegin(GLenum mode)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_Begin, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&mode), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Bitmap 5
void
__indirect_glBitmap(GLsizei width, GLsizei height, GLfloat xorig,
                    GLfloat yorig, GLfloat xmove, GLfloat ymove,
                    const GLubyte *bitmap)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize =
        (bitmap != NULL) ? __glImageSize(width, height, 1, GL_COLOR_INDEX,
                                         GL_BITMAP, 0) : 0;
    const GLuint cmdlen = 48 + __GLX_PAD(compsize);
    if (__builtin_expect(gc->currentDpy != NULL, 1)) {
        if (cmdlen <= gc->maxSmallRenderCommandSize) {
            if ((gc->pc + cmdlen) > gc->bufEnd) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
            emit_header(gc->pc, X_GLrop_Bitmap, cmdlen);
            (void) memcpy((void *) (gc->pc + 24), (void *) (&width), 4);
            (void) memcpy((void *) (gc->pc + 28), (void *) (&height), 4);
            (void) memcpy((void *) (gc->pc + 32), (void *) (&xorig), 4);
            (void) memcpy((void *) (gc->pc + 36), (void *) (&yorig), 4);
            (void) memcpy((void *) (gc->pc + 40), (void *) (&xmove), 4);
            (void) memcpy((void *) (gc->pc + 44), (void *) (&ymove), 4);
            if (compsize > 0) {
                (*gc->fillImage) (gc, 2, width, height, 1, GL_COLOR_INDEX,
                                  GL_BITMAP, bitmap, gc->pc + 48, gc->pc + 4);
            } else {
                (void) memcpy(gc->pc + 4, default_pixel_store_2D,
                              default_pixel_store_2D_size);
            }
            gc->pc += cmdlen;
            if (gc->pc > gc->limit) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
        } else {
            const GLint op = X_GLrop_Bitmap;
            const GLuint cmdlenLarge = cmdlen + 4;
            GLubyte *const pc = __glXFlushRenderBuffer(gc, gc->pc);
            (void) memcpy((void *) (pc + 0), (void *) (&cmdlenLarge), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&op), 4);
            (void) memcpy((void *) (pc + 28), (void *) (&width), 4);
            (void) memcpy((void *) (pc + 32), (void *) (&height), 4);
            (void) memcpy((void *) (pc + 36), (void *) (&xorig), 4);
            (void) memcpy((void *) (pc + 40), (void *) (&yorig), 4);
            (void) memcpy((void *) (pc + 44), (void *) (&xmove), 4);
            (void) memcpy((void *) (pc + 48), (void *) (&ymove), 4);
            __glXSendLargeImage(gc, compsize, 2, width, height, 1,
                                GL_COLOR_INDEX, GL_BITMAP, bitmap, pc + 52,
                                pc + 8);
        }
    }
}

#define X_GLrop_Color3bv 6
void
__indirect_glColor3b(GLbyte red, GLbyte green, GLbyte blue)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_Color3bv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 1);
    (void) memcpy((void *) (gc->pc + 5), (void *) (&green), 1);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&blue), 1);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Color3bv 6
void
__indirect_glColor3bv(const GLbyte *v)
{
    generic_3_byte(X_GLrop_Color3bv, v);
}

#define X_GLrop_Color3dv 7
void
__indirect_glColor3d(GLdouble red, GLdouble green, GLdouble blue)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 28;
    emit_header(gc->pc, X_GLrop_Color3dv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&green), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&blue), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Color3dv 7
void
__indirect_glColor3dv(const GLdouble * v)
{
    generic_24_byte(X_GLrop_Color3dv, v);
}

#define X_GLrop_Color3fv 8
void
__indirect_glColor3f(GLfloat red, GLfloat green, GLfloat blue)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_Color3fv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&green), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&blue), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Color3fv 8
void
__indirect_glColor3fv(const GLfloat * v)
{
    generic_12_byte(X_GLrop_Color3fv, v);
}

#define X_GLrop_Color3iv 9
void
__indirect_glColor3i(GLint red, GLint green, GLint blue)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_Color3iv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&green), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&blue), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Color3iv 9
void
__indirect_glColor3iv(const GLint * v)
{
    generic_12_byte(X_GLrop_Color3iv, v);
}

#define X_GLrop_Color3sv 10
void
__indirect_glColor3s(GLshort red, GLshort green, GLshort blue)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_Color3sv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 2);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&green), 2);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&blue), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Color3sv 10
void
__indirect_glColor3sv(const GLshort * v)
{
    generic_6_byte(X_GLrop_Color3sv, v);
}

#define X_GLrop_Color3ubv 11
void
__indirect_glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_Color3ubv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 1);
    (void) memcpy((void *) (gc->pc + 5), (void *) (&green), 1);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&blue), 1);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Color3ubv 11
void
__indirect_glColor3ubv(const GLubyte *v)
{
    generic_3_byte(X_GLrop_Color3ubv, v);
}

#define X_GLrop_Color3uiv 12
void
__indirect_glColor3ui(GLuint red, GLuint green, GLuint blue)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_Color3uiv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&green), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&blue), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Color3uiv 12
void
__indirect_glColor3uiv(const GLuint * v)
{
    generic_12_byte(X_GLrop_Color3uiv, v);
}

#define X_GLrop_Color3usv 13
void
__indirect_glColor3us(GLushort red, GLushort green, GLushort blue)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_Color3usv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 2);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&green), 2);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&blue), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Color3usv 13
void
__indirect_glColor3usv(const GLushort * v)
{
    generic_6_byte(X_GLrop_Color3usv, v);
}

#define X_GLrop_Color4bv 14
void
__indirect_glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_Color4bv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 1);
    (void) memcpy((void *) (gc->pc + 5), (void *) (&green), 1);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&blue), 1);
    (void) memcpy((void *) (gc->pc + 7), (void *) (&alpha), 1);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Color4bv 14
void
__indirect_glColor4bv(const GLbyte *v)
{
    generic_4_byte(X_GLrop_Color4bv, v);
}

#define X_GLrop_Color4dv 15
void
__indirect_glColor4d(GLdouble red, GLdouble green, GLdouble blue,
                     GLdouble alpha)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 36;
    emit_header(gc->pc, X_GLrop_Color4dv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&green), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&blue), 8);
    (void) memcpy((void *) (gc->pc + 28), (void *) (&alpha), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Color4dv 15
void
__indirect_glColor4dv(const GLdouble * v)
{
    generic_32_byte(X_GLrop_Color4dv, v);
}

#define X_GLrop_Color4fv 16
void
__indirect_glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_Color4fv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&green), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&blue), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&alpha), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Color4fv 16
void
__indirect_glColor4fv(const GLfloat * v)
{
    generic_16_byte(X_GLrop_Color4fv, v);
}

#define X_GLrop_Color4iv 17
void
__indirect_glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_Color4iv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&green), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&blue), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&alpha), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Color4iv 17
void
__indirect_glColor4iv(const GLint * v)
{
    generic_16_byte(X_GLrop_Color4iv, v);
}

#define X_GLrop_Color4sv 18
void
__indirect_glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_Color4sv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 2);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&green), 2);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&blue), 2);
    (void) memcpy((void *) (gc->pc + 10), (void *) (&alpha), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Color4sv 18
void
__indirect_glColor4sv(const GLshort * v)
{
    generic_8_byte(X_GLrop_Color4sv, v);
}

#define X_GLrop_Color4ubv 19
void
__indirect_glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_Color4ubv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 1);
    (void) memcpy((void *) (gc->pc + 5), (void *) (&green), 1);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&blue), 1);
    (void) memcpy((void *) (gc->pc + 7), (void *) (&alpha), 1);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Color4ubv 19
void
__indirect_glColor4ubv(const GLubyte *v)
{
    generic_4_byte(X_GLrop_Color4ubv, v);
}

#define X_GLrop_Color4uiv 20
void
__indirect_glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_Color4uiv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&green), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&blue), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&alpha), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Color4uiv 20
void
__indirect_glColor4uiv(const GLuint * v)
{
    generic_16_byte(X_GLrop_Color4uiv, v);
}

#define X_GLrop_Color4usv 21
void
__indirect_glColor4us(GLushort red, GLushort green, GLushort blue,
                      GLushort alpha)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_Color4usv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 2);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&green), 2);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&blue), 2);
    (void) memcpy((void *) (gc->pc + 10), (void *) (&alpha), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Color4usv 21
void
__indirect_glColor4usv(const GLushort * v)
{
    generic_8_byte(X_GLrop_Color4usv, v);
}

#define X_GLrop_EdgeFlagv 22
void
__indirect_glEdgeFlag(GLboolean flag)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_EdgeFlagv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&flag), 1);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_EdgeFlagv 22
void
__indirect_glEdgeFlagv(const GLboolean * flag)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_EdgeFlagv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (flag), 1);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_End 23
void
__indirect_glEnd(void)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 4;
    emit_header(gc->pc, X_GLrop_End, cmdlen);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Indexdv 24
void
__indirect_glIndexd(GLdouble c)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_Indexdv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&c), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Indexdv 24
void
__indirect_glIndexdv(const GLdouble * c)
{
    generic_8_byte(X_GLrop_Indexdv, c);
}

#define X_GLrop_Indexfv 25
void
__indirect_glIndexf(GLfloat c)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_Indexfv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&c), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Indexfv 25
void
__indirect_glIndexfv(const GLfloat * c)
{
    generic_4_byte(X_GLrop_Indexfv, c);
}

#define X_GLrop_Indexiv 26
void
__indirect_glIndexi(GLint c)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_Indexiv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&c), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Indexiv 26
void
__indirect_glIndexiv(const GLint * c)
{
    generic_4_byte(X_GLrop_Indexiv, c);
}

#define X_GLrop_Indexsv 27
void
__indirect_glIndexs(GLshort c)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_Indexsv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&c), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Indexsv 27
void
__indirect_glIndexsv(const GLshort * c)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_Indexsv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (c), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Normal3bv 28
void
__indirect_glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_Normal3bv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&nx), 1);
    (void) memcpy((void *) (gc->pc + 5), (void *) (&ny), 1);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&nz), 1);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Normal3bv 28
void
__indirect_glNormal3bv(const GLbyte *v)
{
    generic_3_byte(X_GLrop_Normal3bv, v);
}

#define X_GLrop_Normal3dv 29
void
__indirect_glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 28;
    emit_header(gc->pc, X_GLrop_Normal3dv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&nx), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&ny), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&nz), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Normal3dv 29
void
__indirect_glNormal3dv(const GLdouble * v)
{
    generic_24_byte(X_GLrop_Normal3dv, v);
}

#define X_GLrop_Normal3fv 30
void
__indirect_glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_Normal3fv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&nx), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&ny), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&nz), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Normal3fv 30
void
__indirect_glNormal3fv(const GLfloat * v)
{
    generic_12_byte(X_GLrop_Normal3fv, v);
}

#define X_GLrop_Normal3iv 31
void
__indirect_glNormal3i(GLint nx, GLint ny, GLint nz)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_Normal3iv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&nx), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&ny), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&nz), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Normal3iv 31
void
__indirect_glNormal3iv(const GLint * v)
{
    generic_12_byte(X_GLrop_Normal3iv, v);
}

#define X_GLrop_Normal3sv 32
void
__indirect_glNormal3s(GLshort nx, GLshort ny, GLshort nz)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_Normal3sv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&nx), 2);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&ny), 2);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&nz), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Normal3sv 32
void
__indirect_glNormal3sv(const GLshort * v)
{
    generic_6_byte(X_GLrop_Normal3sv, v);
}

#define X_GLrop_RasterPos2dv 33
void
__indirect_glRasterPos2d(GLdouble x, GLdouble y)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_RasterPos2dv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&y), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_RasterPos2dv 33
void
__indirect_glRasterPos2dv(const GLdouble * v)
{
    generic_16_byte(X_GLrop_RasterPos2dv, v);
}

#define X_GLrop_RasterPos2fv 34
void
__indirect_glRasterPos2f(GLfloat x, GLfloat y)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_RasterPos2fv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&y), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_RasterPos2fv 34
void
__indirect_glRasterPos2fv(const GLfloat * v)
{
    generic_8_byte(X_GLrop_RasterPos2fv, v);
}

#define X_GLrop_RasterPos2iv 35
void
__indirect_glRasterPos2i(GLint x, GLint y)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_RasterPos2iv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&y), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_RasterPos2iv 35
void
__indirect_glRasterPos2iv(const GLint * v)
{
    generic_8_byte(X_GLrop_RasterPos2iv, v);
}

#define X_GLrop_RasterPos2sv 36
void
__indirect_glRasterPos2s(GLshort x, GLshort y)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_RasterPos2sv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 2);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&y), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_RasterPos2sv 36
void
__indirect_glRasterPos2sv(const GLshort * v)
{
    generic_4_byte(X_GLrop_RasterPos2sv, v);
}

#define X_GLrop_RasterPos3dv 37
void
__indirect_glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 28;
    emit_header(gc->pc, X_GLrop_RasterPos3dv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&y), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&z), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_RasterPos3dv 37
void
__indirect_glRasterPos3dv(const GLdouble * v)
{
    generic_24_byte(X_GLrop_RasterPos3dv, v);
}

#define X_GLrop_RasterPos3fv 38
void
__indirect_glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_RasterPos3fv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&z), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_RasterPos3fv 38
void
__indirect_glRasterPos3fv(const GLfloat * v)
{
    generic_12_byte(X_GLrop_RasterPos3fv, v);
}

#define X_GLrop_RasterPos3iv 39
void
__indirect_glRasterPos3i(GLint x, GLint y, GLint z)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_RasterPos3iv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&z), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_RasterPos3iv 39
void
__indirect_glRasterPos3iv(const GLint * v)
{
    generic_12_byte(X_GLrop_RasterPos3iv, v);
}

#define X_GLrop_RasterPos3sv 40
void
__indirect_glRasterPos3s(GLshort x, GLshort y, GLshort z)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_RasterPos3sv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 2);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&y), 2);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&z), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_RasterPos3sv 40
void
__indirect_glRasterPos3sv(const GLshort * v)
{
    generic_6_byte(X_GLrop_RasterPos3sv, v);
}

#define X_GLrop_RasterPos4dv 41
void
__indirect_glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 36;
    emit_header(gc->pc, X_GLrop_RasterPos4dv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&y), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&z), 8);
    (void) memcpy((void *) (gc->pc + 28), (void *) (&w), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_RasterPos4dv 41
void
__indirect_glRasterPos4dv(const GLdouble * v)
{
    generic_32_byte(X_GLrop_RasterPos4dv, v);
}

#define X_GLrop_RasterPos4fv 42
void
__indirect_glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_RasterPos4fv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&z), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&w), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_RasterPos4fv 42
void
__indirect_glRasterPos4fv(const GLfloat * v)
{
    generic_16_byte(X_GLrop_RasterPos4fv, v);
}

#define X_GLrop_RasterPos4iv 43
void
__indirect_glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_RasterPos4iv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&z), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&w), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_RasterPos4iv 43
void
__indirect_glRasterPos4iv(const GLint * v)
{
    generic_16_byte(X_GLrop_RasterPos4iv, v);
}

#define X_GLrop_RasterPos4sv 44
void
__indirect_glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_RasterPos4sv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 2);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&y), 2);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&z), 2);
    (void) memcpy((void *) (gc->pc + 10), (void *) (&w), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_RasterPos4sv 44
void
__indirect_glRasterPos4sv(const GLshort * v)
{
    generic_8_byte(X_GLrop_RasterPos4sv, v);
}

#define X_GLrop_Rectdv 45
void
__indirect_glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 36;
    emit_header(gc->pc, X_GLrop_Rectdv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x1), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&y1), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&x2), 8);
    (void) memcpy((void *) (gc->pc + 28), (void *) (&y2), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Rectdv 45
void
__indirect_glRectdv(const GLdouble * v1, const GLdouble * v2)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 36;
    emit_header(gc->pc, X_GLrop_Rectdv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (v1), 16);
    (void) memcpy((void *) (gc->pc + 20), (void *) (v2), 16);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Rectfv 46
void
__indirect_glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_Rectfv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x1), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&y1), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&x2), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&y2), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Rectfv 46
void
__indirect_glRectfv(const GLfloat * v1, const GLfloat * v2)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_Rectfv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (v1), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (v2), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Rectiv 47
void
__indirect_glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_Rectiv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x1), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&y1), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&x2), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&y2), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Rectiv 47
void
__indirect_glRectiv(const GLint * v1, const GLint * v2)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_Rectiv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (v1), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (v2), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Rectsv 48
void
__indirect_glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_Rectsv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x1), 2);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&y1), 2);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x2), 2);
    (void) memcpy((void *) (gc->pc + 10), (void *) (&y2), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Rectsv 48
void
__indirect_glRectsv(const GLshort * v1, const GLshort * v2)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_Rectsv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (v1), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v2), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexCoord1dv 49
void
__indirect_glTexCoord1d(GLdouble s)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_TexCoord1dv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&s), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexCoord1dv 49
void
__indirect_glTexCoord1dv(const GLdouble * v)
{
    generic_8_byte(X_GLrop_TexCoord1dv, v);
}

#define X_GLrop_TexCoord1fv 50
void
__indirect_glTexCoord1f(GLfloat s)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_TexCoord1fv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&s), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexCoord1fv 50
void
__indirect_glTexCoord1fv(const GLfloat * v)
{
    generic_4_byte(X_GLrop_TexCoord1fv, v);
}

#define X_GLrop_TexCoord1iv 51
void
__indirect_glTexCoord1i(GLint s)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_TexCoord1iv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&s), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexCoord1iv 51
void
__indirect_glTexCoord1iv(const GLint * v)
{
    generic_4_byte(X_GLrop_TexCoord1iv, v);
}

#define X_GLrop_TexCoord1sv 52
void
__indirect_glTexCoord1s(GLshort s)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_TexCoord1sv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&s), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexCoord1sv 52
void
__indirect_glTexCoord1sv(const GLshort * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_TexCoord1sv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (v), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexCoord2dv 53
void
__indirect_glTexCoord2d(GLdouble s, GLdouble t)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_TexCoord2dv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&s), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&t), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexCoord2dv 53
void
__indirect_glTexCoord2dv(const GLdouble * v)
{
    generic_16_byte(X_GLrop_TexCoord2dv, v);
}

#define X_GLrop_TexCoord2fv 54
void
__indirect_glTexCoord2f(GLfloat s, GLfloat t)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_TexCoord2fv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&s), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&t), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexCoord2fv 54
void
__indirect_glTexCoord2fv(const GLfloat * v)
{
    generic_8_byte(X_GLrop_TexCoord2fv, v);
}

#define X_GLrop_TexCoord2iv 55
void
__indirect_glTexCoord2i(GLint s, GLint t)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_TexCoord2iv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&s), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&t), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexCoord2iv 55
void
__indirect_glTexCoord2iv(const GLint * v)
{
    generic_8_byte(X_GLrop_TexCoord2iv, v);
}

#define X_GLrop_TexCoord2sv 56
void
__indirect_glTexCoord2s(GLshort s, GLshort t)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_TexCoord2sv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&s), 2);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&t), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexCoord2sv 56
void
__indirect_glTexCoord2sv(const GLshort * v)
{
    generic_4_byte(X_GLrop_TexCoord2sv, v);
}

#define X_GLrop_TexCoord3dv 57
void
__indirect_glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 28;
    emit_header(gc->pc, X_GLrop_TexCoord3dv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&s), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&t), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&r), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexCoord3dv 57
void
__indirect_glTexCoord3dv(const GLdouble * v)
{
    generic_24_byte(X_GLrop_TexCoord3dv, v);
}

#define X_GLrop_TexCoord3fv 58
void
__indirect_glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_TexCoord3fv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&s), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&t), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&r), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexCoord3fv 58
void
__indirect_glTexCoord3fv(const GLfloat * v)
{
    generic_12_byte(X_GLrop_TexCoord3fv, v);
}

#define X_GLrop_TexCoord3iv 59
void
__indirect_glTexCoord3i(GLint s, GLint t, GLint r)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_TexCoord3iv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&s), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&t), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&r), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexCoord3iv 59
void
__indirect_glTexCoord3iv(const GLint * v)
{
    generic_12_byte(X_GLrop_TexCoord3iv, v);
}

#define X_GLrop_TexCoord3sv 60
void
__indirect_glTexCoord3s(GLshort s, GLshort t, GLshort r)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_TexCoord3sv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&s), 2);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&t), 2);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&r), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexCoord3sv 60
void
__indirect_glTexCoord3sv(const GLshort * v)
{
    generic_6_byte(X_GLrop_TexCoord3sv, v);
}

#define X_GLrop_TexCoord4dv 61
void
__indirect_glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 36;
    emit_header(gc->pc, X_GLrop_TexCoord4dv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&s), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&t), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&r), 8);
    (void) memcpy((void *) (gc->pc + 28), (void *) (&q), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexCoord4dv 61
void
__indirect_glTexCoord4dv(const GLdouble * v)
{
    generic_32_byte(X_GLrop_TexCoord4dv, v);
}

#define X_GLrop_TexCoord4fv 62
void
__indirect_glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_TexCoord4fv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&s), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&t), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&r), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&q), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexCoord4fv 62
void
__indirect_glTexCoord4fv(const GLfloat * v)
{
    generic_16_byte(X_GLrop_TexCoord4fv, v);
}

#define X_GLrop_TexCoord4iv 63
void
__indirect_glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_TexCoord4iv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&s), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&t), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&r), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&q), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexCoord4iv 63
void
__indirect_glTexCoord4iv(const GLint * v)
{
    generic_16_byte(X_GLrop_TexCoord4iv, v);
}

#define X_GLrop_TexCoord4sv 64
void
__indirect_glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_TexCoord4sv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&s), 2);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&t), 2);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&r), 2);
    (void) memcpy((void *) (gc->pc + 10), (void *) (&q), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexCoord4sv 64
void
__indirect_glTexCoord4sv(const GLshort * v)
{
    generic_8_byte(X_GLrop_TexCoord4sv, v);
}

#define X_GLrop_Vertex2dv 65
void
__indirect_glVertex2d(GLdouble x, GLdouble y)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_Vertex2dv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&y), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Vertex2dv 65
void
__indirect_glVertex2dv(const GLdouble * v)
{
    generic_16_byte(X_GLrop_Vertex2dv, v);
}

#define X_GLrop_Vertex2fv 66
void
__indirect_glVertex2f(GLfloat x, GLfloat y)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_Vertex2fv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&y), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Vertex2fv 66
void
__indirect_glVertex2fv(const GLfloat * v)
{
    generic_8_byte(X_GLrop_Vertex2fv, v);
}

#define X_GLrop_Vertex2iv 67
void
__indirect_glVertex2i(GLint x, GLint y)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_Vertex2iv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&y), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Vertex2iv 67
void
__indirect_glVertex2iv(const GLint * v)
{
    generic_8_byte(X_GLrop_Vertex2iv, v);
}

#define X_GLrop_Vertex2sv 68
void
__indirect_glVertex2s(GLshort x, GLshort y)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_Vertex2sv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 2);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&y), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Vertex2sv 68
void
__indirect_glVertex2sv(const GLshort * v)
{
    generic_4_byte(X_GLrop_Vertex2sv, v);
}

#define X_GLrop_Vertex3dv 69
void
__indirect_glVertex3d(GLdouble x, GLdouble y, GLdouble z)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 28;
    emit_header(gc->pc, X_GLrop_Vertex3dv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&y), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&z), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Vertex3dv 69
void
__indirect_glVertex3dv(const GLdouble * v)
{
    generic_24_byte(X_GLrop_Vertex3dv, v);
}

#define X_GLrop_Vertex3fv 70
void
__indirect_glVertex3f(GLfloat x, GLfloat y, GLfloat z)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_Vertex3fv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&z), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Vertex3fv 70
void
__indirect_glVertex3fv(const GLfloat * v)
{
    generic_12_byte(X_GLrop_Vertex3fv, v);
}

#define X_GLrop_Vertex3iv 71
void
__indirect_glVertex3i(GLint x, GLint y, GLint z)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_Vertex3iv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&z), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Vertex3iv 71
void
__indirect_glVertex3iv(const GLint * v)
{
    generic_12_byte(X_GLrop_Vertex3iv, v);
}

#define X_GLrop_Vertex3sv 72
void
__indirect_glVertex3s(GLshort x, GLshort y, GLshort z)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_Vertex3sv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 2);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&y), 2);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&z), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Vertex3sv 72
void
__indirect_glVertex3sv(const GLshort * v)
{
    generic_6_byte(X_GLrop_Vertex3sv, v);
}

#define X_GLrop_Vertex4dv 73
void
__indirect_glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 36;
    emit_header(gc->pc, X_GLrop_Vertex4dv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&y), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&z), 8);
    (void) memcpy((void *) (gc->pc + 28), (void *) (&w), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Vertex4dv 73
void
__indirect_glVertex4dv(const GLdouble * v)
{
    generic_32_byte(X_GLrop_Vertex4dv, v);
}

#define X_GLrop_Vertex4fv 74
void
__indirect_glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_Vertex4fv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&z), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&w), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Vertex4fv 74
void
__indirect_glVertex4fv(const GLfloat * v)
{
    generic_16_byte(X_GLrop_Vertex4fv, v);
}

#define X_GLrop_Vertex4iv 75
void
__indirect_glVertex4i(GLint x, GLint y, GLint z, GLint w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_Vertex4iv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&z), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&w), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Vertex4iv 75
void
__indirect_glVertex4iv(const GLint * v)
{
    generic_16_byte(X_GLrop_Vertex4iv, v);
}

#define X_GLrop_Vertex4sv 76
void
__indirect_glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_Vertex4sv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 2);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&y), 2);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&z), 2);
    (void) memcpy((void *) (gc->pc + 10), (void *) (&w), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Vertex4sv 76
void
__indirect_glVertex4sv(const GLshort * v)
{
    generic_8_byte(X_GLrop_Vertex4sv, v);
}

#define X_GLrop_ClipPlane 77
void
__indirect_glClipPlane(GLenum plane, const GLdouble * equation)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 40;
    emit_header(gc->pc, X_GLrop_ClipPlane, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (equation), 32);
    (void) memcpy((void *) (gc->pc + 36), (void *) (&plane), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ColorMaterial 78
void
__indirect_glColorMaterial(GLenum face, GLenum mode)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_ColorMaterial, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&face), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&mode), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_CullFace 79
void
__indirect_glCullFace(GLenum mode)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_CullFace, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&mode), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Fogf 80
void
__indirect_glFogf(GLenum pname, GLfloat param)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_Fogf, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&param), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Fogfv 81
void
__indirect_glFogfv(GLenum pname, const GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glFogfv_size(pname);
    const GLuint cmdlen = 8 + __GLX_PAD((compsize * 4));
    emit_header(gc->pc, X_GLrop_Fogfv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (params), (compsize * 4));
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Fogi 82
void
__indirect_glFogi(GLenum pname, GLint param)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_Fogi, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&param), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Fogiv 83
void
__indirect_glFogiv(GLenum pname, const GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glFogiv_size(pname);
    const GLuint cmdlen = 8 + __GLX_PAD((compsize * 4));
    emit_header(gc->pc, X_GLrop_Fogiv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (params), (compsize * 4));
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_FrontFace 84
void
__indirect_glFrontFace(GLenum mode)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_FrontFace, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&mode), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Hint 85
void
__indirect_glHint(GLenum target, GLenum mode)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_Hint, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&mode), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Lightf 86
void
__indirect_glLightf(GLenum light, GLenum pname, GLfloat param)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_Lightf, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&light), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&param), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Lightfv 87
void
__indirect_glLightfv(GLenum light, GLenum pname, const GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glLightfv_size(pname);
    const GLuint cmdlen = 12 + __GLX_PAD((compsize * 4));
    emit_header(gc->pc, X_GLrop_Lightfv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&light), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (params), (compsize * 4));
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Lighti 88
void
__indirect_glLighti(GLenum light, GLenum pname, GLint param)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_Lighti, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&light), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&param), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Lightiv 89
void
__indirect_glLightiv(GLenum light, GLenum pname, const GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glLightiv_size(pname);
    const GLuint cmdlen = 12 + __GLX_PAD((compsize * 4));
    emit_header(gc->pc, X_GLrop_Lightiv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&light), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (params), (compsize * 4));
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_LightModelf 90
void
__indirect_glLightModelf(GLenum pname, GLfloat param)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_LightModelf, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&param), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_LightModelfv 91
void
__indirect_glLightModelfv(GLenum pname, const GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glLightModelfv_size(pname);
    const GLuint cmdlen = 8 + __GLX_PAD((compsize * 4));
    emit_header(gc->pc, X_GLrop_LightModelfv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (params), (compsize * 4));
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_LightModeli 92
void
__indirect_glLightModeli(GLenum pname, GLint param)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_LightModeli, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&param), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_LightModeliv 93
void
__indirect_glLightModeliv(GLenum pname, const GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glLightModeliv_size(pname);
    const GLuint cmdlen = 8 + __GLX_PAD((compsize * 4));
    emit_header(gc->pc, X_GLrop_LightModeliv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (params), (compsize * 4));
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_LineStipple 94
void
__indirect_glLineStipple(GLint factor, GLushort pattern)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_LineStipple, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&factor), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pattern), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_LineWidth 95
void
__indirect_glLineWidth(GLfloat width)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_LineWidth, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&width), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Materialf 96
void
__indirect_glMaterialf(GLenum face, GLenum pname, GLfloat param)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_Materialf, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&face), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&param), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Materialfv 97
void
__indirect_glMaterialfv(GLenum face, GLenum pname, const GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glMaterialfv_size(pname);
    const GLuint cmdlen = 12 + __GLX_PAD((compsize * 4));
    emit_header(gc->pc, X_GLrop_Materialfv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&face), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (params), (compsize * 4));
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Materiali 98
void
__indirect_glMateriali(GLenum face, GLenum pname, GLint param)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_Materiali, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&face), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&param), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Materialiv 99
void
__indirect_glMaterialiv(GLenum face, GLenum pname, const GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glMaterialiv_size(pname);
    const GLuint cmdlen = 12 + __GLX_PAD((compsize * 4));
    emit_header(gc->pc, X_GLrop_Materialiv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&face), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (params), (compsize * 4));
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_PointSize 100
void
__indirect_glPointSize(GLfloat size)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_PointSize, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&size), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_PolygonMode 101
void
__indirect_glPolygonMode(GLenum face, GLenum mode)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_PolygonMode, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&face), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&mode), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_PolygonStipple 102
void
__indirect_glPolygonStipple(const GLubyte *mask)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize =
        (mask != NULL) ? __glImageSize(32, 32, 1, GL_COLOR_INDEX, GL_BITMAP,
                                       0) : 0;
    const GLuint cmdlen = 24 + __GLX_PAD(compsize);
    emit_header(gc->pc, X_GLrop_PolygonStipple, cmdlen);
    if (compsize > 0) {
        (*gc->fillImage) (gc, 2, 32, 32, 1, GL_COLOR_INDEX, GL_BITMAP, mask,
                          gc->pc + 24, gc->pc + 4);
    } else {
        (void) memcpy(gc->pc + 4, default_pixel_store_2D,
                      default_pixel_store_2D_size);
    }
    gc->pc += cmdlen;
    if (gc->pc > gc->limit) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Scissor 103
void
__indirect_glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_Scissor, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&width), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&height), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ShadeModel 104
void
__indirect_glShadeModel(GLenum mode)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_ShadeModel, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&mode), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexParameterf 105
void
__indirect_glTexParameterf(GLenum target, GLenum pname, GLfloat param)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_TexParameterf, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&param), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexParameterfv 106
void
__indirect_glTexParameterfv(GLenum target, GLenum pname,
                            const GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glTexParameterfv_size(pname);
    const GLuint cmdlen = 12 + __GLX_PAD((compsize * 4));
    emit_header(gc->pc, X_GLrop_TexParameterfv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (params), (compsize * 4));
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexParameteri 107
void
__indirect_glTexParameteri(GLenum target, GLenum pname, GLint param)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_TexParameteri, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&param), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexParameteriv 108
void
__indirect_glTexParameteriv(GLenum target, GLenum pname, const GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glTexParameteriv_size(pname);
    const GLuint cmdlen = 12 + __GLX_PAD((compsize * 4));
    emit_header(gc->pc, X_GLrop_TexParameteriv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (params), (compsize * 4));
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

static void
__glx_TexImage_1D2D(unsigned opcode, unsigned dim, GLenum target, GLint level,
                    GLint internalformat, GLsizei width, GLsizei height,
                    GLint border, GLenum format, GLenum type,
                    const GLvoid * pixels)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize =
        __glImageSize(width, height, 1, format, type, target);
    const GLuint cmdlen = 56 + __GLX_PAD(compsize);
    if (__builtin_expect(gc->currentDpy != NULL, 1)) {
        if (cmdlen <= gc->maxSmallRenderCommandSize) {
            if ((gc->pc + cmdlen) > gc->bufEnd) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
            emit_header(gc->pc, opcode, cmdlen);
            (void) memcpy((void *) (gc->pc + 24), (void *) (&target), 4);
            (void) memcpy((void *) (gc->pc + 28), (void *) (&level), 4);
            (void) memcpy((void *) (gc->pc + 32), (void *) (&internalformat),
                          4);
            (void) memcpy((void *) (gc->pc + 36), (void *) (&width), 4);
            (void) memcpy((void *) (gc->pc + 40), (void *) (&height), 4);
            (void) memcpy((void *) (gc->pc + 44), (void *) (&border), 4);
            (void) memcpy((void *) (gc->pc + 48), (void *) (&format), 4);
            (void) memcpy((void *) (gc->pc + 52), (void *) (&type), 4);
            if ((compsize > 0) && (pixels != NULL)) {
                (*gc->fillImage) (gc, dim, width, height, 1, format, type,
                                  pixels, gc->pc + 56, gc->pc + 4);
            } else {
                (void) memcpy(gc->pc + 4, default_pixel_store_2D,
                              default_pixel_store_2D_size);
            }
            gc->pc += cmdlen;
            if (gc->pc > gc->limit) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
        } else {
            const GLint op = opcode;
            const GLuint cmdlenLarge = cmdlen + 4;
            GLubyte *const pc = __glXFlushRenderBuffer(gc, gc->pc);
            (void) memcpy((void *) (pc + 0), (void *) (&cmdlenLarge), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&op), 4);
            (void) memcpy((void *) (pc + 28), (void *) (&target), 4);
            (void) memcpy((void *) (pc + 32), (void *) (&level), 4);
            (void) memcpy((void *) (pc + 36), (void *) (&internalformat), 4);
            (void) memcpy((void *) (pc + 40), (void *) (&width), 4);
            (void) memcpy((void *) (pc + 44), (void *) (&height), 4);
            (void) memcpy((void *) (pc + 48), (void *) (&border), 4);
            (void) memcpy((void *) (pc + 52), (void *) (&format), 4);
            (void) memcpy((void *) (pc + 56), (void *) (&type), 4);
            __glXSendLargeImage(gc, compsize, dim, width, height, 1, format,
                                type, pixels, pc + 60, pc + 8);
        }
    }
}

#define X_GLrop_TexImage1D 109
void
__indirect_glTexImage1D(GLenum target, GLint level, GLint internalformat,
                        GLsizei width, GLint border, GLenum format,
                        GLenum type, const GLvoid * pixels)
{
    __glx_TexImage_1D2D(X_GLrop_TexImage1D, 1, target, level, internalformat,
                        width, 1, border, format, type, pixels);
}

#define X_GLrop_TexImage2D 110
void
__indirect_glTexImage2D(GLenum target, GLint level, GLint internalformat,
                        GLsizei width, GLsizei height, GLint border,
                        GLenum format, GLenum type, const GLvoid * pixels)
{
    __glx_TexImage_1D2D(X_GLrop_TexImage2D, 2, target, level, internalformat,
                        width, height, border, format, type, pixels);
}

#define X_GLrop_TexEnvf 111
void
__indirect_glTexEnvf(GLenum target, GLenum pname, GLfloat param)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_TexEnvf, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&param), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexEnvfv 112
void
__indirect_glTexEnvfv(GLenum target, GLenum pname, const GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glTexEnvfv_size(pname);
    const GLuint cmdlen = 12 + __GLX_PAD((compsize * 4));
    emit_header(gc->pc, X_GLrop_TexEnvfv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (params), (compsize * 4));
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexEnvi 113
void
__indirect_glTexEnvi(GLenum target, GLenum pname, GLint param)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_TexEnvi, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&param), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexEnviv 114
void
__indirect_glTexEnviv(GLenum target, GLenum pname, const GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glTexEnviv_size(pname);
    const GLuint cmdlen = 12 + __GLX_PAD((compsize * 4));
    emit_header(gc->pc, X_GLrop_TexEnviv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (params), (compsize * 4));
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexGend 115
void
__indirect_glTexGend(GLenum coord, GLenum pname, GLdouble param)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_TexGend, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&param), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&coord), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&pname), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexGendv 116
void
__indirect_glTexGendv(GLenum coord, GLenum pname, const GLdouble * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glTexGendv_size(pname);
    const GLuint cmdlen = 12 + __GLX_PAD((compsize * 8));
    emit_header(gc->pc, X_GLrop_TexGendv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&coord), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (params), (compsize * 8));
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexGenf 117
void
__indirect_glTexGenf(GLenum coord, GLenum pname, GLfloat param)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_TexGenf, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&coord), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&param), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexGenfv 118
void
__indirect_glTexGenfv(GLenum coord, GLenum pname, const GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glTexGenfv_size(pname);
    const GLuint cmdlen = 12 + __GLX_PAD((compsize * 4));
    emit_header(gc->pc, X_GLrop_TexGenfv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&coord), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (params), (compsize * 4));
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexGeni 119
void
__indirect_glTexGeni(GLenum coord, GLenum pname, GLint param)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_TexGeni, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&coord), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&param), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_TexGeniv 120
void
__indirect_glTexGeniv(GLenum coord, GLenum pname, const GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glTexGeniv_size(pname);
    const GLuint cmdlen = 12 + __GLX_PAD((compsize * 4));
    emit_header(gc->pc, X_GLrop_TexGeniv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&coord), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (params), (compsize * 4));
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_InitNames 121
void
__indirect_glInitNames(void)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 4;
    emit_header(gc->pc, X_GLrop_InitNames, cmdlen);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_LoadName 122
void
__indirect_glLoadName(GLuint name)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_LoadName, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&name), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_PassThrough 123
void
__indirect_glPassThrough(GLfloat token)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_PassThrough, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&token), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_PopName 124
void
__indirect_glPopName(void)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 4;
    emit_header(gc->pc, X_GLrop_PopName, cmdlen);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_PushName 125
void
__indirect_glPushName(GLuint name)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_PushName, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&name), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_DrawBuffer 126
void
__indirect_glDrawBuffer(GLenum mode)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_DrawBuffer, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&mode), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Clear 127
void
__indirect_glClear(GLbitfield mask)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_Clear, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&mask), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ClearAccum 128
void
__indirect_glClearAccum(GLfloat red, GLfloat green, GLfloat blue,
                        GLfloat alpha)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_ClearAccum, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&green), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&blue), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&alpha), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ClearIndex 129
void
__indirect_glClearIndex(GLfloat c)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_ClearIndex, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&c), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ClearColor 130
void
__indirect_glClearColor(GLclampf red, GLclampf green, GLclampf blue,
                        GLclampf alpha)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_ClearColor, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&green), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&blue), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&alpha), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ClearStencil 131
void
__indirect_glClearStencil(GLint s)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_ClearStencil, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&s), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ClearDepth 132
void
__indirect_glClearDepth(GLclampd depth)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_ClearDepth, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&depth), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_StencilMask 133
void
__indirect_glStencilMask(GLuint mask)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_StencilMask, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&mask), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ColorMask 134
void
__indirect_glColorMask(GLboolean red, GLboolean green, GLboolean blue,
                       GLboolean alpha)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_ColorMask, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 1);
    (void) memcpy((void *) (gc->pc + 5), (void *) (&green), 1);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&blue), 1);
    (void) memcpy((void *) (gc->pc + 7), (void *) (&alpha), 1);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_DepthMask 135
void
__indirect_glDepthMask(GLboolean flag)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_DepthMask, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&flag), 1);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_IndexMask 136
void
__indirect_glIndexMask(GLuint mask)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_IndexMask, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&mask), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Accum 137
void
__indirect_glAccum(GLenum op, GLfloat value)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_Accum, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&op), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&value), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_PopAttrib 141
void
__indirect_glPopAttrib(void)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 4;
    emit_header(gc->pc, X_GLrop_PopAttrib, cmdlen);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_PushAttrib 142
void
__indirect_glPushAttrib(GLbitfield mask)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_PushAttrib, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&mask), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MapGrid1d 147
void
__indirect_glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_MapGrid1d, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&u1), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&u2), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&un), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MapGrid1f 148
void
__indirect_glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_MapGrid1f, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&un), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&u1), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&u2), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MapGrid2d 149
void
__indirect_glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn,
                       GLdouble v1, GLdouble v2)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 44;
    emit_header(gc->pc, X_GLrop_MapGrid2d, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&u1), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&u2), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&v1), 8);
    (void) memcpy((void *) (gc->pc + 28), (void *) (&v2), 8);
    (void) memcpy((void *) (gc->pc + 36), (void *) (&un), 4);
    (void) memcpy((void *) (gc->pc + 40), (void *) (&vn), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MapGrid2f 150
void
__indirect_glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1,
                       GLfloat v2)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 28;
    emit_header(gc->pc, X_GLrop_MapGrid2f, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&un), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&u1), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&u2), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&vn), 4);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&v1), 4);
    (void) memcpy((void *) (gc->pc + 24), (void *) (&v2), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_EvalCoord1dv 151
void
__indirect_glEvalCoord1d(GLdouble u)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_EvalCoord1dv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&u), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_EvalCoord1dv 151
void
__indirect_glEvalCoord1dv(const GLdouble * u)
{
    generic_8_byte(X_GLrop_EvalCoord1dv, u);
}

#define X_GLrop_EvalCoord1fv 152
void
__indirect_glEvalCoord1f(GLfloat u)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_EvalCoord1fv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&u), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_EvalCoord1fv 152
void
__indirect_glEvalCoord1fv(const GLfloat * u)
{
    generic_4_byte(X_GLrop_EvalCoord1fv, u);
}

#define X_GLrop_EvalCoord2dv 153
void
__indirect_glEvalCoord2d(GLdouble u, GLdouble v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_EvalCoord2dv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&u), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&v), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_EvalCoord2dv 153
void
__indirect_glEvalCoord2dv(const GLdouble * u)
{
    generic_16_byte(X_GLrop_EvalCoord2dv, u);
}

#define X_GLrop_EvalCoord2fv 154
void
__indirect_glEvalCoord2f(GLfloat u, GLfloat v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_EvalCoord2fv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&u), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&v), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_EvalCoord2fv 154
void
__indirect_glEvalCoord2fv(const GLfloat * u)
{
    generic_8_byte(X_GLrop_EvalCoord2fv, u);
}

#define X_GLrop_EvalMesh1 155
void
__indirect_glEvalMesh1(GLenum mode, GLint i1, GLint i2)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_EvalMesh1, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&mode), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&i1), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&i2), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_EvalPoint1 156
void
__indirect_glEvalPoint1(GLint i)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_EvalPoint1, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&i), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_EvalMesh2 157
void
__indirect_glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_EvalMesh2, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&mode), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&i1), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&i2), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&j1), 4);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&j2), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_EvalPoint2 158
void
__indirect_glEvalPoint2(GLint i, GLint j)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_EvalPoint2, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&i), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&j), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_AlphaFunc 159
void
__indirect_glAlphaFunc(GLenum func, GLclampf ref)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_AlphaFunc, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&func), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&ref), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_BlendFunc 160
void
__indirect_glBlendFunc(GLenum sfactor, GLenum dfactor)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_BlendFunc, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&sfactor), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&dfactor), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_LogicOp 161
void
__indirect_glLogicOp(GLenum opcode)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_LogicOp, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&opcode), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_StencilFunc 162
void
__indirect_glStencilFunc(GLenum func, GLint ref, GLuint mask)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_StencilFunc, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&func), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&ref), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&mask), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_StencilOp 163
void
__indirect_glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_StencilOp, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&fail), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&zfail), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&zpass), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_DepthFunc 164
void
__indirect_glDepthFunc(GLenum func)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_DepthFunc, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&func), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_PixelZoom 165
void
__indirect_glPixelZoom(GLfloat xfactor, GLfloat yfactor)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_PixelZoom, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&xfactor), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&yfactor), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_PixelTransferf 166
void
__indirect_glPixelTransferf(GLenum pname, GLfloat param)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_PixelTransferf, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&param), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_PixelTransferi 167
void
__indirect_glPixelTransferi(GLenum pname, GLint param)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_PixelTransferi, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&param), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_PixelMapfv 168
void
__indirect_glPixelMapfv(GLenum map, GLsizei mapsize, const GLfloat * values)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12 + __GLX_PAD((mapsize * 4));
    if (mapsize < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect((mapsize >= 0) && (gc->currentDpy != NULL), 1)) {
        if (cmdlen <= gc->maxSmallRenderCommandSize) {
            if ((gc->pc + cmdlen) > gc->bufEnd) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
            emit_header(gc->pc, X_GLrop_PixelMapfv, cmdlen);
            (void) memcpy((void *) (gc->pc + 4), (void *) (&map), 4);
            (void) memcpy((void *) (gc->pc + 8), (void *) (&mapsize), 4);
            (void) memcpy((void *) (gc->pc + 12), (void *) (values),
                          (mapsize * 4));
            gc->pc += cmdlen;
            if (__builtin_expect(gc->pc > gc->limit, 0)) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
        } else {
            const GLint op = X_GLrop_PixelMapfv;
            const GLuint cmdlenLarge = cmdlen + 4;
            GLubyte *const pc = __glXFlushRenderBuffer(gc, gc->pc);
            (void) memcpy((void *) (pc + 0), (void *) (&cmdlenLarge), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&op), 4);
            (void) memcpy((void *) (pc + 8), (void *) (&map), 4);
            (void) memcpy((void *) (pc + 12), (void *) (&mapsize), 4);
            __glXSendLargeCommand(gc, pc, 16, values, (mapsize * 4));
        }
    }
}

#define X_GLrop_PixelMapuiv 169
void
__indirect_glPixelMapuiv(GLenum map, GLsizei mapsize, const GLuint * values)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12 + __GLX_PAD((mapsize * 4));
    if (mapsize < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect((mapsize >= 0) && (gc->currentDpy != NULL), 1)) {
        if (cmdlen <= gc->maxSmallRenderCommandSize) {
            if ((gc->pc + cmdlen) > gc->bufEnd) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
            emit_header(gc->pc, X_GLrop_PixelMapuiv, cmdlen);
            (void) memcpy((void *) (gc->pc + 4), (void *) (&map), 4);
            (void) memcpy((void *) (gc->pc + 8), (void *) (&mapsize), 4);
            (void) memcpy((void *) (gc->pc + 12), (void *) (values),
                          (mapsize * 4));
            gc->pc += cmdlen;
            if (__builtin_expect(gc->pc > gc->limit, 0)) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
        } else {
            const GLint op = X_GLrop_PixelMapuiv;
            const GLuint cmdlenLarge = cmdlen + 4;
            GLubyte *const pc = __glXFlushRenderBuffer(gc, gc->pc);
            (void) memcpy((void *) (pc + 0), (void *) (&cmdlenLarge), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&op), 4);
            (void) memcpy((void *) (pc + 8), (void *) (&map), 4);
            (void) memcpy((void *) (pc + 12), (void *) (&mapsize), 4);
            __glXSendLargeCommand(gc, pc, 16, values, (mapsize * 4));
        }
    }
}

#define X_GLrop_PixelMapusv 170
void
__indirect_glPixelMapusv(GLenum map, GLsizei mapsize, const GLushort * values)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12 + __GLX_PAD((mapsize * 2));
    if (mapsize < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect((mapsize >= 0) && (gc->currentDpy != NULL), 1)) {
        if (cmdlen <= gc->maxSmallRenderCommandSize) {
            if ((gc->pc + cmdlen) > gc->bufEnd) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
            emit_header(gc->pc, X_GLrop_PixelMapusv, cmdlen);
            (void) memcpy((void *) (gc->pc + 4), (void *) (&map), 4);
            (void) memcpy((void *) (gc->pc + 8), (void *) (&mapsize), 4);
            (void) memcpy((void *) (gc->pc + 12), (void *) (values),
                          (mapsize * 2));
            gc->pc += cmdlen;
            if (__builtin_expect(gc->pc > gc->limit, 0)) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
        } else {
            const GLint op = X_GLrop_PixelMapusv;
            const GLuint cmdlenLarge = cmdlen + 4;
            GLubyte *const pc = __glXFlushRenderBuffer(gc, gc->pc);
            (void) memcpy((void *) (pc + 0), (void *) (&cmdlenLarge), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&op), 4);
            (void) memcpy((void *) (pc + 8), (void *) (&map), 4);
            (void) memcpy((void *) (pc + 12), (void *) (&mapsize), 4);
            __glXSendLargeCommand(gc, pc, 16, values, (mapsize * 2));
        }
    }
}

#define X_GLrop_ReadBuffer 171
void
__indirect_glReadBuffer(GLenum mode)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_ReadBuffer, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&mode), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_CopyPixels 172
void
__indirect_glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height,
                        GLenum type)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_CopyPixels, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&width), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&height), 4);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&type), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLsop_ReadPixels 111
void
__indirect_glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
                        GLenum format, GLenum type, GLvoid * pixels)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const __GLXattribute *const state = gc->client_state_private;
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 28;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_read_pixels_reply_t *reply =
            xcb_glx_read_pixels_reply(c,
                                      xcb_glx_read_pixels(c,
                                                          gc->
                                                          currentContextTag,
                                                          x, y, width, height,
                                                          format, type,
                                                          state->storePack.
                                                          swapEndian, 0),
                                      NULL);
        (void) memcpy(pixels, xcb_glx_read_pixels_data(reply),
                      xcb_glx_read_pixels_data_length(reply) *
                      sizeof(GLvoid));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_ReadPixels, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&x), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&y), 4);
        (void) memcpy((void *) (pc + 8), (void *) (&width), 4);
        (void) memcpy((void *) (pc + 12), (void *) (&height), 4);
        (void) memcpy((void *) (pc + 16), (void *) (&format), 4);
        (void) memcpy((void *) (pc + 20), (void *) (&type), 4);
        *(int32_t *) (pc + 24) = 0;
        *(int8_t *) (pc + 24) = state->storePack.swapEndian;
        __glXReadPixelReply(dpy, gc, 2, width, height, 1, format, type,
                            pixels, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLrop_DrawPixels 173
void
__indirect_glDrawPixels(GLsizei width, GLsizei height, GLenum format,
                        GLenum type, const GLvoid * pixels)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize =
        (pixels != NULL) ? __glImageSize(width, height, 1, format, type,
                                         0) : 0;
    const GLuint cmdlen = 40 + __GLX_PAD(compsize);
    if (__builtin_expect(gc->currentDpy != NULL, 1)) {
        if (cmdlen <= gc->maxSmallRenderCommandSize) {
            if ((gc->pc + cmdlen) > gc->bufEnd) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
            emit_header(gc->pc, X_GLrop_DrawPixels, cmdlen);
            (void) memcpy((void *) (gc->pc + 24), (void *) (&width), 4);
            (void) memcpy((void *) (gc->pc + 28), (void *) (&height), 4);
            (void) memcpy((void *) (gc->pc + 32), (void *) (&format), 4);
            (void) memcpy((void *) (gc->pc + 36), (void *) (&type), 4);
            if (compsize > 0) {
                (*gc->fillImage) (gc, 2, width, height, 1, format, type,
                                  pixels, gc->pc + 40, gc->pc + 4);
            } else {
                (void) memcpy(gc->pc + 4, default_pixel_store_2D,
                              default_pixel_store_2D_size);
            }
            gc->pc += cmdlen;
            if (gc->pc > gc->limit) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
        } else {
            const GLint op = X_GLrop_DrawPixels;
            const GLuint cmdlenLarge = cmdlen + 4;
            GLubyte *const pc = __glXFlushRenderBuffer(gc, gc->pc);
            (void) memcpy((void *) (pc + 0), (void *) (&cmdlenLarge), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&op), 4);
            (void) memcpy((void *) (pc + 28), (void *) (&width), 4);
            (void) memcpy((void *) (pc + 32), (void *) (&height), 4);
            (void) memcpy((void *) (pc + 36), (void *) (&format), 4);
            (void) memcpy((void *) (pc + 40), (void *) (&type), 4);
            __glXSendLargeImage(gc, compsize, 2, width, height, 1, format,
                                type, pixels, pc + 44, pc + 8);
        }
    }
}

#define X_GLsop_GetClipPlane 113
void
__indirect_glGetClipPlane(GLenum plane, GLdouble * equation)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 4;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_clip_plane_reply_t *reply =
            xcb_glx_get_clip_plane_reply(c,
                                         xcb_glx_get_clip_plane(c,
                                                                gc->
                                                                currentContextTag,
                                                                plane), NULL);
        (void) memcpy(equation, xcb_glx_get_clip_plane_data(reply),
                      xcb_glx_get_clip_plane_data_length(reply) *
                      sizeof(GLdouble));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetClipPlane, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&plane), 4);
        (void) __glXReadReply(dpy, 8, equation, GL_TRUE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetLightfv 118
void
__indirect_glGetLightfv(GLenum light, GLenum pname, GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_lightfv_reply_t *reply =
            xcb_glx_get_lightfv_reply(c,
                                      xcb_glx_get_lightfv(c,
                                                          gc->
                                                          currentContextTag,
                                                          light, pname),
                                      NULL);
        if (xcb_glx_get_lightfv_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params, xcb_glx_get_lightfv_data(reply),
                          xcb_glx_get_lightfv_data_length(reply) *
                          sizeof(GLfloat));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetLightfv, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&light), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetLightiv 119
void
__indirect_glGetLightiv(GLenum light, GLenum pname, GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_lightiv_reply_t *reply =
            xcb_glx_get_lightiv_reply(c,
                                      xcb_glx_get_lightiv(c,
                                                          gc->
                                                          currentContextTag,
                                                          light, pname),
                                      NULL);
        if (xcb_glx_get_lightiv_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params, xcb_glx_get_lightiv_data(reply),
                          xcb_glx_get_lightiv_data_length(reply) *
                          sizeof(GLint));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetLightiv, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&light), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetMapdv 120
void
__indirect_glGetMapdv(GLenum target, GLenum query, GLdouble * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_mapdv_reply_t *reply =
            xcb_glx_get_mapdv_reply(c,
                                    xcb_glx_get_mapdv(c,
                                                      gc->currentContextTag,
                                                      target, query), NULL);
        if (xcb_glx_get_mapdv_data_length(reply) == 0)
            (void) memcpy(v, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(v, xcb_glx_get_mapdv_data(reply),
                          xcb_glx_get_mapdv_data_length(reply) *
                          sizeof(GLdouble));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetMapdv, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&query), 4);
        (void) __glXReadReply(dpy, 8, v, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetMapfv 121
void
__indirect_glGetMapfv(GLenum target, GLenum query, GLfloat * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_mapfv_reply_t *reply =
            xcb_glx_get_mapfv_reply(c,
                                    xcb_glx_get_mapfv(c,
                                                      gc->currentContextTag,
                                                      target, query), NULL);
        if (xcb_glx_get_mapfv_data_length(reply) == 0)
            (void) memcpy(v, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(v, xcb_glx_get_mapfv_data(reply),
                          xcb_glx_get_mapfv_data_length(reply) *
                          sizeof(GLfloat));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetMapfv, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&query), 4);
        (void) __glXReadReply(dpy, 4, v, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetMapiv 122
void
__indirect_glGetMapiv(GLenum target, GLenum query, GLint * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_mapiv_reply_t *reply =
            xcb_glx_get_mapiv_reply(c,
                                    xcb_glx_get_mapiv(c,
                                                      gc->currentContextTag,
                                                      target, query), NULL);
        if (xcb_glx_get_mapiv_data_length(reply) == 0)
            (void) memcpy(v, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(v, xcb_glx_get_mapiv_data(reply),
                          xcb_glx_get_mapiv_data_length(reply) *
                          sizeof(GLint));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetMapiv, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&query), 4);
        (void) __glXReadReply(dpy, 4, v, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetMaterialfv 123
void
__indirect_glGetMaterialfv(GLenum face, GLenum pname, GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_materialfv_reply_t *reply =
            xcb_glx_get_materialfv_reply(c,
                                         xcb_glx_get_materialfv(c,
                                                                gc->
                                                                currentContextTag,
                                                                face, pname),
                                         NULL);
        if (xcb_glx_get_materialfv_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params, xcb_glx_get_materialfv_data(reply),
                          xcb_glx_get_materialfv_data_length(reply) *
                          sizeof(GLfloat));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetMaterialfv, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&face), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetMaterialiv 124
void
__indirect_glGetMaterialiv(GLenum face, GLenum pname, GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_materialiv_reply_t *reply =
            xcb_glx_get_materialiv_reply(c,
                                         xcb_glx_get_materialiv(c,
                                                                gc->
                                                                currentContextTag,
                                                                face, pname),
                                         NULL);
        if (xcb_glx_get_materialiv_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params, xcb_glx_get_materialiv_data(reply),
                          xcb_glx_get_materialiv_data_length(reply) *
                          sizeof(GLint));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetMaterialiv, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&face), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetPixelMapfv 125
void
__indirect_glGetPixelMapfv(GLenum map, GLfloat * values)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 4;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_pixel_mapfv_reply_t *reply =
            xcb_glx_get_pixel_mapfv_reply(c,
                                          xcb_glx_get_pixel_mapfv(c,
                                                                  gc->
                                                                  currentContextTag,
                                                                  map), NULL);
        if (xcb_glx_get_pixel_mapfv_data_length(reply) == 0)
            (void) memcpy(values, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(values, xcb_glx_get_pixel_mapfv_data(reply),
                          xcb_glx_get_pixel_mapfv_data_length(reply) *
                          sizeof(GLfloat));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetPixelMapfv, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&map), 4);
        (void) __glXReadReply(dpy, 4, values, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetPixelMapuiv 126
void
__indirect_glGetPixelMapuiv(GLenum map, GLuint * values)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 4;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_pixel_mapuiv_reply_t *reply =
            xcb_glx_get_pixel_mapuiv_reply(c,
                                           xcb_glx_get_pixel_mapuiv(c,
                                                                    gc->
                                                                    currentContextTag,
                                                                    map),
                                           NULL);
        if (xcb_glx_get_pixel_mapuiv_data_length(reply) == 0)
            (void) memcpy(values, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(values, xcb_glx_get_pixel_mapuiv_data(reply),
                          xcb_glx_get_pixel_mapuiv_data_length(reply) *
                          sizeof(GLuint));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetPixelMapuiv, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&map), 4);
        (void) __glXReadReply(dpy, 4, values, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetPixelMapusv 127
void
__indirect_glGetPixelMapusv(GLenum map, GLushort * values)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 4;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_pixel_mapusv_reply_t *reply =
            xcb_glx_get_pixel_mapusv_reply(c,
                                           xcb_glx_get_pixel_mapusv(c,
                                                                    gc->
                                                                    currentContextTag,
                                                                    map),
                                           NULL);
        if (xcb_glx_get_pixel_mapusv_data_length(reply) == 0)
            (void) memcpy(values, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(values, xcb_glx_get_pixel_mapusv_data(reply),
                          xcb_glx_get_pixel_mapusv_data_length(reply) *
                          sizeof(GLushort));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetPixelMapusv, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&map), 4);
        (void) __glXReadReply(dpy, 2, values, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetPolygonStipple 128
void
__indirect_glGetPolygonStipple(GLubyte *mask)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 4;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_polygon_stipple_reply_t *reply =
            xcb_glx_get_polygon_stipple_reply(c,
                                              xcb_glx_get_polygon_stipple(c,
                                                                          gc->
                                                                          currentContextTag,
                                                                          0),
                                              NULL);
        (void) memcpy(mask, xcb_glx_get_polygon_stipple_data(reply),
                      xcb_glx_get_polygon_stipple_data_length(reply) *
                      sizeof(GLubyte));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetPolygonStipple, cmdlen);
        *(int32_t *) (pc + 0) = 0;
        __glXReadPixelReply(dpy, gc, 2, 32, 32, 1, GL_COLOR_INDEX, GL_BITMAP,
                            mask, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetTexEnvfv 130
void
__indirect_glGetTexEnvfv(GLenum target, GLenum pname, GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_tex_envfv_reply_t *reply =
            xcb_glx_get_tex_envfv_reply(c,
                                        xcb_glx_get_tex_envfv(c,
                                                              gc->
                                                              currentContextTag,
                                                              target, pname),
                                        NULL);
        if (xcb_glx_get_tex_envfv_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params, xcb_glx_get_tex_envfv_data(reply),
                          xcb_glx_get_tex_envfv_data_length(reply) *
                          sizeof(GLfloat));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetTexEnvfv, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetTexEnviv 131
void
__indirect_glGetTexEnviv(GLenum target, GLenum pname, GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_tex_enviv_reply_t *reply =
            xcb_glx_get_tex_enviv_reply(c,
                                        xcb_glx_get_tex_enviv(c,
                                                              gc->
                                                              currentContextTag,
                                                              target, pname),
                                        NULL);
        if (xcb_glx_get_tex_enviv_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params, xcb_glx_get_tex_enviv_data(reply),
                          xcb_glx_get_tex_enviv_data_length(reply) *
                          sizeof(GLint));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetTexEnviv, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetTexGendv 132
void
__indirect_glGetTexGendv(GLenum coord, GLenum pname, GLdouble * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_tex_gendv_reply_t *reply =
            xcb_glx_get_tex_gendv_reply(c,
                                        xcb_glx_get_tex_gendv(c,
                                                              gc->
                                                              currentContextTag,
                                                              coord, pname),
                                        NULL);
        if (xcb_glx_get_tex_gendv_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params, xcb_glx_get_tex_gendv_data(reply),
                          xcb_glx_get_tex_gendv_data_length(reply) *
                          sizeof(GLdouble));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetTexGendv, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&coord), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 8, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetTexGenfv 133
void
__indirect_glGetTexGenfv(GLenum coord, GLenum pname, GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_tex_genfv_reply_t *reply =
            xcb_glx_get_tex_genfv_reply(c,
                                        xcb_glx_get_tex_genfv(c,
                                                              gc->
                                                              currentContextTag,
                                                              coord, pname),
                                        NULL);
        if (xcb_glx_get_tex_genfv_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params, xcb_glx_get_tex_genfv_data(reply),
                          xcb_glx_get_tex_genfv_data_length(reply) *
                          sizeof(GLfloat));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetTexGenfv, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&coord), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetTexGeniv 134
void
__indirect_glGetTexGeniv(GLenum coord, GLenum pname, GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_tex_geniv_reply_t *reply =
            xcb_glx_get_tex_geniv_reply(c,
                                        xcb_glx_get_tex_geniv(c,
                                                              gc->
                                                              currentContextTag,
                                                              coord, pname),
                                        NULL);
        if (xcb_glx_get_tex_geniv_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params, xcb_glx_get_tex_geniv_data(reply),
                          xcb_glx_get_tex_geniv_data_length(reply) *
                          sizeof(GLint));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetTexGeniv, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&coord), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetTexImage 135
void
__indirect_glGetTexImage(GLenum target, GLint level, GLenum format,
                         GLenum type, GLvoid * pixels)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const __GLXattribute *const state = gc->client_state_private;
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 20;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_tex_image_reply_t *reply =
            xcb_glx_get_tex_image_reply(c,
                                        xcb_glx_get_tex_image(c,
                                                              gc->
                                                              currentContextTag,
                                                              target, level,
                                                              format, type,
                                                              state->
                                                              storePack.
                                                              swapEndian),
                                        NULL);
        (void) memcpy(pixels, xcb_glx_get_tex_image_data(reply),
                      xcb_glx_get_tex_image_data_length(reply) *
                      sizeof(GLvoid));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetTexImage, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&level), 4);
        (void) memcpy((void *) (pc + 8), (void *) (&format), 4);
        (void) memcpy((void *) (pc + 12), (void *) (&type), 4);
        *(int32_t *) (pc + 16) = 0;
        *(int8_t *) (pc + 16) = state->storePack.swapEndian;
        __glXReadPixelReply(dpy, gc, 3, 0, 0, 0, format, type, pixels,
                            GL_TRUE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetTexParameterfv 136
void
__indirect_glGetTexParameterfv(GLenum target, GLenum pname, GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_tex_parameterfv_reply_t *reply =
            xcb_glx_get_tex_parameterfv_reply(c,
                                              xcb_glx_get_tex_parameterfv(c,
                                                                          gc->
                                                                          currentContextTag,
                                                                          target,
                                                                          pname),
                                              NULL);
        if (xcb_glx_get_tex_parameterfv_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params, xcb_glx_get_tex_parameterfv_data(reply),
                          xcb_glx_get_tex_parameterfv_data_length(reply) *
                          sizeof(GLfloat));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetTexParameterfv, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetTexParameteriv 137
void
__indirect_glGetTexParameteriv(GLenum target, GLenum pname, GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_tex_parameteriv_reply_t *reply =
            xcb_glx_get_tex_parameteriv_reply(c,
                                              xcb_glx_get_tex_parameteriv(c,
                                                                          gc->
                                                                          currentContextTag,
                                                                          target,
                                                                          pname),
                                              NULL);
        if (xcb_glx_get_tex_parameteriv_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params, xcb_glx_get_tex_parameteriv_data(reply),
                          xcb_glx_get_tex_parameteriv_data_length(reply) *
                          sizeof(GLint));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetTexParameteriv, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetTexLevelParameterfv 138
void
__indirect_glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname,
                                    GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 12;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_tex_level_parameterfv_reply_t *reply =
            xcb_glx_get_tex_level_parameterfv_reply(c,
                                                    xcb_glx_get_tex_level_parameterfv
                                                    (c, gc->currentContextTag,
                                                     target, level, pname),
                                                    NULL);
        if (xcb_glx_get_tex_level_parameterfv_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params,
                          xcb_glx_get_tex_level_parameterfv_data(reply),
                          xcb_glx_get_tex_level_parameterfv_data_length(reply)
                          * sizeof(GLfloat));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetTexLevelParameterfv,
                                    cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&level), 4);
        (void) memcpy((void *) (pc + 8), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetTexLevelParameteriv 139
void
__indirect_glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname,
                                    GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 12;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_tex_level_parameteriv_reply_t *reply =
            xcb_glx_get_tex_level_parameteriv_reply(c,
                                                    xcb_glx_get_tex_level_parameteriv
                                                    (c, gc->currentContextTag,
                                                     target, level, pname),
                                                    NULL);
        if (xcb_glx_get_tex_level_parameteriv_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params,
                          xcb_glx_get_tex_level_parameteriv_data(reply),
                          xcb_glx_get_tex_level_parameteriv_data_length(reply)
                          * sizeof(GLint));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetTexLevelParameteriv,
                                    cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&level), 4);
        (void) memcpy((void *) (pc + 8), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_IsList 141
GLboolean
__indirect_glIsList(GLuint list)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    GLboolean retval = (GLboolean) 0;
#ifndef USE_XCB
    const GLuint cmdlen = 4;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_is_list_reply_t *reply =
            xcb_glx_is_list_reply(c,
                                  xcb_glx_is_list(c, gc->currentContextTag,
                                                  list), NULL);
        retval = reply->ret_val;
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_IsList, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&list), 4);
        retval = (GLboolean) __glXReadReply(dpy, 0, NULL, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return retval;
}

#define X_GLrop_DepthRange 174
void
__indirect_glDepthRange(GLclampd zNear, GLclampd zFar)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_DepthRange, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&zNear), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&zFar), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Frustum 175
void
__indirect_glFrustum(GLdouble left, GLdouble right, GLdouble bottom,
                     GLdouble top, GLdouble zNear, GLdouble zFar)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 52;
    emit_header(gc->pc, X_GLrop_Frustum, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&left), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&right), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&bottom), 8);
    (void) memcpy((void *) (gc->pc + 28), (void *) (&top), 8);
    (void) memcpy((void *) (gc->pc + 36), (void *) (&zNear), 8);
    (void) memcpy((void *) (gc->pc + 44), (void *) (&zFar), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_LoadIdentity 176
void
__indirect_glLoadIdentity(void)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 4;
    emit_header(gc->pc, X_GLrop_LoadIdentity, cmdlen);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_LoadMatrixf 177
void
__indirect_glLoadMatrixf(const GLfloat * m)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 68;
    emit_header(gc->pc, X_GLrop_LoadMatrixf, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (m), 64);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_LoadMatrixd 178
void
__indirect_glLoadMatrixd(const GLdouble * m)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 132;
    emit_header(gc->pc, X_GLrop_LoadMatrixd, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (m), 128);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MatrixMode 179
void
__indirect_glMatrixMode(GLenum mode)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_MatrixMode, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&mode), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultMatrixf 180
void
__indirect_glMultMatrixf(const GLfloat * m)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 68;
    emit_header(gc->pc, X_GLrop_MultMatrixf, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (m), 64);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultMatrixd 181
void
__indirect_glMultMatrixd(const GLdouble * m)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 132;
    emit_header(gc->pc, X_GLrop_MultMatrixd, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (m), 128);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Ortho 182
void
__indirect_glOrtho(GLdouble left, GLdouble right, GLdouble bottom,
                   GLdouble top, GLdouble zNear, GLdouble zFar)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 52;
    emit_header(gc->pc, X_GLrop_Ortho, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&left), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&right), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&bottom), 8);
    (void) memcpy((void *) (gc->pc + 28), (void *) (&top), 8);
    (void) memcpy((void *) (gc->pc + 36), (void *) (&zNear), 8);
    (void) memcpy((void *) (gc->pc + 44), (void *) (&zFar), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_PopMatrix 183
void
__indirect_glPopMatrix(void)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 4;
    emit_header(gc->pc, X_GLrop_PopMatrix, cmdlen);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_PushMatrix 184
void
__indirect_glPushMatrix(void)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 4;
    emit_header(gc->pc, X_GLrop_PushMatrix, cmdlen);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Rotated 185
void
__indirect_glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 36;
    emit_header(gc->pc, X_GLrop_Rotated, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&angle), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&x), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&y), 8);
    (void) memcpy((void *) (gc->pc + 28), (void *) (&z), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Rotatef 186
void
__indirect_glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_Rotatef, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&angle), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&z), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Scaled 187
void
__indirect_glScaled(GLdouble x, GLdouble y, GLdouble z)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 28;
    emit_header(gc->pc, X_GLrop_Scaled, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&y), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&z), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Scalef 188
void
__indirect_glScalef(GLfloat x, GLfloat y, GLfloat z)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_Scalef, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&z), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Translated 189
void
__indirect_glTranslated(GLdouble x, GLdouble y, GLdouble z)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 28;
    emit_header(gc->pc, X_GLrop_Translated, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&y), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&z), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Translatef 190
void
__indirect_glTranslatef(GLfloat x, GLfloat y, GLfloat z)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_Translatef, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&z), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Viewport 191
void
__indirect_glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_Viewport, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&width), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&height), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_BindTexture 4117
void
__indirect_glBindTexture(GLenum target, GLuint texture)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_BindTexture, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&texture), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Indexubv 194
void
__indirect_glIndexub(GLubyte c)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_Indexubv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&c), 1);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Indexubv 194
void
__indirect_glIndexubv(const GLubyte *c)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_Indexubv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (c), 1);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_PolygonOffset 192
void
__indirect_glPolygonOffset(GLfloat factor, GLfloat units)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_PolygonOffset, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&factor), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&units), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLsop_AreTexturesResident 143
GLboolean
__indirect_glAreTexturesResident(GLsizei n, const GLuint * textures,
                                 GLboolean * residences)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    GLboolean retval = (GLboolean) 0;
#ifndef USE_XCB
    const GLuint cmdlen = 4 + __GLX_PAD((n * 4));
#endif
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return 0;
    }
    if (__builtin_expect((n >= 0) && (dpy != NULL), 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_are_textures_resident_reply_t *reply =
            xcb_glx_are_textures_resident_reply(c,
                                                xcb_glx_are_textures_resident
                                                (c, gc->currentContextTag, n,
                                                 textures), NULL);
        (void) memcpy(residences, xcb_glx_are_textures_resident_data(reply),
                      xcb_glx_are_textures_resident_data_length(reply) *
                      sizeof(GLboolean));
        retval = reply->ret_val;
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_AreTexturesResident, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&n), 4);
        (void) memcpy((void *) (pc + 4), (void *) (textures), (n * 4));
        retval = (GLboolean) __glXReadReply(dpy, 1, residences, GL_TRUE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return retval;
}

#define X_GLvop_AreTexturesResidentEXT 11
GLboolean
glAreTexturesResidentEXT(GLsizei n, const GLuint * textures,
                         GLboolean * residences)
{
    __GLXcontext *const gc = __glXGetCurrentContext();

#ifdef GLX_DIRECT_RENDERING
    if (gc->driContext) {
        return CALL_AreTexturesResident(GET_DISPATCH(),
                                        (n, textures, residences));
    } else
#endif
    {
        __GLXcontext *const gc = __glXGetCurrentContext();
        Display *const dpy = gc->currentDpy;
        GLboolean retval = (GLboolean) 0;
        const GLuint cmdlen = 4 + __GLX_PAD((n * 4));
        if (n < 0) {
            __glXSetError(gc, GL_INVALID_VALUE);
            return 0;
        }
        if (__builtin_expect((n >= 0) && (dpy != NULL), 1)) {
            GLubyte const *pc =
                __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                        X_GLvop_AreTexturesResidentEXT,
                                        cmdlen);
            (void) memcpy((void *) (pc + 0), (void *) (&n), 4);
            (void) memcpy((void *) (pc + 4), (void *) (textures), (n * 4));
            retval = (GLboolean) __glXReadReply(dpy, 1, residences, GL_TRUE);
            UnlockDisplay(dpy);
            SyncHandle();
        }
        return retval;
    }
}

#define X_GLrop_CopyTexImage1D 4119
void
__indirect_glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat,
                            GLint x, GLint y, GLsizei width, GLint border)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 32;
    emit_header(gc->pc, X_GLrop_CopyTexImage1D, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&level), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&internalformat), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 24), (void *) (&width), 4);
    (void) memcpy((void *) (gc->pc + 28), (void *) (&border), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_CopyTexImage2D 4120
void
__indirect_glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat,
                            GLint x, GLint y, GLsizei width, GLsizei height,
                            GLint border)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 36;
    emit_header(gc->pc, X_GLrop_CopyTexImage2D, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&level), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&internalformat), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 24), (void *) (&width), 4);
    (void) memcpy((void *) (gc->pc + 28), (void *) (&height), 4);
    (void) memcpy((void *) (gc->pc + 32), (void *) (&border), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_CopyTexSubImage1D 4121
void
__indirect_glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset,
                               GLint x, GLint y, GLsizei width)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 28;
    emit_header(gc->pc, X_GLrop_CopyTexSubImage1D, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&level), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&xoffset), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 24), (void *) (&width), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_CopyTexSubImage2D 4122
void
__indirect_glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset,
                               GLint yoffset, GLint x, GLint y, GLsizei width,
                               GLsizei height)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 36;
    emit_header(gc->pc, X_GLrop_CopyTexSubImage2D, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&level), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&xoffset), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&yoffset), 4);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 24), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 28), (void *) (&width), 4);
    (void) memcpy((void *) (gc->pc + 32), (void *) (&height), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLsop_DeleteTextures 144
void
__indirect_glDeleteTextures(GLsizei n, const GLuint * textures)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 4 + __GLX_PAD((n * 4));
#endif
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect((n >= 0) && (dpy != NULL), 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_delete_textures(c, gc->currentContextTag, n, textures);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_DeleteTextures, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&n), 4);
        (void) memcpy((void *) (pc + 4), (void *) (textures), (n * 4));
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLvop_DeleteTexturesEXT 12
void
glDeleteTexturesEXT(GLsizei n, const GLuint * textures)
{
    __GLXcontext *const gc = __glXGetCurrentContext();

#ifdef GLX_DIRECT_RENDERING
    if (gc->driContext) {
        CALL_DeleteTextures(GET_DISPATCH(), (n, textures));
    } else
#endif
    {
        __GLXcontext *const gc = __glXGetCurrentContext();
        Display *const dpy = gc->currentDpy;
        const GLuint cmdlen = 4 + __GLX_PAD((n * 4));
        if (n < 0) {
            __glXSetError(gc, GL_INVALID_VALUE);
            return;
        }
        if (__builtin_expect((n >= 0) && (dpy != NULL), 1)) {
            GLubyte const *pc =
                __glXSetupVendorRequest(gc, X_GLXVendorPrivate,
                                        X_GLvop_DeleteTexturesEXT, cmdlen);
            (void) memcpy((void *) (pc + 0), (void *) (&n), 4);
            (void) memcpy((void *) (pc + 4), (void *) (textures), (n * 4));
            UnlockDisplay(dpy);
            SyncHandle();
        }
        return;
    }
}

#define X_GLsop_GenTextures 145
void
__indirect_glGenTextures(GLsizei n, GLuint * textures)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 4;
#endif
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect((n >= 0) && (dpy != NULL), 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_gen_textures_reply_t *reply =
            xcb_glx_gen_textures_reply(c,
                                       xcb_glx_gen_textures(c,
                                                            gc->
                                                            currentContextTag,
                                                            n), NULL);
        (void) memcpy(textures, xcb_glx_gen_textures_data(reply),
                      xcb_glx_gen_textures_data_length(reply) *
                      sizeof(GLuint));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GenTextures, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&n), 4);
        (void) __glXReadReply(dpy, 4, textures, GL_TRUE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLvop_GenTexturesEXT 13
void
glGenTexturesEXT(GLsizei n, GLuint * textures)
{
    __GLXcontext *const gc = __glXGetCurrentContext();

#ifdef GLX_DIRECT_RENDERING
    if (gc->driContext) {
        CALL_GenTextures(GET_DISPATCH(), (n, textures));
    } else
#endif
    {
        __GLXcontext *const gc = __glXGetCurrentContext();
        Display *const dpy = gc->currentDpy;
        const GLuint cmdlen = 4;
        if (n < 0) {
            __glXSetError(gc, GL_INVALID_VALUE);
            return;
        }
        if (__builtin_expect((n >= 0) && (dpy != NULL), 1)) {
            GLubyte const *pc =
                __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                        X_GLvop_GenTexturesEXT, cmdlen);
            (void) memcpy((void *) (pc + 0), (void *) (&n), 4);
            (void) __glXReadReply(dpy, 4, textures, GL_TRUE);
            UnlockDisplay(dpy);
            SyncHandle();
        }
        return;
    }
}

#define X_GLsop_IsTexture 146
GLboolean
__indirect_glIsTexture(GLuint texture)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    GLboolean retval = (GLboolean) 0;
#ifndef USE_XCB
    const GLuint cmdlen = 4;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_is_texture_reply_t *reply =
            xcb_glx_is_texture_reply(c,
                                     xcb_glx_is_texture(c,
                                                        gc->currentContextTag,
                                                        texture), NULL);
        retval = reply->ret_val;
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_IsTexture, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&texture), 4);
        retval = (GLboolean) __glXReadReply(dpy, 0, NULL, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return retval;
}

#define X_GLvop_IsTextureEXT 14
GLboolean
glIsTextureEXT(GLuint texture)
{
    __GLXcontext *const gc = __glXGetCurrentContext();

#ifdef GLX_DIRECT_RENDERING
    if (gc->driContext) {
        return CALL_IsTexture(GET_DISPATCH(), (texture));
    } else
#endif
    {
        __GLXcontext *const gc = __glXGetCurrentContext();
        Display *const dpy = gc->currentDpy;
        GLboolean retval = (GLboolean) 0;
        const GLuint cmdlen = 4;
        if (__builtin_expect(dpy != NULL, 1)) {
            GLubyte const *pc =
                __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                        X_GLvop_IsTextureEXT, cmdlen);
            (void) memcpy((void *) (pc + 0), (void *) (&texture), 4);
            retval = (GLboolean) __glXReadReply(dpy, 0, NULL, GL_FALSE);
            UnlockDisplay(dpy);
            SyncHandle();
        }
        return retval;
    }
}

#define X_GLrop_PrioritizeTextures 4118
void
__indirect_glPrioritizeTextures(GLsizei n, const GLuint * textures,
                                const GLclampf * priorities)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8 + __GLX_PAD((n * 4)) + __GLX_PAD((n * 4));
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(n >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_PrioritizeTextures, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&n), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (textures), (n * 4));
        (void) memcpy((void *) (gc->pc + 8 + (n * 4)), (void *) (priorities),
                      (n * 4));
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

static void
__glx_TexSubImage_1D2D(unsigned opcode, unsigned dim, GLenum target,
                       GLint level, GLint xoffset, GLint yoffset,
                       GLsizei width, GLsizei height, GLenum format,
                       GLenum type, const GLvoid * pixels)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize =
        (pixels != NULL) ? __glImageSize(width, height, 1, format, type,
                                         target) : 0;
    const GLuint cmdlen = 60 + __GLX_PAD(compsize);
    if (__builtin_expect(gc->currentDpy != NULL, 1)) {
        if (cmdlen <= gc->maxSmallRenderCommandSize) {
            if ((gc->pc + cmdlen) > gc->bufEnd) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
            emit_header(gc->pc, opcode, cmdlen);
            (void) memcpy((void *) (gc->pc + 24), (void *) (&target), 4);
            (void) memcpy((void *) (gc->pc + 28), (void *) (&level), 4);
            (void) memcpy((void *) (gc->pc + 32), (void *) (&xoffset), 4);
            (void) memcpy((void *) (gc->pc + 36), (void *) (&yoffset), 4);
            (void) memcpy((void *) (gc->pc + 40), (void *) (&width), 4);
            (void) memcpy((void *) (gc->pc + 44), (void *) (&height), 4);
            (void) memcpy((void *) (gc->pc + 48), (void *) (&format), 4);
            (void) memcpy((void *) (gc->pc + 52), (void *) (&type), 4);
            (void) memcpy((void *) (gc->pc + 56),
                          (void *) ((pixels == NULL) ? one : zero), 4);
            if (compsize > 0) {
                (*gc->fillImage) (gc, dim, width, height, 1, format, type,
                                  pixels, gc->pc + 60, gc->pc + 4);
            } else {
                (void) memcpy(gc->pc + 4, default_pixel_store_2D,
                              default_pixel_store_2D_size);
            }
            gc->pc += cmdlen;
            if (gc->pc > gc->limit) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
        } else {
            const GLint op = opcode;
            const GLuint cmdlenLarge = cmdlen + 4;
            GLubyte *const pc = __glXFlushRenderBuffer(gc, gc->pc);
            (void) memcpy((void *) (pc + 0), (void *) (&cmdlenLarge), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&op), 4);
            (void) memcpy((void *) (pc + 28), (void *) (&target), 4);
            (void) memcpy((void *) (pc + 32), (void *) (&level), 4);
            (void) memcpy((void *) (pc + 36), (void *) (&xoffset), 4);
            (void) memcpy((void *) (pc + 40), (void *) (&yoffset), 4);
            (void) memcpy((void *) (pc + 44), (void *) (&width), 4);
            (void) memcpy((void *) (pc + 48), (void *) (&height), 4);
            (void) memcpy((void *) (pc + 52), (void *) (&format), 4);
            (void) memcpy((void *) (pc + 56), (void *) (&type), 4);
            (void) memcpy((void *) (pc + 60), zero, 4);
            __glXSendLargeImage(gc, compsize, dim, width, height, 1, format,
                                type, pixels, pc + 64, pc + 8);
        }
    }
}

#define X_GLrop_TexSubImage1D 4099
void
__indirect_glTexSubImage1D(GLenum target, GLint level, GLint xoffset,
                           GLsizei width, GLenum format, GLenum type,
                           const GLvoid * pixels)
{
    __glx_TexSubImage_1D2D(X_GLrop_TexSubImage1D, 1, target, level, xoffset,
                           1, width, 1, format, type, pixels);
}

#define X_GLrop_TexSubImage2D 4100
void
__indirect_glTexSubImage2D(GLenum target, GLint level, GLint xoffset,
                           GLint yoffset, GLsizei width, GLsizei height,
                           GLenum format, GLenum type, const GLvoid * pixels)
{
    __glx_TexSubImage_1D2D(X_GLrop_TexSubImage2D, 2, target, level, xoffset,
                           yoffset, width, height, format, type, pixels);
}

#define X_GLrop_BlendColor 4096
void
__indirect_glBlendColor(GLclampf red, GLclampf green, GLclampf blue,
                        GLclampf alpha)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_BlendColor, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&green), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&blue), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&alpha), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_BlendEquation 4097
void
__indirect_glBlendEquation(GLenum mode)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_BlendEquation, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&mode), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ColorTable 2053
void
__indirect_glColorTable(GLenum target, GLenum internalformat, GLsizei width,
                        GLenum format, GLenum type, const GLvoid * table)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize =
        (table != NULL) ? __glImageSize(width, 1, 1, format, type,
                                        target) : 0;
    const GLuint cmdlen = 44 + __GLX_PAD(compsize);
    if (__builtin_expect(gc->currentDpy != NULL, 1)) {
        if (cmdlen <= gc->maxSmallRenderCommandSize) {
            if ((gc->pc + cmdlen) > gc->bufEnd) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
            emit_header(gc->pc, X_GLrop_ColorTable, cmdlen);
            (void) memcpy((void *) (gc->pc + 24), (void *) (&target), 4);
            (void) memcpy((void *) (gc->pc + 28), (void *) (&internalformat),
                          4);
            (void) memcpy((void *) (gc->pc + 32), (void *) (&width), 4);
            (void) memcpy((void *) (gc->pc + 36), (void *) (&format), 4);
            (void) memcpy((void *) (gc->pc + 40), (void *) (&type), 4);
            if (compsize > 0) {
                (*gc->fillImage) (gc, 1, width, 1, 1, format, type, table,
                                  gc->pc + 44, gc->pc + 4);
            } else {
                (void) memcpy(gc->pc + 4, default_pixel_store_1D,
                              default_pixel_store_1D_size);
            }
            gc->pc += cmdlen;
            if (gc->pc > gc->limit) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
        } else {
            const GLint op = X_GLrop_ColorTable;
            const GLuint cmdlenLarge = cmdlen + 4;
            GLubyte *const pc = __glXFlushRenderBuffer(gc, gc->pc);
            (void) memcpy((void *) (pc + 0), (void *) (&cmdlenLarge), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&op), 4);
            (void) memcpy((void *) (pc + 28), (void *) (&target), 4);
            (void) memcpy((void *) (pc + 32), (void *) (&internalformat), 4);
            (void) memcpy((void *) (pc + 36), (void *) (&width), 4);
            (void) memcpy((void *) (pc + 40), (void *) (&format), 4);
            (void) memcpy((void *) (pc + 44), (void *) (&type), 4);
            __glXSendLargeImage(gc, compsize, 1, width, 1, 1, format, type,
                                table, pc + 48, pc + 8);
        }
    }
}

#define X_GLrop_ColorTableParameterfv 2054
void
__indirect_glColorTableParameterfv(GLenum target, GLenum pname,
                                   const GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glColorTableParameterfv_size(pname);
    const GLuint cmdlen = 12 + __GLX_PAD((compsize * 4));
    emit_header(gc->pc, X_GLrop_ColorTableParameterfv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (params), (compsize * 4));
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ColorTableParameteriv 2055
void
__indirect_glColorTableParameteriv(GLenum target, GLenum pname,
                                   const GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glColorTableParameteriv_size(pname);
    const GLuint cmdlen = 12 + __GLX_PAD((compsize * 4));
    emit_header(gc->pc, X_GLrop_ColorTableParameteriv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (params), (compsize * 4));
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_CopyColorTable 2056
void
__indirect_glCopyColorTable(GLenum target, GLenum internalformat, GLint x,
                            GLint y, GLsizei width)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_CopyColorTable, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&internalformat), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&width), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLsop_GetColorTable 147
void
__indirect_glGetColorTable(GLenum target, GLenum format, GLenum type,
                           GLvoid * table)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const __GLXattribute *const state = gc->client_state_private;
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 16;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_color_table_reply_t *reply =
            xcb_glx_get_color_table_reply(c,
                                          xcb_glx_get_color_table(c,
                                                                  gc->
                                                                  currentContextTag,
                                                                  target,
                                                                  format,
                                                                  type,
                                                                  state->
                                                                  storePack.
                                                                  swapEndian),
                                          NULL);
        (void) memcpy(table, xcb_glx_get_color_table_data(reply),
                      xcb_glx_get_color_table_data_length(reply) *
                      sizeof(GLvoid));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetColorTable, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&format), 4);
        (void) memcpy((void *) (pc + 8), (void *) (&type), 4);
        *(int32_t *) (pc + 12) = 0;
        *(int8_t *) (pc + 12) = state->storePack.swapEndian;
        __glXReadPixelReply(dpy, gc, 1, 0, 0, 0, format, type, table,
                            GL_TRUE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLvop_GetColorTableSGI 4098
void
glGetColorTableEXT(GLenum target, GLenum format, GLenum type, GLvoid * table)
{
    __GLXcontext *const gc = __glXGetCurrentContext();

#ifdef GLX_DIRECT_RENDERING
    if (gc->driContext) {
        CALL_GetColorTable(GET_DISPATCH(), (target, format, type, table));
    } else
#endif
    {
        __GLXcontext *const gc = __glXGetCurrentContext();
        const __GLXattribute *const state = gc->client_state_private;
        Display *const dpy = gc->currentDpy;
        const GLuint cmdlen = 16;
        if (__builtin_expect(dpy != NULL, 1)) {
            GLubyte const *pc =
                __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                        X_GLvop_GetColorTableSGI, cmdlen);
            (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&format), 4);
            (void) memcpy((void *) (pc + 8), (void *) (&type), 4);
            *(int32_t *) (pc + 12) = 0;
            *(int8_t *) (pc + 12) = state->storePack.swapEndian;
            __glXReadPixelReply(dpy, gc, 1, 0, 0, 0, format, type, table,
                                GL_TRUE);
            UnlockDisplay(dpy);
            SyncHandle();
        }
        return;
    }
}

#define X_GLsop_GetColorTableParameterfv 148
void
__indirect_glGetColorTableParameterfv(GLenum target, GLenum pname,
                                      GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_color_table_parameterfv_reply_t *reply =
            xcb_glx_get_color_table_parameterfv_reply(c,
                                                      xcb_glx_get_color_table_parameterfv
                                                      (c,
                                                       gc->currentContextTag,
                                                       target, pname), NULL);
        if (xcb_glx_get_color_table_parameterfv_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params,
                          xcb_glx_get_color_table_parameterfv_data(reply),
                          xcb_glx_get_color_table_parameterfv_data_length
                          (reply) * sizeof(GLfloat));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetColorTableParameterfv,
                                    cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLvop_GetColorTableParameterfvSGI 4099
void
glGetColorTableParameterfvEXT(GLenum target, GLenum pname, GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();

#ifdef GLX_DIRECT_RENDERING
    if (gc->driContext) {
        CALL_GetColorTableParameterfv(GET_DISPATCH(),
                                      (target, pname, params));
    } else
#endif
    {
        __GLXcontext *const gc = __glXGetCurrentContext();
        Display *const dpy = gc->currentDpy;
        const GLuint cmdlen = 8;
        if (__builtin_expect(dpy != NULL, 1)) {
            GLubyte const *pc =
                __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                        X_GLvop_GetColorTableParameterfvSGI,
                                        cmdlen);
            (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
            (void) __glXReadReply(dpy, 4, params, GL_FALSE);
            UnlockDisplay(dpy);
            SyncHandle();
        }
        return;
    }
}

#define X_GLsop_GetColorTableParameteriv 149
void
__indirect_glGetColorTableParameteriv(GLenum target, GLenum pname,
                                      GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_color_table_parameteriv_reply_t *reply =
            xcb_glx_get_color_table_parameteriv_reply(c,
                                                      xcb_glx_get_color_table_parameteriv
                                                      (c,
                                                       gc->currentContextTag,
                                                       target, pname), NULL);
        if (xcb_glx_get_color_table_parameteriv_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params,
                          xcb_glx_get_color_table_parameteriv_data(reply),
                          xcb_glx_get_color_table_parameteriv_data_length
                          (reply) * sizeof(GLint));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetColorTableParameteriv,
                                    cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLvop_GetColorTableParameterivSGI 4100
void
glGetColorTableParameterivEXT(GLenum target, GLenum pname, GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();

#ifdef GLX_DIRECT_RENDERING
    if (gc->driContext) {
        CALL_GetColorTableParameteriv(GET_DISPATCH(),
                                      (target, pname, params));
    } else
#endif
    {
        __GLXcontext *const gc = __glXGetCurrentContext();
        Display *const dpy = gc->currentDpy;
        const GLuint cmdlen = 8;
        if (__builtin_expect(dpy != NULL, 1)) {
            GLubyte const *pc =
                __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                        X_GLvop_GetColorTableParameterivSGI,
                                        cmdlen);
            (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
            (void) __glXReadReply(dpy, 4, params, GL_FALSE);
            UnlockDisplay(dpy);
            SyncHandle();
        }
        return;
    }
}

#define X_GLrop_ColorSubTable 195
void
__indirect_glColorSubTable(GLenum target, GLsizei start, GLsizei count,
                           GLenum format, GLenum type, const GLvoid * data)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize =
        (data != NULL) ? __glImageSize(count, 1, 1, format, type, target) : 0;
    const GLuint cmdlen = 44 + __GLX_PAD(compsize);
    if (__builtin_expect(gc->currentDpy != NULL, 1)) {
        if (cmdlen <= gc->maxSmallRenderCommandSize) {
            if ((gc->pc + cmdlen) > gc->bufEnd) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
            emit_header(gc->pc, X_GLrop_ColorSubTable, cmdlen);
            (void) memcpy((void *) (gc->pc + 24), (void *) (&target), 4);
            (void) memcpy((void *) (gc->pc + 28), (void *) (&start), 4);
            (void) memcpy((void *) (gc->pc + 32), (void *) (&count), 4);
            (void) memcpy((void *) (gc->pc + 36), (void *) (&format), 4);
            (void) memcpy((void *) (gc->pc + 40), (void *) (&type), 4);
            if (compsize > 0) {
                (*gc->fillImage) (gc, 1, count, 1, 1, format, type, data,
                                  gc->pc + 44, gc->pc + 4);
            } else {
                (void) memcpy(gc->pc + 4, default_pixel_store_1D,
                              default_pixel_store_1D_size);
            }
            gc->pc += cmdlen;
            if (gc->pc > gc->limit) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
        } else {
            const GLint op = X_GLrop_ColorSubTable;
            const GLuint cmdlenLarge = cmdlen + 4;
            GLubyte *const pc = __glXFlushRenderBuffer(gc, gc->pc);
            (void) memcpy((void *) (pc + 0), (void *) (&cmdlenLarge), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&op), 4);
            (void) memcpy((void *) (pc + 28), (void *) (&target), 4);
            (void) memcpy((void *) (pc + 32), (void *) (&start), 4);
            (void) memcpy((void *) (pc + 36), (void *) (&count), 4);
            (void) memcpy((void *) (pc + 40), (void *) (&format), 4);
            (void) memcpy((void *) (pc + 44), (void *) (&type), 4);
            __glXSendLargeImage(gc, compsize, 1, count, 1, 1, format, type,
                                data, pc + 48, pc + 8);
        }
    }
}

#define X_GLrop_CopyColorSubTable 196
void
__indirect_glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y,
                               GLsizei width)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_CopyColorSubTable, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&start), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&width), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

static void
__glx_ConvolutionFilter_1D2D(unsigned opcode, unsigned dim, GLenum target,
                             GLenum internalformat, GLsizei width,
                             GLsizei height, GLenum format, GLenum type,
                             const GLvoid * image)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize =
        (image != NULL) ? __glImageSize(width, height, 1, format, type,
                                        target) : 0;
    const GLuint cmdlen = 48 + __GLX_PAD(compsize);
    if (__builtin_expect(gc->currentDpy != NULL, 1)) {
        if (cmdlen <= gc->maxSmallRenderCommandSize) {
            if ((gc->pc + cmdlen) > gc->bufEnd) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
            emit_header(gc->pc, opcode, cmdlen);
            (void) memcpy((void *) (gc->pc + 24), (void *) (&target), 4);
            (void) memcpy((void *) (gc->pc + 28), (void *) (&internalformat),
                          4);
            (void) memcpy((void *) (gc->pc + 32), (void *) (&width), 4);
            (void) memcpy((void *) (gc->pc + 36), (void *) (&height), 4);
            (void) memcpy((void *) (gc->pc + 40), (void *) (&format), 4);
            (void) memcpy((void *) (gc->pc + 44), (void *) (&type), 4);
            if (compsize > 0) {
                (*gc->fillImage) (gc, dim, width, height, 1, format, type,
                                  image, gc->pc + 48, gc->pc + 4);
            } else {
                (void) memcpy(gc->pc + 4, default_pixel_store_2D,
                              default_pixel_store_2D_size);
            }
            gc->pc += cmdlen;
            if (gc->pc > gc->limit) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
        } else {
            const GLint op = opcode;
            const GLuint cmdlenLarge = cmdlen + 4;
            GLubyte *const pc = __glXFlushRenderBuffer(gc, gc->pc);
            (void) memcpy((void *) (pc + 0), (void *) (&cmdlenLarge), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&op), 4);
            (void) memcpy((void *) (pc + 28), (void *) (&target), 4);
            (void) memcpy((void *) (pc + 32), (void *) (&internalformat), 4);
            (void) memcpy((void *) (pc + 36), (void *) (&width), 4);
            (void) memcpy((void *) (pc + 40), (void *) (&height), 4);
            (void) memcpy((void *) (pc + 44), (void *) (&format), 4);
            (void) memcpy((void *) (pc + 48), (void *) (&type), 4);
            __glXSendLargeImage(gc, compsize, dim, width, height, 1, format,
                                type, image, pc + 52, pc + 8);
        }
    }
}

#define X_GLrop_ConvolutionFilter1D 4101
void
__indirect_glConvolutionFilter1D(GLenum target, GLenum internalformat,
                                 GLsizei width, GLenum format, GLenum type,
                                 const GLvoid * image)
{
    __glx_ConvolutionFilter_1D2D(X_GLrop_ConvolutionFilter1D, 1, target,
                                 internalformat, width, 1, format, type,
                                 image);
}

#define X_GLrop_ConvolutionFilter2D 4102
void
__indirect_glConvolutionFilter2D(GLenum target, GLenum internalformat,
                                 GLsizei width, GLsizei height, GLenum format,
                                 GLenum type, const GLvoid * image)
{
    __glx_ConvolutionFilter_1D2D(X_GLrop_ConvolutionFilter2D, 2, target,
                                 internalformat, width, height, format, type,
                                 image);
}

#define X_GLrop_ConvolutionParameterf 4103
void
__indirect_glConvolutionParameterf(GLenum target, GLenum pname,
                                   GLfloat params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_ConvolutionParameterf, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&params), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ConvolutionParameterfv 4104
void
__indirect_glConvolutionParameterfv(GLenum target, GLenum pname,
                                    const GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glConvolutionParameterfv_size(pname);
    const GLuint cmdlen = 12 + __GLX_PAD((compsize * 4));
    emit_header(gc->pc, X_GLrop_ConvolutionParameterfv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (params), (compsize * 4));
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ConvolutionParameteri 4105
void
__indirect_glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_ConvolutionParameteri, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&params), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ConvolutionParameteriv 4106
void
__indirect_glConvolutionParameteriv(GLenum target, GLenum pname,
                                    const GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glConvolutionParameteriv_size(pname);
    const GLuint cmdlen = 12 + __GLX_PAD((compsize * 4));
    emit_header(gc->pc, X_GLrop_ConvolutionParameteriv, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (params), (compsize * 4));
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_CopyConvolutionFilter1D 4107
void
__indirect_glCopyConvolutionFilter1D(GLenum target, GLenum internalformat,
                                     GLint x, GLint y, GLsizei width)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_CopyConvolutionFilter1D, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&internalformat), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&width), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_CopyConvolutionFilter2D 4108
void
__indirect_glCopyConvolutionFilter2D(GLenum target, GLenum internalformat,
                                     GLint x, GLint y, GLsizei width,
                                     GLsizei height)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 28;
    emit_header(gc->pc, X_GLrop_CopyConvolutionFilter2D, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&internalformat), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&width), 4);
    (void) memcpy((void *) (gc->pc + 24), (void *) (&height), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLsop_GetConvolutionFilter 150
void
__indirect_glGetConvolutionFilter(GLenum target, GLenum format, GLenum type,
                                  GLvoid * image)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const __GLXattribute *const state = gc->client_state_private;
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 16;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_convolution_filter_reply_t *reply =
            xcb_glx_get_convolution_filter_reply(c,
                                                 xcb_glx_get_convolution_filter
                                                 (c, gc->currentContextTag,
                                                  target, format, type,
                                                  state->storePack.
                                                  swapEndian), NULL);
        (void) memcpy(image, xcb_glx_get_convolution_filter_data(reply),
                      xcb_glx_get_convolution_filter_data_length(reply) *
                      sizeof(GLvoid));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetConvolutionFilter, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&format), 4);
        (void) memcpy((void *) (pc + 8), (void *) (&type), 4);
        *(int32_t *) (pc + 12) = 0;
        *(int8_t *) (pc + 12) = state->storePack.swapEndian;
        __glXReadPixelReply(dpy, gc, 2, 0, 0, 0, format, type, image,
                            GL_TRUE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLvop_GetConvolutionFilterEXT 1
void
gl_dispatch_stub_356(GLenum target, GLenum format, GLenum type,
                     GLvoid * image)
{
    __GLXcontext *const gc = __glXGetCurrentContext();

#ifdef GLX_DIRECT_RENDERING
    if (gc->driContext) {
        CALL_GetConvolutionFilter(GET_DISPATCH(),
                                  (target, format, type, image));
    } else
#endif
    {
        __GLXcontext *const gc = __glXGetCurrentContext();
        const __GLXattribute *const state = gc->client_state_private;
        Display *const dpy = gc->currentDpy;
        const GLuint cmdlen = 16;
        if (__builtin_expect(dpy != NULL, 1)) {
            GLubyte const *pc =
                __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                        X_GLvop_GetConvolutionFilterEXT,
                                        cmdlen);
            (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&format), 4);
            (void) memcpy((void *) (pc + 8), (void *) (&type), 4);
            *(int32_t *) (pc + 12) = 0;
            *(int8_t *) (pc + 12) = state->storePack.swapEndian;
            __glXReadPixelReply(dpy, gc, 2, 0, 0, 0, format, type, image,
                                GL_TRUE);
            UnlockDisplay(dpy);
            SyncHandle();
        }
        return;
    }
}

#define X_GLsop_GetConvolutionParameterfv 151
void
__indirect_glGetConvolutionParameterfv(GLenum target, GLenum pname,
                                       GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_convolution_parameterfv_reply_t *reply =
            xcb_glx_get_convolution_parameterfv_reply(c,
                                                      xcb_glx_get_convolution_parameterfv
                                                      (c,
                                                       gc->currentContextTag,
                                                       target, pname), NULL);
        if (xcb_glx_get_convolution_parameterfv_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params,
                          xcb_glx_get_convolution_parameterfv_data(reply),
                          xcb_glx_get_convolution_parameterfv_data_length
                          (reply) * sizeof(GLfloat));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetConvolutionParameterfv,
                                    cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLvop_GetConvolutionParameterfvEXT 2
void
gl_dispatch_stub_357(GLenum target, GLenum pname, GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();

#ifdef GLX_DIRECT_RENDERING
    if (gc->driContext) {
        CALL_GetConvolutionParameterfv(GET_DISPATCH(),
                                       (target, pname, params));
    } else
#endif
    {
        __GLXcontext *const gc = __glXGetCurrentContext();
        Display *const dpy = gc->currentDpy;
        const GLuint cmdlen = 8;
        if (__builtin_expect(dpy != NULL, 1)) {
            GLubyte const *pc =
                __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                        X_GLvop_GetConvolutionParameterfvEXT,
                                        cmdlen);
            (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
            (void) __glXReadReply(dpy, 4, params, GL_FALSE);
            UnlockDisplay(dpy);
            SyncHandle();
        }
        return;
    }
}

#define X_GLsop_GetConvolutionParameteriv 152
void
__indirect_glGetConvolutionParameteriv(GLenum target, GLenum pname,
                                       GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_convolution_parameteriv_reply_t *reply =
            xcb_glx_get_convolution_parameteriv_reply(c,
                                                      xcb_glx_get_convolution_parameteriv
                                                      (c,
                                                       gc->currentContextTag,
                                                       target, pname), NULL);
        if (xcb_glx_get_convolution_parameteriv_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params,
                          xcb_glx_get_convolution_parameteriv_data(reply),
                          xcb_glx_get_convolution_parameteriv_data_length
                          (reply) * sizeof(GLint));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetConvolutionParameteriv,
                                    cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLvop_GetConvolutionParameterivEXT 3
void
gl_dispatch_stub_358(GLenum target, GLenum pname, GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();

#ifdef GLX_DIRECT_RENDERING
    if (gc->driContext) {
        CALL_GetConvolutionParameteriv(GET_DISPATCH(),
                                       (target, pname, params));
    } else
#endif
    {
        __GLXcontext *const gc = __glXGetCurrentContext();
        Display *const dpy = gc->currentDpy;
        const GLuint cmdlen = 8;
        if (__builtin_expect(dpy != NULL, 1)) {
            GLubyte const *pc =
                __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                        X_GLvop_GetConvolutionParameterivEXT,
                                        cmdlen);
            (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
            (void) __glXReadReply(dpy, 4, params, GL_FALSE);
            UnlockDisplay(dpy);
            SyncHandle();
        }
        return;
    }
}

#define X_GLsop_GetHistogram 154
void
__indirect_glGetHistogram(GLenum target, GLboolean reset, GLenum format,
                          GLenum type, GLvoid * values)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const __GLXattribute *const state = gc->client_state_private;
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 16;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_histogram_reply_t *reply =
            xcb_glx_get_histogram_reply(c,
                                        xcb_glx_get_histogram(c,
                                                              gc->
                                                              currentContextTag,
                                                              target, reset,
                                                              format, type,
                                                              state->
                                                              storePack.
                                                              swapEndian),
                                        NULL);
        (void) memcpy(values, xcb_glx_get_histogram_data(reply),
                      xcb_glx_get_histogram_data_length(reply) *
                      sizeof(GLvoid));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetHistogram, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&format), 4);
        (void) memcpy((void *) (pc + 8), (void *) (&type), 4);
        *(int32_t *) (pc + 12) = 0;
        *(int8_t *) (pc + 12) = state->storePack.swapEndian;
        *(int8_t *) (pc + 13) = reset;
        __glXReadPixelReply(dpy, gc, 1, 0, 0, 0, format, type, values,
                            GL_TRUE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLvop_GetHistogramEXT 5
void
gl_dispatch_stub_361(GLenum target, GLboolean reset, GLenum format,
                     GLenum type, GLvoid * values)
{
    __GLXcontext *const gc = __glXGetCurrentContext();

#ifdef GLX_DIRECT_RENDERING
    if (gc->driContext) {
        CALL_GetHistogram(GET_DISPATCH(),
                          (target, reset, format, type, values));
    } else
#endif
    {
        __GLXcontext *const gc = __glXGetCurrentContext();
        const __GLXattribute *const state = gc->client_state_private;
        Display *const dpy = gc->currentDpy;
        const GLuint cmdlen = 16;
        if (__builtin_expect(dpy != NULL, 1)) {
            GLubyte const *pc =
                __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                        X_GLvop_GetHistogramEXT, cmdlen);
            (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&format), 4);
            (void) memcpy((void *) (pc + 8), (void *) (&type), 4);
            *(int32_t *) (pc + 12) = 0;
            *(int8_t *) (pc + 12) = state->storePack.swapEndian;
            *(int8_t *) (pc + 13) = reset;
            __glXReadPixelReply(dpy, gc, 1, 0, 0, 0, format, type, values,
                                GL_TRUE);
            UnlockDisplay(dpy);
            SyncHandle();
        }
        return;
    }
}

#define X_GLsop_GetHistogramParameterfv 155
void
__indirect_glGetHistogramParameterfv(GLenum target, GLenum pname,
                                     GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_histogram_parameterfv_reply_t *reply =
            xcb_glx_get_histogram_parameterfv_reply(c,
                                                    xcb_glx_get_histogram_parameterfv
                                                    (c, gc->currentContextTag,
                                                     target, pname), NULL);
        if (xcb_glx_get_histogram_parameterfv_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params,
                          xcb_glx_get_histogram_parameterfv_data(reply),
                          xcb_glx_get_histogram_parameterfv_data_length(reply)
                          * sizeof(GLfloat));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetHistogramParameterfv,
                                    cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLvop_GetHistogramParameterfvEXT 6
void
gl_dispatch_stub_362(GLenum target, GLenum pname, GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();

#ifdef GLX_DIRECT_RENDERING
    if (gc->driContext) {
        CALL_GetHistogramParameterfv(GET_DISPATCH(), (target, pname, params));
    } else
#endif
    {
        __GLXcontext *const gc = __glXGetCurrentContext();
        Display *const dpy = gc->currentDpy;
        const GLuint cmdlen = 8;
        if (__builtin_expect(dpy != NULL, 1)) {
            GLubyte const *pc =
                __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                        X_GLvop_GetHistogramParameterfvEXT,
                                        cmdlen);
            (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
            (void) __glXReadReply(dpy, 4, params, GL_FALSE);
            UnlockDisplay(dpy);
            SyncHandle();
        }
        return;
    }
}

#define X_GLsop_GetHistogramParameteriv 156
void
__indirect_glGetHistogramParameteriv(GLenum target, GLenum pname,
                                     GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_histogram_parameteriv_reply_t *reply =
            xcb_glx_get_histogram_parameteriv_reply(c,
                                                    xcb_glx_get_histogram_parameteriv
                                                    (c, gc->currentContextTag,
                                                     target, pname), NULL);
        if (xcb_glx_get_histogram_parameteriv_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params,
                          xcb_glx_get_histogram_parameteriv_data(reply),
                          xcb_glx_get_histogram_parameteriv_data_length(reply)
                          * sizeof(GLint));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetHistogramParameteriv,
                                    cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLvop_GetHistogramParameterivEXT 7
void
gl_dispatch_stub_363(GLenum target, GLenum pname, GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();

#ifdef GLX_DIRECT_RENDERING
    if (gc->driContext) {
        CALL_GetHistogramParameteriv(GET_DISPATCH(), (target, pname, params));
    } else
#endif
    {
        __GLXcontext *const gc = __glXGetCurrentContext();
        Display *const dpy = gc->currentDpy;
        const GLuint cmdlen = 8;
        if (__builtin_expect(dpy != NULL, 1)) {
            GLubyte const *pc =
                __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                        X_GLvop_GetHistogramParameterivEXT,
                                        cmdlen);
            (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
            (void) __glXReadReply(dpy, 4, params, GL_FALSE);
            UnlockDisplay(dpy);
            SyncHandle();
        }
        return;
    }
}

#define X_GLsop_GetMinmax 157
void
__indirect_glGetMinmax(GLenum target, GLboolean reset, GLenum format,
                       GLenum type, GLvoid * values)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const __GLXattribute *const state = gc->client_state_private;
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 16;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_minmax_reply_t *reply =
            xcb_glx_get_minmax_reply(c,
                                     xcb_glx_get_minmax(c,
                                                        gc->currentContextTag,
                                                        target, reset, format,
                                                        type,
                                                        state->storePack.
                                                        swapEndian), NULL);
        (void) memcpy(values, xcb_glx_get_minmax_data(reply),
                      xcb_glx_get_minmax_data_length(reply) * sizeof(GLvoid));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetMinmax, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&format), 4);
        (void) memcpy((void *) (pc + 8), (void *) (&type), 4);
        *(int32_t *) (pc + 12) = 0;
        *(int8_t *) (pc + 12) = state->storePack.swapEndian;
        *(int8_t *) (pc + 13) = reset;
        __glXReadPixelReply(dpy, gc, 1, 2, 1, 1, format, type, values,
                            GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLvop_GetMinmaxEXT 8
void
gl_dispatch_stub_364(GLenum target, GLboolean reset, GLenum format,
                     GLenum type, GLvoid * values)
{
    __GLXcontext *const gc = __glXGetCurrentContext();

#ifdef GLX_DIRECT_RENDERING
    if (gc->driContext) {
        CALL_GetMinmax(GET_DISPATCH(), (target, reset, format, type, values));
    } else
#endif
    {
        __GLXcontext *const gc = __glXGetCurrentContext();
        const __GLXattribute *const state = gc->client_state_private;
        Display *const dpy = gc->currentDpy;
        const GLuint cmdlen = 16;
        if (__builtin_expect(dpy != NULL, 1)) {
            GLubyte const *pc =
                __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                        X_GLvop_GetMinmaxEXT, cmdlen);
            (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&format), 4);
            (void) memcpy((void *) (pc + 8), (void *) (&type), 4);
            *(int32_t *) (pc + 12) = 0;
            *(int8_t *) (pc + 12) = state->storePack.swapEndian;
            *(int8_t *) (pc + 13) = reset;
            __glXReadPixelReply(dpy, gc, 1, 2, 1, 1, format, type, values,
                                GL_FALSE);
            UnlockDisplay(dpy);
            SyncHandle();
        }
        return;
    }
}

#define X_GLsop_GetMinmaxParameterfv 158
void
__indirect_glGetMinmaxParameterfv(GLenum target, GLenum pname,
                                  GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_minmax_parameterfv_reply_t *reply =
            xcb_glx_get_minmax_parameterfv_reply(c,
                                                 xcb_glx_get_minmax_parameterfv
                                                 (c, gc->currentContextTag,
                                                  target, pname), NULL);
        if (xcb_glx_get_minmax_parameterfv_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params, xcb_glx_get_minmax_parameterfv_data(reply),
                          xcb_glx_get_minmax_parameterfv_data_length(reply) *
                          sizeof(GLfloat));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetMinmaxParameterfv, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLvop_GetMinmaxParameterfvEXT 9
void
gl_dispatch_stub_365(GLenum target, GLenum pname, GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();

#ifdef GLX_DIRECT_RENDERING
    if (gc->driContext) {
        CALL_GetMinmaxParameterfv(GET_DISPATCH(), (target, pname, params));
    } else
#endif
    {
        __GLXcontext *const gc = __glXGetCurrentContext();
        Display *const dpy = gc->currentDpy;
        const GLuint cmdlen = 8;
        if (__builtin_expect(dpy != NULL, 1)) {
            GLubyte const *pc =
                __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                        X_GLvop_GetMinmaxParameterfvEXT,
                                        cmdlen);
            (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
            (void) __glXReadReply(dpy, 4, params, GL_FALSE);
            UnlockDisplay(dpy);
            SyncHandle();
        }
        return;
    }
}

#define X_GLsop_GetMinmaxParameteriv 159
void
__indirect_glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_minmax_parameteriv_reply_t *reply =
            xcb_glx_get_minmax_parameteriv_reply(c,
                                                 xcb_glx_get_minmax_parameteriv
                                                 (c, gc->currentContextTag,
                                                  target, pname), NULL);
        if (xcb_glx_get_minmax_parameteriv_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params, xcb_glx_get_minmax_parameteriv_data(reply),
                          xcb_glx_get_minmax_parameteriv_data_length(reply) *
                          sizeof(GLint));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetMinmaxParameteriv, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLvop_GetMinmaxParameterivEXT 10
void
gl_dispatch_stub_366(GLenum target, GLenum pname, GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();

#ifdef GLX_DIRECT_RENDERING
    if (gc->driContext) {
        CALL_GetMinmaxParameteriv(GET_DISPATCH(), (target, pname, params));
    } else
#endif
    {
        __GLXcontext *const gc = __glXGetCurrentContext();
        Display *const dpy = gc->currentDpy;
        const GLuint cmdlen = 8;
        if (__builtin_expect(dpy != NULL, 1)) {
            GLubyte const *pc =
                __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                        X_GLvop_GetMinmaxParameterivEXT,
                                        cmdlen);
            (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
            (void) __glXReadReply(dpy, 4, params, GL_FALSE);
            UnlockDisplay(dpy);
            SyncHandle();
        }
        return;
    }
}

#define X_GLrop_Histogram 4110
void
__indirect_glHistogram(GLenum target, GLsizei width, GLenum internalformat,
                       GLboolean sink)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_Histogram, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&width), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&internalformat), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&sink), 1);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_Minmax 4111
void
__indirect_glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_Minmax, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&internalformat), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&sink), 1);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ResetHistogram 4112
void
__indirect_glResetHistogram(GLenum target)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_ResetHistogram, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ResetMinmax 4113
void
__indirect_glResetMinmax(GLenum target)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_ResetMinmax, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

static void
__glx_TexImage_3D4D(unsigned opcode, unsigned dim, GLenum target, GLint level,
                    GLint internalformat, GLsizei width, GLsizei height,
                    GLsizei depth, GLsizei extent, GLint border,
                    GLenum format, GLenum type, const GLvoid * pixels)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize =
        (pixels != NULL) ? __glImageSize(width, height, depth, format, type,
                                         target) : 0;
    const GLuint cmdlen = 84 + __GLX_PAD(compsize);
    if (__builtin_expect(gc->currentDpy != NULL, 1)) {
        if (cmdlen <= gc->maxSmallRenderCommandSize) {
            if ((gc->pc + cmdlen) > gc->bufEnd) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
            emit_header(gc->pc, opcode, cmdlen);
            (void) memcpy((void *) (gc->pc + 40), (void *) (&target), 4);
            (void) memcpy((void *) (gc->pc + 44), (void *) (&level), 4);
            (void) memcpy((void *) (gc->pc + 48), (void *) (&internalformat),
                          4);
            (void) memcpy((void *) (gc->pc + 52), (void *) (&width), 4);
            (void) memcpy((void *) (gc->pc + 56), (void *) (&height), 4);
            (void) memcpy((void *) (gc->pc + 60), (void *) (&depth), 4);
            (void) memcpy((void *) (gc->pc + 64), (void *) (&extent), 4);
            (void) memcpy((void *) (gc->pc + 68), (void *) (&border), 4);
            (void) memcpy((void *) (gc->pc + 72), (void *) (&format), 4);
            (void) memcpy((void *) (gc->pc + 76), (void *) (&type), 4);
            (void) memcpy((void *) (gc->pc + 80),
                          (void *) ((pixels == NULL) ? one : zero), 4);
            if (compsize > 0) {
                (*gc->fillImage) (gc, dim, width, height, depth, format, type,
                                  pixels, gc->pc + 84, gc->pc + 4);
            } else {
                (void) memcpy(gc->pc + 4, default_pixel_store_4D,
                              default_pixel_store_4D_size);
            }
            gc->pc += cmdlen;
            if (gc->pc > gc->limit) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
        } else {
            const GLint op = opcode;
            const GLuint cmdlenLarge = cmdlen + 4;
            GLubyte *const pc = __glXFlushRenderBuffer(gc, gc->pc);
            (void) memcpy((void *) (pc + 0), (void *) (&cmdlenLarge), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&op), 4);
            (void) memcpy((void *) (pc + 44), (void *) (&target), 4);
            (void) memcpy((void *) (pc + 48), (void *) (&level), 4);
            (void) memcpy((void *) (pc + 52), (void *) (&internalformat), 4);
            (void) memcpy((void *) (pc + 56), (void *) (&width), 4);
            (void) memcpy((void *) (pc + 60), (void *) (&height), 4);
            (void) memcpy((void *) (pc + 64), (void *) (&depth), 4);
            (void) memcpy((void *) (pc + 68), (void *) (&extent), 4);
            (void) memcpy((void *) (pc + 72), (void *) (&border), 4);
            (void) memcpy((void *) (pc + 76), (void *) (&format), 4);
            (void) memcpy((void *) (pc + 80), (void *) (&type), 4);
            (void) memcpy((void *) (pc + 84), zero, 4);
            __glXSendLargeImage(gc, compsize, dim, width, height, depth,
                                format, type, pixels, pc + 88, pc + 8);
        }
    }
}

#define X_GLrop_TexImage3D 4114
void
__indirect_glTexImage3D(GLenum target, GLint level, GLint internalformat,
                        GLsizei width, GLsizei height, GLsizei depth,
                        GLint border, GLenum format, GLenum type,
                        const GLvoid * pixels)
{
    __glx_TexImage_3D4D(X_GLrop_TexImage3D, 3, target, level, internalformat,
                        width, height, depth, 1, border, format, type,
                        pixels);
}

static void
__glx_TexSubImage_3D4D(unsigned opcode, unsigned dim, GLenum target,
                       GLint level, GLint xoffset, GLint yoffset,
                       GLint zoffset, GLint woffset, GLsizei width,
                       GLsizei height, GLsizei depth, GLsizei extent,
                       GLenum format, GLenum type, const GLvoid * pixels)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize =
        (pixels != NULL) ? __glImageSize(width, height, depth, format, type,
                                         target) : 0;
    const GLuint cmdlen = 92 + __GLX_PAD(compsize);
    if (__builtin_expect(gc->currentDpy != NULL, 1)) {
        if (cmdlen <= gc->maxSmallRenderCommandSize) {
            if ((gc->pc + cmdlen) > gc->bufEnd) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
            emit_header(gc->pc, opcode, cmdlen);
            (void) memcpy((void *) (gc->pc + 40), (void *) (&target), 4);
            (void) memcpy((void *) (gc->pc + 44), (void *) (&level), 4);
            (void) memcpy((void *) (gc->pc + 48), (void *) (&xoffset), 4);
            (void) memcpy((void *) (gc->pc + 52), (void *) (&yoffset), 4);
            (void) memcpy((void *) (gc->pc + 56), (void *) (&zoffset), 4);
            (void) memcpy((void *) (gc->pc + 60), (void *) (&woffset), 4);
            (void) memcpy((void *) (gc->pc + 64), (void *) (&width), 4);
            (void) memcpy((void *) (gc->pc + 68), (void *) (&height), 4);
            (void) memcpy((void *) (gc->pc + 72), (void *) (&depth), 4);
            (void) memcpy((void *) (gc->pc + 76), (void *) (&extent), 4);
            (void) memcpy((void *) (gc->pc + 80), (void *) (&format), 4);
            (void) memcpy((void *) (gc->pc + 84), (void *) (&type), 4);
            (void) memcpy((void *) (gc->pc + 88),
                          (void *) ((pixels == NULL) ? one : zero), 4);
            if (compsize > 0) {
                (*gc->fillImage) (gc, dim, width, height, depth, format, type,
                                  pixels, gc->pc + 92, gc->pc + 4);
            } else {
                (void) memcpy(gc->pc + 4, default_pixel_store_4D,
                              default_pixel_store_4D_size);
            }
            gc->pc += cmdlen;
            if (gc->pc > gc->limit) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
        } else {
            const GLint op = opcode;
            const GLuint cmdlenLarge = cmdlen + 4;
            GLubyte *const pc = __glXFlushRenderBuffer(gc, gc->pc);
            (void) memcpy((void *) (pc + 0), (void *) (&cmdlenLarge), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&op), 4);
            (void) memcpy((void *) (pc + 44), (void *) (&target), 4);
            (void) memcpy((void *) (pc + 48), (void *) (&level), 4);
            (void) memcpy((void *) (pc + 52), (void *) (&xoffset), 4);
            (void) memcpy((void *) (pc + 56), (void *) (&yoffset), 4);
            (void) memcpy((void *) (pc + 60), (void *) (&zoffset), 4);
            (void) memcpy((void *) (pc + 64), (void *) (&woffset), 4);
            (void) memcpy((void *) (pc + 68), (void *) (&width), 4);
            (void) memcpy((void *) (pc + 72), (void *) (&height), 4);
            (void) memcpy((void *) (pc + 76), (void *) (&depth), 4);
            (void) memcpy((void *) (pc + 80), (void *) (&extent), 4);
            (void) memcpy((void *) (pc + 84), (void *) (&format), 4);
            (void) memcpy((void *) (pc + 88), (void *) (&type), 4);
            (void) memcpy((void *) (pc + 92), zero, 4);
            __glXSendLargeImage(gc, compsize, dim, width, height, depth,
                                format, type, pixels, pc + 96, pc + 8);
        }
    }
}

#define X_GLrop_TexSubImage3D 4115
void
__indirect_glTexSubImage3D(GLenum target, GLint level, GLint xoffset,
                           GLint yoffset, GLint zoffset, GLsizei width,
                           GLsizei height, GLsizei depth, GLenum format,
                           GLenum type, const GLvoid * pixels)
{
    __glx_TexSubImage_3D4D(X_GLrop_TexSubImage3D, 3, target, level, xoffset,
                           yoffset, zoffset, 1, width, height, depth, 1,
                           format, type, pixels);
}

#define X_GLrop_CopyTexSubImage3D 4123
void
__indirect_glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset,
                               GLint yoffset, GLint zoffset, GLint x, GLint y,
                               GLsizei width, GLsizei height)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 40;
    emit_header(gc->pc, X_GLrop_CopyTexSubImage3D, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&level), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&xoffset), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&yoffset), 4);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&zoffset), 4);
    (void) memcpy((void *) (gc->pc + 24), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 28), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 32), (void *) (&width), 4);
    (void) memcpy((void *) (gc->pc + 36), (void *) (&height), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ActiveTextureARB 197
void
__indirect_glActiveTextureARB(GLenum texture)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_ActiveTextureARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&texture), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord1dvARB 198
void
__indirect_glMultiTexCoord1dARB(GLenum target, GLdouble s)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_MultiTexCoord1dvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&s), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&target), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord1dvARB 198
void
__indirect_glMultiTexCoord1dvARB(GLenum target, const GLdouble * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_MultiTexCoord1dvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (v), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&target), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord1fvARB 199
void
__indirect_glMultiTexCoord1fARB(GLenum target, GLfloat s)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_MultiTexCoord1fvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&s), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord1fvARB 199
void
__indirect_glMultiTexCoord1fvARB(GLenum target, const GLfloat * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_MultiTexCoord1fvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord1ivARB 200
void
__indirect_glMultiTexCoord1iARB(GLenum target, GLint s)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_MultiTexCoord1ivARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&s), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord1ivARB 200
void
__indirect_glMultiTexCoord1ivARB(GLenum target, const GLint * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_MultiTexCoord1ivARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord1svARB 201
void
__indirect_glMultiTexCoord1sARB(GLenum target, GLshort s)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_MultiTexCoord1svARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&s), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord1svARB 201
void
__indirect_glMultiTexCoord1svARB(GLenum target, const GLshort * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_MultiTexCoord1svARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord2dvARB 202
void
__indirect_glMultiTexCoord2dARB(GLenum target, GLdouble s, GLdouble t)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_MultiTexCoord2dvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&s), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&t), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&target), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord2dvARB 202
void
__indirect_glMultiTexCoord2dvARB(GLenum target, const GLdouble * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_MultiTexCoord2dvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (v), 16);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&target), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord2fvARB 203
void
__indirect_glMultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_MultiTexCoord2fvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&s), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&t), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord2fvARB 203
void
__indirect_glMultiTexCoord2fvARB(GLenum target, const GLfloat * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_MultiTexCoord2fvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord2ivARB 204
void
__indirect_glMultiTexCoord2iARB(GLenum target, GLint s, GLint t)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_MultiTexCoord2ivARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&s), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&t), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord2ivARB 204
void
__indirect_glMultiTexCoord2ivARB(GLenum target, const GLint * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_MultiTexCoord2ivARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord2svARB 205
void
__indirect_glMultiTexCoord2sARB(GLenum target, GLshort s, GLshort t)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_MultiTexCoord2svARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&s), 2);
    (void) memcpy((void *) (gc->pc + 10), (void *) (&t), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord2svARB 205
void
__indirect_glMultiTexCoord2svARB(GLenum target, const GLshort * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_MultiTexCoord2svARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord3dvARB 206
void
__indirect_glMultiTexCoord3dARB(GLenum target, GLdouble s, GLdouble t,
                                GLdouble r)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 32;
    emit_header(gc->pc, X_GLrop_MultiTexCoord3dvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&s), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&t), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&r), 8);
    (void) memcpy((void *) (gc->pc + 28), (void *) (&target), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord3dvARB 206
void
__indirect_glMultiTexCoord3dvARB(GLenum target, const GLdouble * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 32;
    emit_header(gc->pc, X_GLrop_MultiTexCoord3dvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (v), 24);
    (void) memcpy((void *) (gc->pc + 28), (void *) (&target), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord3fvARB 207
void
__indirect_glMultiTexCoord3fARB(GLenum target, GLfloat s, GLfloat t,
                                GLfloat r)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_MultiTexCoord3fvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&s), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&t), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&r), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord3fvARB 207
void
__indirect_glMultiTexCoord3fvARB(GLenum target, const GLfloat * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_MultiTexCoord3fvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 12);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord3ivARB 208
void
__indirect_glMultiTexCoord3iARB(GLenum target, GLint s, GLint t, GLint r)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_MultiTexCoord3ivARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&s), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&t), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&r), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord3ivARB 208
void
__indirect_glMultiTexCoord3ivARB(GLenum target, const GLint * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_MultiTexCoord3ivARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 12);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord3svARB 209
void
__indirect_glMultiTexCoord3sARB(GLenum target, GLshort s, GLshort t,
                                GLshort r)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_MultiTexCoord3svARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&s), 2);
    (void) memcpy((void *) (gc->pc + 10), (void *) (&t), 2);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&r), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord3svARB 209
void
__indirect_glMultiTexCoord3svARB(GLenum target, const GLshort * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_MultiTexCoord3svARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 6);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord4dvARB 210
void
__indirect_glMultiTexCoord4dARB(GLenum target, GLdouble s, GLdouble t,
                                GLdouble r, GLdouble q)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 40;
    emit_header(gc->pc, X_GLrop_MultiTexCoord4dvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&s), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&t), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&r), 8);
    (void) memcpy((void *) (gc->pc + 28), (void *) (&q), 8);
    (void) memcpy((void *) (gc->pc + 36), (void *) (&target), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord4dvARB 210
void
__indirect_glMultiTexCoord4dvARB(GLenum target, const GLdouble * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 40;
    emit_header(gc->pc, X_GLrop_MultiTexCoord4dvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (v), 32);
    (void) memcpy((void *) (gc->pc + 36), (void *) (&target), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord4fvARB 211
void
__indirect_glMultiTexCoord4fARB(GLenum target, GLfloat s, GLfloat t,
                                GLfloat r, GLfloat q)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_MultiTexCoord4fvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&s), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&t), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&r), 4);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&q), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord4fvARB 211
void
__indirect_glMultiTexCoord4fvARB(GLenum target, const GLfloat * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_MultiTexCoord4fvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 16);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord4ivARB 212
void
__indirect_glMultiTexCoord4iARB(GLenum target, GLint s, GLint t, GLint r,
                                GLint q)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_MultiTexCoord4ivARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&s), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&t), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&r), 4);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&q), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord4ivARB 212
void
__indirect_glMultiTexCoord4ivARB(GLenum target, const GLint * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_MultiTexCoord4ivARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 16);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord4svARB 213
void
__indirect_glMultiTexCoord4sARB(GLenum target, GLshort s, GLshort t,
                                GLshort r, GLshort q)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_MultiTexCoord4svARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&s), 2);
    (void) memcpy((void *) (gc->pc + 10), (void *) (&t), 2);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&r), 2);
    (void) memcpy((void *) (gc->pc + 14), (void *) (&q), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_MultiTexCoord4svARB 213
void
__indirect_glMultiTexCoord4svARB(GLenum target, const GLshort * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_MultiTexCoord4svARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_SampleCoverageARB 229
void
__indirect_glSampleCoverageARB(GLclampf value, GLboolean invert)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_SampleCoverageARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&value), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&invert), 1);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLvop_GetProgramStringARB 1308
void
__indirect_glGetProgramStringARB(GLenum target, GLenum pname, GLvoid * string)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    const GLuint cmdlen = 8;
    if (__builtin_expect(dpy != NULL, 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_GetProgramStringARB, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 1, string, GL_TRUE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return;
}

#define X_GLvop_GetProgramivARB 1307
void
__indirect_glGetProgramivARB(GLenum target, GLenum pname, GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    const GLuint cmdlen = 8;
    if (__builtin_expect(dpy != NULL, 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_GetProgramivARB, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return;
}

#define X_GLrop_ProgramEnvParameter4dvARB 4185
void
__indirect_glProgramEnvParameter4dARB(GLenum target, GLuint index, GLdouble x,
                                      GLdouble y, GLdouble z, GLdouble w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 44;
    emit_header(gc->pc, X_GLrop_ProgramEnvParameter4dvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&x), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&y), 8);
    (void) memcpy((void *) (gc->pc + 28), (void *) (&z), 8);
    (void) memcpy((void *) (gc->pc + 36), (void *) (&w), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ProgramEnvParameter4dvARB 4185
void
__indirect_glProgramEnvParameter4dvARB(GLenum target, GLuint index,
                                       const GLdouble * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 44;
    emit_header(gc->pc, X_GLrop_ProgramEnvParameter4dvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (params), 32);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ProgramEnvParameter4fvARB 4184
void
__indirect_glProgramEnvParameter4fARB(GLenum target, GLuint index, GLfloat x,
                                      GLfloat y, GLfloat z, GLfloat w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 28;
    emit_header(gc->pc, X_GLrop_ProgramEnvParameter4fvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&z), 4);
    (void) memcpy((void *) (gc->pc + 24), (void *) (&w), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ProgramEnvParameter4fvARB 4184
void
__indirect_glProgramEnvParameter4fvARB(GLenum target, GLuint index,
                                       const GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 28;
    emit_header(gc->pc, X_GLrop_ProgramEnvParameter4fvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (params), 16);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ProgramLocalParameter4dvARB 4216
void
__indirect_glProgramLocalParameter4dARB(GLenum target, GLuint index,
                                        GLdouble x, GLdouble y, GLdouble z,
                                        GLdouble w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 44;
    emit_header(gc->pc, X_GLrop_ProgramLocalParameter4dvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&x), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&y), 8);
    (void) memcpy((void *) (gc->pc + 28), (void *) (&z), 8);
    (void) memcpy((void *) (gc->pc + 36), (void *) (&w), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ProgramLocalParameter4dvARB 4216
void
__indirect_glProgramLocalParameter4dvARB(GLenum target, GLuint index,
                                         const GLdouble * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 44;
    emit_header(gc->pc, X_GLrop_ProgramLocalParameter4dvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (params), 32);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ProgramLocalParameter4fvARB 4215
void
__indirect_glProgramLocalParameter4fARB(GLenum target, GLuint index,
                                        GLfloat x, GLfloat y, GLfloat z,
                                        GLfloat w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 28;
    emit_header(gc->pc, X_GLrop_ProgramLocalParameter4fvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&z), 4);
    (void) memcpy((void *) (gc->pc + 24), (void *) (&w), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ProgramLocalParameter4fvARB 4215
void
__indirect_glProgramLocalParameter4fvARB(GLenum target, GLuint index,
                                         const GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 28;
    emit_header(gc->pc, X_GLrop_ProgramLocalParameter4fvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (params), 16);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ProgramStringARB 4217
void
__indirect_glProgramStringARB(GLenum target, GLenum format, GLsizei len,
                              const GLvoid * string)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16 + __GLX_PAD(len);
    if (len < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect((len >= 0) && (gc->currentDpy != NULL), 1)) {
        if (cmdlen <= gc->maxSmallRenderCommandSize) {
            if ((gc->pc + cmdlen) > gc->bufEnd) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
            emit_header(gc->pc, X_GLrop_ProgramStringARB, cmdlen);
            (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
            (void) memcpy((void *) (gc->pc + 8), (void *) (&format), 4);
            (void) memcpy((void *) (gc->pc + 12), (void *) (&len), 4);
            (void) memcpy((void *) (gc->pc + 16), (void *) (string), len);
            gc->pc += cmdlen;
            if (__builtin_expect(gc->pc > gc->limit, 0)) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
        } else {
            const GLint op = X_GLrop_ProgramStringARB;
            const GLuint cmdlenLarge = cmdlen + 4;
            GLubyte *const pc = __glXFlushRenderBuffer(gc, gc->pc);
            (void) memcpy((void *) (pc + 0), (void *) (&cmdlenLarge), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&op), 4);
            (void) memcpy((void *) (pc + 8), (void *) (&target), 4);
            (void) memcpy((void *) (pc + 12), (void *) (&format), 4);
            (void) memcpy((void *) (pc + 16), (void *) (&len), 4);
            __glXSendLargeCommand(gc, pc, 20, string, len);
        }
    }
}

#define X_GLrop_VertexAttrib1dvARB 4197
void
__indirect_glVertexAttrib1dARB(GLuint index, GLdouble x)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_VertexAttrib1dvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib1dvARB 4197
void
__indirect_glVertexAttrib1dvARB(GLuint index, const GLdouble * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_VertexAttrib1dvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib1fvARB 4193
void
__indirect_glVertexAttrib1fARB(GLuint index, GLfloat x)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_VertexAttrib1fvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib1fvARB 4193
void
__indirect_glVertexAttrib1fvARB(GLuint index, const GLfloat * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_VertexAttrib1fvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib1svARB 4189
void
__indirect_glVertexAttrib1sARB(GLuint index, GLshort x)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_VertexAttrib1svARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib1svARB 4189
void
__indirect_glVertexAttrib1svARB(GLuint index, const GLshort * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_VertexAttrib1svARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib2dvARB 4198
void
__indirect_glVertexAttrib2dARB(GLuint index, GLdouble x, GLdouble y)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_VertexAttrib2dvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 8);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&y), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib2dvARB 4198
void
__indirect_glVertexAttrib2dvARB(GLuint index, const GLdouble * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_VertexAttrib2dvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 16);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib2fvARB 4194
void
__indirect_glVertexAttrib2fARB(GLuint index, GLfloat x, GLfloat y)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_VertexAttrib2fvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&y), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib2fvARB 4194
void
__indirect_glVertexAttrib2fvARB(GLuint index, const GLfloat * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_VertexAttrib2fvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib2svARB 4190
void
__indirect_glVertexAttrib2sARB(GLuint index, GLshort x, GLshort y)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_VertexAttrib2svARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 2);
    (void) memcpy((void *) (gc->pc + 10), (void *) (&y), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib2svARB 4190
void
__indirect_glVertexAttrib2svARB(GLuint index, const GLshort * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_VertexAttrib2svARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib3dvARB 4199
void
__indirect_glVertexAttrib3dARB(GLuint index, GLdouble x, GLdouble y,
                               GLdouble z)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 32;
    emit_header(gc->pc, X_GLrop_VertexAttrib3dvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 8);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&y), 8);
    (void) memcpy((void *) (gc->pc + 24), (void *) (&z), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib3dvARB 4199
void
__indirect_glVertexAttrib3dvARB(GLuint index, const GLdouble * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 32;
    emit_header(gc->pc, X_GLrop_VertexAttrib3dvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 24);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib3fvARB 4195
void
__indirect_glVertexAttrib3fARB(GLuint index, GLfloat x, GLfloat y, GLfloat z)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_VertexAttrib3fvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&z), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib3fvARB 4195
void
__indirect_glVertexAttrib3fvARB(GLuint index, const GLfloat * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_VertexAttrib3fvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 12);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib3svARB 4191
void
__indirect_glVertexAttrib3sARB(GLuint index, GLshort x, GLshort y, GLshort z)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_VertexAttrib3svARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 2);
    (void) memcpy((void *) (gc->pc + 10), (void *) (&y), 2);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&z), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib3svARB 4191
void
__indirect_glVertexAttrib3svARB(GLuint index, const GLshort * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_VertexAttrib3svARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 6);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4NbvARB 4235
void
__indirect_glVertexAttrib4NbvARB(GLuint index, const GLbyte *v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_VertexAttrib4NbvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4NivARB 4237
void
__indirect_glVertexAttrib4NivARB(GLuint index, const GLint * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_VertexAttrib4NivARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 16);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4NsvARB 4236
void
__indirect_glVertexAttrib4NsvARB(GLuint index, const GLshort * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_VertexAttrib4NsvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4NubvARB 4201
void
__indirect_glVertexAttrib4NubARB(GLuint index, GLubyte x, GLubyte y,
                                 GLubyte z, GLubyte w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_VertexAttrib4NubvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 1);
    (void) memcpy((void *) (gc->pc + 9), (void *) (&y), 1);
    (void) memcpy((void *) (gc->pc + 10), (void *) (&z), 1);
    (void) memcpy((void *) (gc->pc + 11), (void *) (&w), 1);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4NubvARB 4201
void
__indirect_glVertexAttrib4NubvARB(GLuint index, const GLubyte *v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_VertexAttrib4NubvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4NuivARB 4239
void
__indirect_glVertexAttrib4NuivARB(GLuint index, const GLuint * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_VertexAttrib4NuivARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 16);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4NusvARB 4238
void
__indirect_glVertexAttrib4NusvARB(GLuint index, const GLushort * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_VertexAttrib4NusvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4bvARB 4230
void
__indirect_glVertexAttrib4bvARB(GLuint index, const GLbyte *v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_VertexAttrib4bvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4dvARB 4200
void
__indirect_glVertexAttrib4dARB(GLuint index, GLdouble x, GLdouble y,
                               GLdouble z, GLdouble w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 40;
    emit_header(gc->pc, X_GLrop_VertexAttrib4dvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 8);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&y), 8);
    (void) memcpy((void *) (gc->pc + 24), (void *) (&z), 8);
    (void) memcpy((void *) (gc->pc + 32), (void *) (&w), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4dvARB 4200
void
__indirect_glVertexAttrib4dvARB(GLuint index, const GLdouble * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 40;
    emit_header(gc->pc, X_GLrop_VertexAttrib4dvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 32);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4fvARB 4196
void
__indirect_glVertexAttrib4fARB(GLuint index, GLfloat x, GLfloat y, GLfloat z,
                               GLfloat w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_VertexAttrib4fvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&z), 4);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&w), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4fvARB 4196
void
__indirect_glVertexAttrib4fvARB(GLuint index, const GLfloat * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_VertexAttrib4fvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 16);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4ivARB 4231
void
__indirect_glVertexAttrib4ivARB(GLuint index, const GLint * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_VertexAttrib4ivARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 16);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4svARB 4192
void
__indirect_glVertexAttrib4sARB(GLuint index, GLshort x, GLshort y, GLshort z,
                               GLshort w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_VertexAttrib4svARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 2);
    (void) memcpy((void *) (gc->pc + 10), (void *) (&y), 2);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&z), 2);
    (void) memcpy((void *) (gc->pc + 14), (void *) (&w), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4svARB 4192
void
__indirect_glVertexAttrib4svARB(GLuint index, const GLshort * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_VertexAttrib4svARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4ubvARB 4232
void
__indirect_glVertexAttrib4ubvARB(GLuint index, const GLubyte *v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_VertexAttrib4ubvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4uivARB 4234
void
__indirect_glVertexAttrib4uivARB(GLuint index, const GLuint * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_VertexAttrib4uivARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 16);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4usvARB 4233
void
__indirect_glVertexAttrib4usvARB(GLuint index, const GLushort * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_VertexAttrib4usvARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_BeginQueryARB 231
void
__indirect_glBeginQueryARB(GLenum target, GLuint id)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_BeginQueryARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&id), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLsop_DeleteQueriesARB 161
void
__indirect_glDeleteQueriesARB(GLsizei n, const GLuint * ids)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 4 + __GLX_PAD((n * 4));
#endif
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect((n >= 0) && (dpy != NULL), 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_delete_queries_arb(c, gc->currentContextTag, n, ids);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_DeleteQueriesARB, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&n), 4);
        (void) memcpy((void *) (pc + 4), (void *) (ids), (n * 4));
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLrop_EndQueryARB 232
void
__indirect_glEndQueryARB(GLenum target)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_EndQueryARB, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLsop_GenQueriesARB 162
void
__indirect_glGenQueriesARB(GLsizei n, GLuint * ids)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 4;
#endif
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect((n >= 0) && (dpy != NULL), 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_gen_queries_arb_reply_t *reply =
            xcb_glx_gen_queries_arb_reply(c,
                                          xcb_glx_gen_queries_arb(c,
                                                                  gc->
                                                                  currentContextTag,
                                                                  n), NULL);
        (void) memcpy(ids, xcb_glx_gen_queries_arb_data(reply),
                      xcb_glx_gen_queries_arb_data_length(reply) *
                      sizeof(GLuint));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GenQueriesARB, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&n), 4);
        (void) __glXReadReply(dpy, 4, ids, GL_TRUE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetQueryObjectivARB 165
void
__indirect_glGetQueryObjectivARB(GLuint id, GLenum pname, GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_query_objectiv_arb_reply_t *reply =
            xcb_glx_get_query_objectiv_arb_reply(c,
                                                 xcb_glx_get_query_objectiv_arb
                                                 (c, gc->currentContextTag,
                                                  id, pname), NULL);
        if (xcb_glx_get_query_objectiv_arb_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params, xcb_glx_get_query_objectiv_arb_data(reply),
                          xcb_glx_get_query_objectiv_arb_data_length(reply) *
                          sizeof(GLint));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetQueryObjectivARB, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&id), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetQueryObjectuivARB 166
void
__indirect_glGetQueryObjectuivARB(GLuint id, GLenum pname, GLuint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_query_objectuiv_arb_reply_t *reply =
            xcb_glx_get_query_objectuiv_arb_reply(c,
                                                  xcb_glx_get_query_objectuiv_arb
                                                  (c, gc->currentContextTag,
                                                   id, pname), NULL);
        if (xcb_glx_get_query_objectuiv_arb_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params, xcb_glx_get_query_objectuiv_arb_data(reply),
                          xcb_glx_get_query_objectuiv_arb_data_length(reply) *
                          sizeof(GLuint));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetQueryObjectuivARB, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&id), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_GetQueryivARB 164
void
__indirect_glGetQueryivARB(GLenum target, GLenum pname, GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
#ifndef USE_XCB
    const GLuint cmdlen = 8;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_get_queryiv_arb_reply_t *reply =
            xcb_glx_get_queryiv_arb_reply(c,
                                          xcb_glx_get_queryiv_arb(c,
                                                                  gc->
                                                                  currentContextTag,
                                                                  target,
                                                                  pname),
                                          NULL);
        if (xcb_glx_get_queryiv_arb_data_length(reply) == 0)
            (void) memcpy(params, &reply->datum, sizeof(reply->datum));
        else
            (void) memcpy(params, xcb_glx_get_queryiv_arb_data(reply),
                          xcb_glx_get_queryiv_arb_data_length(reply) *
                          sizeof(GLint));
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_GetQueryivARB, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return;
}

#define X_GLsop_IsQueryARB 163
GLboolean
__indirect_glIsQueryARB(GLuint id)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    GLboolean retval = (GLboolean) 0;
#ifndef USE_XCB
    const GLuint cmdlen = 4;
#endif
    if (__builtin_expect(dpy != NULL, 1)) {
#ifdef USE_XCB
        xcb_connection_t *c = XGetXCBConnection(dpy);
        (void) __glXFlushRenderBuffer(gc, gc->pc);
        xcb_glx_is_query_arb_reply_t *reply =
            xcb_glx_is_query_arb_reply(c,
                                       xcb_glx_is_query_arb(c,
                                                            gc->
                                                            currentContextTag,
                                                            id), NULL);
        retval = reply->ret_val;
        free(reply);
#else
        GLubyte const *pc =
            __glXSetupSingleRequest(gc, X_GLsop_IsQueryARB, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&id), 4);
        retval = (GLboolean) __glXReadReply(dpy, 0, NULL, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
#endif /* USE_XCB */
    }
    return retval;
}

#define X_GLrop_DrawBuffersARB 233
void
__indirect_glDrawBuffersARB(GLsizei n, const GLenum * bufs)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8 + __GLX_PAD((n * 4));
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect((n >= 0) && (gc->currentDpy != NULL), 1)) {
        if (cmdlen <= gc->maxSmallRenderCommandSize) {
            if ((gc->pc + cmdlen) > gc->bufEnd) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
            emit_header(gc->pc, X_GLrop_DrawBuffersARB, cmdlen);
            (void) memcpy((void *) (gc->pc + 4), (void *) (&n), 4);
            (void) memcpy((void *) (gc->pc + 8), (void *) (bufs), (n * 4));
            gc->pc += cmdlen;
            if (__builtin_expect(gc->pc > gc->limit, 0)) {
                (void) __glXFlushRenderBuffer(gc, gc->pc);
            }
        } else {
            const GLint op = X_GLrop_DrawBuffersARB;
            const GLuint cmdlenLarge = cmdlen + 4;
            GLubyte *const pc = __glXFlushRenderBuffer(gc, gc->pc);
            (void) memcpy((void *) (pc + 0), (void *) (&cmdlenLarge), 4);
            (void) memcpy((void *) (pc + 4), (void *) (&op), 4);
            (void) memcpy((void *) (pc + 8), (void *) (&n), 4);
            __glXSendLargeCommand(gc, pc, 12, bufs, (n * 4));
        }
    }
}

#define X_GLrop_SampleMaskSGIS 2048
void
__indirect_glSampleMaskSGIS(GLclampf value, GLboolean invert)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_SampleMaskSGIS, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&value), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&invert), 1);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_SamplePatternSGIS 2049
void
__indirect_glSamplePatternSGIS(GLenum pattern)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_SamplePatternSGIS, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&pattern), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_PointParameterfEXT 2065
void
__indirect_glPointParameterfEXT(GLenum pname, GLfloat param)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_PointParameterfEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&param), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_PointParameterfvEXT 2066
void
__indirect_glPointParameterfvEXT(GLenum pname, const GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glPointParameterfvEXT_size(pname);
    const GLuint cmdlen = 8 + __GLX_PAD((compsize * 4));
    emit_header(gc->pc, X_GLrop_PointParameterfvEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (params), (compsize * 4));
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_SecondaryColor3bvEXT 4126
void
__indirect_glSecondaryColor3bEXT(GLbyte red, GLbyte green, GLbyte blue)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_SecondaryColor3bvEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 1);
    (void) memcpy((void *) (gc->pc + 5), (void *) (&green), 1);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&blue), 1);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_SecondaryColor3bvEXT 4126
void
__indirect_glSecondaryColor3bvEXT(const GLbyte *v)
{
    generic_3_byte(X_GLrop_SecondaryColor3bvEXT, v);
}

#define X_GLrop_SecondaryColor3dvEXT 4130
void
__indirect_glSecondaryColor3dEXT(GLdouble red, GLdouble green, GLdouble blue)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 28;
    emit_header(gc->pc, X_GLrop_SecondaryColor3dvEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 8);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&green), 8);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&blue), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_SecondaryColor3dvEXT 4130
void
__indirect_glSecondaryColor3dvEXT(const GLdouble * v)
{
    generic_24_byte(X_GLrop_SecondaryColor3dvEXT, v);
}

#define X_GLrop_SecondaryColor3fvEXT 4129
void
__indirect_glSecondaryColor3fEXT(GLfloat red, GLfloat green, GLfloat blue)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_SecondaryColor3fvEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&green), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&blue), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_SecondaryColor3fvEXT 4129
void
__indirect_glSecondaryColor3fvEXT(const GLfloat * v)
{
    generic_12_byte(X_GLrop_SecondaryColor3fvEXT, v);
}

#define X_GLrop_SecondaryColor3ivEXT 4128
void
__indirect_glSecondaryColor3iEXT(GLint red, GLint green, GLint blue)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_SecondaryColor3ivEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&green), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&blue), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_SecondaryColor3ivEXT 4128
void
__indirect_glSecondaryColor3ivEXT(const GLint * v)
{
    generic_12_byte(X_GLrop_SecondaryColor3ivEXT, v);
}

#define X_GLrop_SecondaryColor3svEXT 4127
void
__indirect_glSecondaryColor3sEXT(GLshort red, GLshort green, GLshort blue)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_SecondaryColor3svEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 2);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&green), 2);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&blue), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_SecondaryColor3svEXT 4127
void
__indirect_glSecondaryColor3svEXT(const GLshort * v)
{
    generic_6_byte(X_GLrop_SecondaryColor3svEXT, v);
}

#define X_GLrop_SecondaryColor3ubvEXT 4131
void
__indirect_glSecondaryColor3ubEXT(GLubyte red, GLubyte green, GLubyte blue)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_SecondaryColor3ubvEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 1);
    (void) memcpy((void *) (gc->pc + 5), (void *) (&green), 1);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&blue), 1);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_SecondaryColor3ubvEXT 4131
void
__indirect_glSecondaryColor3ubvEXT(const GLubyte *v)
{
    generic_3_byte(X_GLrop_SecondaryColor3ubvEXT, v);
}

#define X_GLrop_SecondaryColor3uivEXT 4133
void
__indirect_glSecondaryColor3uiEXT(GLuint red, GLuint green, GLuint blue)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_SecondaryColor3uivEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&green), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&blue), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_SecondaryColor3uivEXT 4133
void
__indirect_glSecondaryColor3uivEXT(const GLuint * v)
{
    generic_12_byte(X_GLrop_SecondaryColor3uivEXT, v);
}

#define X_GLrop_SecondaryColor3usvEXT 4132
void
__indirect_glSecondaryColor3usEXT(GLushort red, GLushort green, GLushort blue)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_SecondaryColor3usvEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&red), 2);
    (void) memcpy((void *) (gc->pc + 6), (void *) (&green), 2);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&blue), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_SecondaryColor3usvEXT 4132
void
__indirect_glSecondaryColor3usvEXT(const GLushort * v)
{
    generic_6_byte(X_GLrop_SecondaryColor3usvEXT, v);
}

#define X_GLrop_FogCoorddvEXT 4125
void
__indirect_glFogCoorddEXT(GLdouble coord)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_FogCoorddvEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&coord), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_FogCoorddvEXT 4125
void
__indirect_glFogCoorddvEXT(const GLdouble * coord)
{
    generic_8_byte(X_GLrop_FogCoorddvEXT, coord);
}

#define X_GLrop_FogCoordfvEXT 4124
void
__indirect_glFogCoordfEXT(GLfloat coord)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_FogCoordfvEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&coord), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_FogCoordfvEXT 4124
void
__indirect_glFogCoordfvEXT(const GLfloat * coord)
{
    generic_4_byte(X_GLrop_FogCoordfvEXT, coord);
}

#define X_GLrop_BlendFuncSeparateEXT 4134
void
__indirect_glBlendFuncSeparateEXT(GLenum sfactorRGB, GLenum dfactorRGB,
                                  GLenum sfactorAlpha, GLenum dfactorAlpha)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_BlendFuncSeparateEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&sfactorRGB), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&dfactorRGB), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&sfactorAlpha), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&dfactorAlpha), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_WindowPos3fvMESA 230
void
__indirect_glWindowPos3fMESA(GLfloat x, GLfloat y, GLfloat z)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_WindowPos3fvMESA, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&z), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_WindowPos3fvMESA 230
void
__indirect_glWindowPos3fvMESA(const GLfloat * v)
{
    generic_12_byte(X_GLrop_WindowPos3fvMESA, v);
}

#define X_GLvop_AreProgramsResidentNV 1293
GLboolean
__indirect_glAreProgramsResidentNV(GLsizei n, const GLuint * ids,
                                   GLboolean * residences)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    GLboolean retval = (GLboolean) 0;
    const GLuint cmdlen = 4 + __GLX_PAD((n * 4));
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return 0;
    }
    if (__builtin_expect((n >= 0) && (dpy != NULL), 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_AreProgramsResidentNV, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&n), 4);
        (void) memcpy((void *) (pc + 4), (void *) (ids), (n * 4));
        retval = (GLboolean) __glXReadReply(dpy, 1, residences, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return retval;
}

#define X_GLrop_BindProgramNV 4180
void
__indirect_glBindProgramNV(GLenum target, GLuint program)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_BindProgramNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&program), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLvop_DeleteProgramsNV 1294
void
__indirect_glDeleteProgramsNV(GLsizei n, const GLuint * programs)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    const GLuint cmdlen = 4 + __GLX_PAD((n * 4));
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect((n >= 0) && (dpy != NULL), 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivate,
                                    X_GLvop_DeleteProgramsNV, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&n), 4);
        (void) memcpy((void *) (pc + 4), (void *) (programs), (n * 4));
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return;
}

#define X_GLrop_ExecuteProgramNV 4181
void
__indirect_glExecuteProgramNV(GLenum target, GLuint id,
                              const GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 28;
    emit_header(gc->pc, X_GLrop_ExecuteProgramNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&id), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (params), 16);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLvop_GenProgramsNV 1295
void
__indirect_glGenProgramsNV(GLsizei n, GLuint * programs)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    const GLuint cmdlen = 4;
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect((n >= 0) && (dpy != NULL), 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_GenProgramsNV, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&n), 4);
        (void) __glXReadReply(dpy, 4, programs, GL_TRUE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return;
}

#define X_GLvop_GetProgramParameterdvNV 1297
void
__indirect_glGetProgramParameterdvNV(GLenum target, GLuint index,
                                     GLenum pname, GLdouble * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    const GLuint cmdlen = 12;
    if (__builtin_expect(dpy != NULL, 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_GetProgramParameterdvNV, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&index), 4);
        (void) memcpy((void *) (pc + 8), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 8, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return;
}

#define X_GLvop_GetProgramParameterfvNV 1296
void
__indirect_glGetProgramParameterfvNV(GLenum target, GLuint index,
                                     GLenum pname, GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    const GLuint cmdlen = 12;
    if (__builtin_expect(dpy != NULL, 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_GetProgramParameterfvNV, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&index), 4);
        (void) memcpy((void *) (pc + 8), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return;
}

#define X_GLvop_GetProgramStringNV 1299
void
__indirect_glGetProgramStringNV(GLuint id, GLenum pname, GLubyte *program)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    const GLuint cmdlen = 8;
    if (__builtin_expect(dpy != NULL, 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_GetProgramStringNV, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&id), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 1, program, GL_TRUE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return;
}

#define X_GLvop_GetProgramivNV 1298
void
__indirect_glGetProgramivNV(GLuint id, GLenum pname, GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    const GLuint cmdlen = 8;
    if (__builtin_expect(dpy != NULL, 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_GetProgramivNV, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&id), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return;
}

#define X_GLvop_GetTrackMatrixivNV 1300
void
__indirect_glGetTrackMatrixivNV(GLenum target, GLuint address, GLenum pname,
                                GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    const GLuint cmdlen = 12;
    if (__builtin_expect(dpy != NULL, 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_GetTrackMatrixivNV, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&address), 4);
        (void) memcpy((void *) (pc + 8), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return;
}

#define X_GLvop_GetVertexAttribdvNV 1301
void
__indirect_glGetVertexAttribdvNV(GLuint index, GLenum pname,
                                 GLdouble * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    const GLuint cmdlen = 8;
    if (__builtin_expect(dpy != NULL, 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_GetVertexAttribdvNV, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&index), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 8, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return;
}

#define X_GLvop_GetVertexAttribfvNV 1302
void
__indirect_glGetVertexAttribfvNV(GLuint index, GLenum pname, GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    const GLuint cmdlen = 8;
    if (__builtin_expect(dpy != NULL, 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_GetVertexAttribfvNV, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&index), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return;
}

#define X_GLvop_GetVertexAttribivNV 1303
void
__indirect_glGetVertexAttribivNV(GLuint index, GLenum pname, GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    const GLuint cmdlen = 8;
    if (__builtin_expect(dpy != NULL, 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_GetVertexAttribivNV, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&index), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return;
}

#define X_GLvop_IsProgramNV 1304
GLboolean
__indirect_glIsProgramNV(GLuint program)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    GLboolean retval = (GLboolean) 0;
    const GLuint cmdlen = 4;
    if (__builtin_expect(dpy != NULL, 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_IsProgramNV, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&program), 4);
        retval = (GLboolean) __glXReadReply(dpy, 0, NULL, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return retval;
}

#define X_GLrop_LoadProgramNV 4183
void
__indirect_glLoadProgramNV(GLenum target, GLuint id, GLsizei len,
                           const GLubyte *program)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16 + __GLX_PAD(len);
    if (len < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(len >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_LoadProgramNV, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (&id), 4);
        (void) memcpy((void *) (gc->pc + 12), (void *) (&len), 4);
        (void) memcpy((void *) (gc->pc + 16), (void *) (program), len);
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_ProgramParameters4dvNV 4187
void
__indirect_glProgramParameters4dvNV(GLenum target, GLuint index, GLuint num,
                                    const GLdouble * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16 + __GLX_PAD((num * 32));
    if (num < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(num >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_ProgramParameters4dvNV, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (&index), 4);
        (void) memcpy((void *) (gc->pc + 12), (void *) (&num), 4);
        (void) memcpy((void *) (gc->pc + 16), (void *) (params), (num * 32));
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_ProgramParameters4fvNV 4186
void
__indirect_glProgramParameters4fvNV(GLenum target, GLuint index, GLuint num,
                                    const GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16 + __GLX_PAD((num * 16));
    if (num < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(num >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_ProgramParameters4fvNV, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (&index), 4);
        (void) memcpy((void *) (gc->pc + 12), (void *) (&num), 4);
        (void) memcpy((void *) (gc->pc + 16), (void *) (params), (num * 16));
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_RequestResidentProgramsNV 4182
void
__indirect_glRequestResidentProgramsNV(GLsizei n, const GLuint * ids)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8 + __GLX_PAD((n * 4));
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(n >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_RequestResidentProgramsNV, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&n), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (ids), (n * 4));
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_TrackMatrixNV 4188
void
__indirect_glTrackMatrixNV(GLenum target, GLuint address, GLenum matrix,
                           GLenum transform)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_TrackMatrixNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&address), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&matrix), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&transform), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib1dvNV 4273
void
__indirect_glVertexAttrib1dNV(GLuint index, GLdouble x)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_VertexAttrib1dvNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib1dvNV 4273
void
__indirect_glVertexAttrib1dvNV(GLuint index, const GLdouble * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_VertexAttrib1dvNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib1fvNV 4269
void
__indirect_glVertexAttrib1fNV(GLuint index, GLfloat x)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_VertexAttrib1fvNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib1fvNV 4269
void
__indirect_glVertexAttrib1fvNV(GLuint index, const GLfloat * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_VertexAttrib1fvNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib1svNV 4265
void
__indirect_glVertexAttrib1sNV(GLuint index, GLshort x)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_VertexAttrib1svNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib1svNV 4265
void
__indirect_glVertexAttrib1svNV(GLuint index, const GLshort * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_VertexAttrib1svNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib2dvNV 4274
void
__indirect_glVertexAttrib2dNV(GLuint index, GLdouble x, GLdouble y)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_VertexAttrib2dvNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 8);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&y), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib2dvNV 4274
void
__indirect_glVertexAttrib2dvNV(GLuint index, const GLdouble * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_VertexAttrib2dvNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 16);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib2fvNV 4270
void
__indirect_glVertexAttrib2fNV(GLuint index, GLfloat x, GLfloat y)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_VertexAttrib2fvNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&y), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib2fvNV 4270
void
__indirect_glVertexAttrib2fvNV(GLuint index, const GLfloat * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_VertexAttrib2fvNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib2svNV 4266
void
__indirect_glVertexAttrib2sNV(GLuint index, GLshort x, GLshort y)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_VertexAttrib2svNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 2);
    (void) memcpy((void *) (gc->pc + 10), (void *) (&y), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib2svNV 4266
void
__indirect_glVertexAttrib2svNV(GLuint index, const GLshort * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_VertexAttrib2svNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib3dvNV 4275
void
__indirect_glVertexAttrib3dNV(GLuint index, GLdouble x, GLdouble y,
                              GLdouble z)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 32;
    emit_header(gc->pc, X_GLrop_VertexAttrib3dvNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 8);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&y), 8);
    (void) memcpy((void *) (gc->pc + 24), (void *) (&z), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib3dvNV 4275
void
__indirect_glVertexAttrib3dvNV(GLuint index, const GLdouble * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 32;
    emit_header(gc->pc, X_GLrop_VertexAttrib3dvNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 24);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib3fvNV 4271
void
__indirect_glVertexAttrib3fNV(GLuint index, GLfloat x, GLfloat y, GLfloat z)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_VertexAttrib3fvNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&z), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib3fvNV 4271
void
__indirect_glVertexAttrib3fvNV(GLuint index, const GLfloat * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_VertexAttrib3fvNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 12);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib3svNV 4267
void
__indirect_glVertexAttrib3sNV(GLuint index, GLshort x, GLshort y, GLshort z)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_VertexAttrib3svNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 2);
    (void) memcpy((void *) (gc->pc + 10), (void *) (&y), 2);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&z), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib3svNV 4267
void
__indirect_glVertexAttrib3svNV(GLuint index, const GLshort * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_VertexAttrib3svNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 6);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4dvNV 4276
void
__indirect_glVertexAttrib4dNV(GLuint index, GLdouble x, GLdouble y,
                              GLdouble z, GLdouble w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 40;
    emit_header(gc->pc, X_GLrop_VertexAttrib4dvNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 8);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&y), 8);
    (void) memcpy((void *) (gc->pc + 24), (void *) (&z), 8);
    (void) memcpy((void *) (gc->pc + 32), (void *) (&w), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4dvNV 4276
void
__indirect_glVertexAttrib4dvNV(GLuint index, const GLdouble * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 40;
    emit_header(gc->pc, X_GLrop_VertexAttrib4dvNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 32);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4fvNV 4272
void
__indirect_glVertexAttrib4fNV(GLuint index, GLfloat x, GLfloat y, GLfloat z,
                              GLfloat w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_VertexAttrib4fvNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&y), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&z), 4);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&w), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4fvNV 4272
void
__indirect_glVertexAttrib4fvNV(GLuint index, const GLfloat * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_VertexAttrib4fvNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 16);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4svNV 4268
void
__indirect_glVertexAttrib4sNV(GLuint index, GLshort x, GLshort y, GLshort z,
                              GLshort w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_VertexAttrib4svNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 2);
    (void) memcpy((void *) (gc->pc + 10), (void *) (&y), 2);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&z), 2);
    (void) memcpy((void *) (gc->pc + 14), (void *) (&w), 2);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4svNV 4268
void
__indirect_glVertexAttrib4svNV(GLuint index, const GLshort * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 16;
    emit_header(gc->pc, X_GLrop_VertexAttrib4svNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 8);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4ubvNV 4277
void
__indirect_glVertexAttrib4ubNV(GLuint index, GLubyte x, GLubyte y, GLubyte z,
                               GLubyte w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_VertexAttrib4ubvNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&x), 1);
    (void) memcpy((void *) (gc->pc + 9), (void *) (&y), 1);
    (void) memcpy((void *) (gc->pc + 10), (void *) (&z), 1);
    (void) memcpy((void *) (gc->pc + 11), (void *) (&w), 1);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttrib4ubvNV 4277
void
__indirect_glVertexAttrib4ubvNV(GLuint index, const GLubyte *v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_VertexAttrib4ubvNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (v), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_VertexAttribs1dvNV 4210
void
__indirect_glVertexAttribs1dvNV(GLuint index, GLsizei n, const GLdouble * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12 + __GLX_PAD((n * 8));
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(n >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_VertexAttribs1dvNV, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (&n), 4);
        (void) memcpy((void *) (gc->pc + 12), (void *) (v), (n * 8));
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_VertexAttribs1fvNV 4206
void
__indirect_glVertexAttribs1fvNV(GLuint index, GLsizei n, const GLfloat * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12 + __GLX_PAD((n * 4));
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(n >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_VertexAttribs1fvNV, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (&n), 4);
        (void) memcpy((void *) (gc->pc + 12), (void *) (v), (n * 4));
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_VertexAttribs1svNV 4202
void
__indirect_glVertexAttribs1svNV(GLuint index, GLsizei n, const GLshort * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12 + __GLX_PAD((n * 2));
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(n >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_VertexAttribs1svNV, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (&n), 4);
        (void) memcpy((void *) (gc->pc + 12), (void *) (v), (n * 2));
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_VertexAttribs2dvNV 4211
void
__indirect_glVertexAttribs2dvNV(GLuint index, GLsizei n, const GLdouble * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12 + __GLX_PAD((n * 16));
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(n >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_VertexAttribs2dvNV, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (&n), 4);
        (void) memcpy((void *) (gc->pc + 12), (void *) (v), (n * 16));
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_VertexAttribs2fvNV 4207
void
__indirect_glVertexAttribs2fvNV(GLuint index, GLsizei n, const GLfloat * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12 + __GLX_PAD((n * 8));
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(n >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_VertexAttribs2fvNV, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (&n), 4);
        (void) memcpy((void *) (gc->pc + 12), (void *) (v), (n * 8));
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_VertexAttribs2svNV 4203
void
__indirect_glVertexAttribs2svNV(GLuint index, GLsizei n, const GLshort * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12 + __GLX_PAD((n * 4));
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(n >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_VertexAttribs2svNV, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (&n), 4);
        (void) memcpy((void *) (gc->pc + 12), (void *) (v), (n * 4));
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_VertexAttribs3dvNV 4212
void
__indirect_glVertexAttribs3dvNV(GLuint index, GLsizei n, const GLdouble * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12 + __GLX_PAD((n * 24));
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(n >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_VertexAttribs3dvNV, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (&n), 4);
        (void) memcpy((void *) (gc->pc + 12), (void *) (v), (n * 24));
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_VertexAttribs3fvNV 4208
void
__indirect_glVertexAttribs3fvNV(GLuint index, GLsizei n, const GLfloat * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12 + __GLX_PAD((n * 12));
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(n >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_VertexAttribs3fvNV, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (&n), 4);
        (void) memcpy((void *) (gc->pc + 12), (void *) (v), (n * 12));
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_VertexAttribs3svNV 4204
void
__indirect_glVertexAttribs3svNV(GLuint index, GLsizei n, const GLshort * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12 + __GLX_PAD((n * 6));
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(n >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_VertexAttribs3svNV, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (&n), 4);
        (void) memcpy((void *) (gc->pc + 12), (void *) (v), (n * 6));
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_VertexAttribs4dvNV 4213
void
__indirect_glVertexAttribs4dvNV(GLuint index, GLsizei n, const GLdouble * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12 + __GLX_PAD((n * 32));
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(n >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_VertexAttribs4dvNV, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (&n), 4);
        (void) memcpy((void *) (gc->pc + 12), (void *) (v), (n * 32));
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_VertexAttribs4fvNV 4209
void
__indirect_glVertexAttribs4fvNV(GLuint index, GLsizei n, const GLfloat * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12 + __GLX_PAD((n * 16));
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(n >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_VertexAttribs4fvNV, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (&n), 4);
        (void) memcpy((void *) (gc->pc + 12), (void *) (v), (n * 16));
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_VertexAttribs4svNV 4205
void
__indirect_glVertexAttribs4svNV(GLuint index, GLsizei n, const GLshort * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12 + __GLX_PAD((n * 8));
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(n >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_VertexAttribs4svNV, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (&n), 4);
        (void) memcpy((void *) (gc->pc + 12), (void *) (v), (n * 8));
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_VertexAttribs4ubvNV 4214
void
__indirect_glVertexAttribs4ubvNV(GLuint index, GLsizei n, const GLubyte *v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12 + __GLX_PAD((n * 4));
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(n >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_VertexAttribs4ubvNV, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&index), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (&n), 4);
        (void) memcpy((void *) (gc->pc + 12), (void *) (v), (n * 4));
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_PointParameteriNV 4221
void
__indirect_glPointParameteriNV(GLenum pname, GLint param)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_PointParameteriNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&param), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_PointParameterivNV 4222
void
__indirect_glPointParameterivNV(GLenum pname, const GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint compsize = __glPointParameterivNV_size(pname);
    const GLuint cmdlen = 8 + __GLX_PAD((compsize * 4));
    emit_header(gc->pc, X_GLrop_PointParameterivNV, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&pname), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (params), (compsize * 4));
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_ActiveStencilFaceEXT 4220
void
__indirect_glActiveStencilFaceEXT(GLenum face)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_ActiveStencilFaceEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&face), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLvop_GetProgramNamedParameterdvNV 1311
void
__indirect_glGetProgramNamedParameterdvNV(GLuint id, GLsizei len,
                                          const GLubyte *name,
                                          GLdouble * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    const GLuint cmdlen = 8 + __GLX_PAD(len);
    if (len < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect((len >= 0) && (dpy != NULL), 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_GetProgramNamedParameterdvNV,
                                    cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&id), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&len), 4);
        (void) memcpy((void *) (pc + 8), (void *) (name), len);
        (void) __glXReadReply(dpy, 8, params, GL_TRUE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return;
}

#define X_GLvop_GetProgramNamedParameterfvNV 1310
void
__indirect_glGetProgramNamedParameterfvNV(GLuint id, GLsizei len,
                                          const GLubyte *name,
                                          GLfloat * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    const GLuint cmdlen = 8 + __GLX_PAD(len);
    if (len < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect((len >= 0) && (dpy != NULL), 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_GetProgramNamedParameterfvNV,
                                    cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&id), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&len), 4);
        (void) memcpy((void *) (pc + 8), (void *) (name), len);
        (void) __glXReadReply(dpy, 4, params, GL_TRUE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return;
}

#define X_GLrop_ProgramNamedParameter4dvNV 4219
void
__indirect_glProgramNamedParameter4dNV(GLuint id, GLsizei len,
                                       const GLubyte *name, GLdouble x,
                                       GLdouble y, GLdouble z, GLdouble w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 44 + __GLX_PAD(len);
    if (len < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(len >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_ProgramNamedParameter4dvNV, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&x), 8);
        (void) memcpy((void *) (gc->pc + 12), (void *) (&y), 8);
        (void) memcpy((void *) (gc->pc + 20), (void *) (&z), 8);
        (void) memcpy((void *) (gc->pc + 28), (void *) (&w), 8);
        (void) memcpy((void *) (gc->pc + 36), (void *) (&id), 4);
        (void) memcpy((void *) (gc->pc + 40), (void *) (&len), 4);
        (void) memcpy((void *) (gc->pc + 44), (void *) (name), len);
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_ProgramNamedParameter4dvNV 4219
void
__indirect_glProgramNamedParameter4dvNV(GLuint id, GLsizei len,
                                        const GLubyte *name,
                                        const GLdouble * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 44 + __GLX_PAD(len);
    if (len < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(len >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_ProgramNamedParameter4dvNV, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (v), 32);
        (void) memcpy((void *) (gc->pc + 36), (void *) (&id), 4);
        (void) memcpy((void *) (gc->pc + 40), (void *) (&len), 4);
        (void) memcpy((void *) (gc->pc + 44), (void *) (name), len);
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_ProgramNamedParameter4fvNV 4218
void
__indirect_glProgramNamedParameter4fNV(GLuint id, GLsizei len,
                                       const GLubyte *name, GLfloat x,
                                       GLfloat y, GLfloat z, GLfloat w)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 28 + __GLX_PAD(len);
    if (len < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(len >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_ProgramNamedParameter4fvNV, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&id), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (&len), 4);
        (void) memcpy((void *) (gc->pc + 12), (void *) (&x), 4);
        (void) memcpy((void *) (gc->pc + 16), (void *) (&y), 4);
        (void) memcpy((void *) (gc->pc + 20), (void *) (&z), 4);
        (void) memcpy((void *) (gc->pc + 24), (void *) (&w), 4);
        (void) memcpy((void *) (gc->pc + 28), (void *) (name), len);
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_ProgramNamedParameter4fvNV 4218
void
__indirect_glProgramNamedParameter4fvNV(GLuint id, GLsizei len,
                                        const GLubyte *name,
                                        const GLfloat * v)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 28 + __GLX_PAD(len);
    if (len < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(len >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_ProgramNamedParameter4fvNV, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&id), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (&len), 4);
        (void) memcpy((void *) (gc->pc + 12), (void *) (v), 16);
        (void) memcpy((void *) (gc->pc + 28), (void *) (name), len);
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_BlendEquationSeparateEXT 4228
void
__indirect_glBlendEquationSeparateEXT(GLenum modeRGB, GLenum modeA)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_BlendEquationSeparateEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&modeRGB), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&modeA), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_BindFramebufferEXT 4319
void
__indirect_glBindFramebufferEXT(GLenum target, GLuint framebuffer)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_BindFramebufferEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&framebuffer), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_BindRenderbufferEXT 4316
void
__indirect_glBindRenderbufferEXT(GLenum target, GLuint renderbuffer)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 12;
    emit_header(gc->pc, X_GLrop_BindRenderbufferEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&renderbuffer), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLvop_CheckFramebufferStatusEXT 1427
GLenum
__indirect_glCheckFramebufferStatusEXT(GLenum target)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    GLenum retval = (GLenum) 0;
    const GLuint cmdlen = 4;
    if (__builtin_expect(dpy != NULL, 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_CheckFramebufferStatusEXT,
                                    cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        retval = (GLenum) __glXReadReply(dpy, 0, NULL, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return retval;
}

#define X_GLrop_DeleteFramebuffersEXT 4320
void
__indirect_glDeleteFramebuffersEXT(GLsizei n, const GLuint * framebuffers)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8 + __GLX_PAD((n * 4));
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(n >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_DeleteFramebuffersEXT, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&n), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (framebuffers),
                      (n * 4));
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_DeleteRenderbuffersEXT 4317
void
__indirect_glDeleteRenderbuffersEXT(GLsizei n, const GLuint * renderbuffers)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8 + __GLX_PAD((n * 4));
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect(n >= 0, 1)) {
        emit_header(gc->pc, X_GLrop_DeleteRenderbuffersEXT, cmdlen);
        (void) memcpy((void *) (gc->pc + 4), (void *) (&n), 4);
        (void) memcpy((void *) (gc->pc + 8), (void *) (renderbuffers),
                      (n * 4));
        gc->pc += cmdlen;
        if (__builtin_expect(gc->pc > gc->limit, 0)) {
            (void) __glXFlushRenderBuffer(gc, gc->pc);
        }
    }
}

#define X_GLrop_FramebufferRenderbufferEXT 4324
void
__indirect_glFramebufferRenderbufferEXT(GLenum target, GLenum attachment,
                                        GLenum renderbuffertarget,
                                        GLuint renderbuffer)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_FramebufferRenderbufferEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&attachment), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&renderbuffertarget), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&renderbuffer), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_FramebufferTexture1DEXT 4321
void
__indirect_glFramebufferTexture1DEXT(GLenum target, GLenum attachment,
                                     GLenum textarget, GLuint texture,
                                     GLint level)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_FramebufferTexture1DEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&attachment), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&textarget), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&texture), 4);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&level), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_FramebufferTexture2DEXT 4322
void
__indirect_glFramebufferTexture2DEXT(GLenum target, GLenum attachment,
                                     GLenum textarget, GLuint texture,
                                     GLint level)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 24;
    emit_header(gc->pc, X_GLrop_FramebufferTexture2DEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&attachment), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&textarget), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&texture), 4);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&level), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLrop_FramebufferTexture3DEXT 4323
void
__indirect_glFramebufferTexture3DEXT(GLenum target, GLenum attachment,
                                     GLenum textarget, GLuint texture,
                                     GLint level, GLint zoffset)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 28;
    emit_header(gc->pc, X_GLrop_FramebufferTexture3DEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&attachment), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&textarget), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&texture), 4);
    (void) memcpy((void *) (gc->pc + 20), (void *) (&level), 4);
    (void) memcpy((void *) (gc->pc + 24), (void *) (&zoffset), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLvop_GenFramebuffersEXT 1426
void
__indirect_glGenFramebuffersEXT(GLsizei n, GLuint * framebuffers)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    const GLuint cmdlen = 4;
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect((n >= 0) && (dpy != NULL), 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_GenFramebuffersEXT, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&n), 4);
        (void) __glXReadReply(dpy, 4, framebuffers, GL_TRUE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return;
}

#define X_GLvop_GenRenderbuffersEXT 1423
void
__indirect_glGenRenderbuffersEXT(GLsizei n, GLuint * renderbuffers)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    const GLuint cmdlen = 4;
    if (n < 0) {
        __glXSetError(gc, GL_INVALID_VALUE);
        return;
    }
    if (__builtin_expect((n >= 0) && (dpy != NULL), 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_GenRenderbuffersEXT, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&n), 4);
        (void) __glXReadReply(dpy, 4, renderbuffers, GL_TRUE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return;
}

#define X_GLrop_GenerateMipmapEXT 4325
void
__indirect_glGenerateMipmapEXT(GLenum target)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 8;
    emit_header(gc->pc, X_GLrop_GenerateMipmapEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}

#define X_GLvop_GetFramebufferAttachmentParameterivEXT 1428
void
__indirect_glGetFramebufferAttachmentParameterivEXT(GLenum target,
                                                    GLenum attachment,
                                                    GLenum pname,
                                                    GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    const GLuint cmdlen = 12;
    if (__builtin_expect(dpy != NULL, 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_GetFramebufferAttachmentParameterivEXT,
                                    cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&attachment), 4);
        (void) memcpy((void *) (pc + 8), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return;
}

#define X_GLvop_GetRenderbufferParameterivEXT 1424
void
__indirect_glGetRenderbufferParameterivEXT(GLenum target, GLenum pname,
                                           GLint * params)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    const GLuint cmdlen = 8;
    if (__builtin_expect(dpy != NULL, 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_GetRenderbufferParameterivEXT,
                                    cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&target), 4);
        (void) memcpy((void *) (pc + 4), (void *) (&pname), 4);
        (void) __glXReadReply(dpy, 4, params, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return;
}

#define X_GLvop_IsFramebufferEXT 1425
GLboolean
__indirect_glIsFramebufferEXT(GLuint framebuffer)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    GLboolean retval = (GLboolean) 0;
    const GLuint cmdlen = 4;
    if (__builtin_expect(dpy != NULL, 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_IsFramebufferEXT, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&framebuffer), 4);
        retval = (GLboolean) __glXReadReply(dpy, 0, NULL, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return retval;
}

#define X_GLvop_IsRenderbufferEXT 1422
GLboolean
__indirect_glIsRenderbufferEXT(GLuint renderbuffer)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    Display *const dpy = gc->currentDpy;
    GLboolean retval = (GLboolean) 0;
    const GLuint cmdlen = 4;
    if (__builtin_expect(dpy != NULL, 1)) {
        GLubyte const *pc =
            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
                                    X_GLvop_IsRenderbufferEXT, cmdlen);
        (void) memcpy((void *) (pc + 0), (void *) (&renderbuffer), 4);
        retval = (GLboolean) __glXReadReply(dpy, 0, NULL, GL_FALSE);
        UnlockDisplay(dpy);
        SyncHandle();
    }
    return retval;
}

#define X_GLrop_RenderbufferStorageEXT 4318
void
__indirect_glRenderbufferStorageEXT(GLenum target, GLenum internalformat,
                                    GLsizei width, GLsizei height)
{
    __GLXcontext *const gc = __glXGetCurrentContext();
    const GLuint cmdlen = 20;
    emit_header(gc->pc, X_GLrop_RenderbufferStorageEXT, cmdlen);
    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4);
    (void) memcpy((void *) (gc->pc + 8), (void *) (&internalformat), 4);
    (void) memcpy((void *) (gc->pc + 12), (void *) (&width), 4);
    (void) memcpy((void *) (gc->pc + 16), (void *) (&height), 4);
    gc->pc += cmdlen;
    if (__builtin_expect(gc->pc > gc->limit, 0)) {
        (void) __glXFlushRenderBuffer(gc, gc->pc);
    }
}


#  undef FASTCALL
#  undef NOINLINE
