/* NOTE: Do not edit this file, it is generated by a script:
   Export.py --api gl 4.4 --api wgl 4.4 --api glx 4.4 --api cgl 1.4 --api egl 1.0 --outdir .
*/

/*
  Copyright (c) 2011-2013 NVIDIA Corporation
  Copyright (c) 2011-2013 Cass Everitt
  Copyright (c) 2012-2013 Scott Nations
  Copyright (c) 2012 Mathias Schott
  Copyright (c) 2012-2013 Nigel Stewart
  Copyright (c) 2012-2013 Google Inc.
  All rights reserved.

  Redistribution and use in source and binary forms, with or without modification,
  are permitted provided that the following conditions are met:

    Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

    Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/*
  Intended formatting conventions:
  $ astyle --style=allman --indent=spaces=2 --indent-switches
*/

#include "RegalUtil.h"

#if REGAL_EMULATION

REGAL_GLOBAL_BEGIN

#include "RegalPrivate.h"
#include "RegalContext.h"
#include "RegalDispatch.h"
#include "RegalDsa.h"
#include "RegalEmuProcsDsa.h"

REGAL_GLOBAL_END

REGAL_NAMESPACE_BEGIN

static void REGAL_CALL emuProcInterceptDsa_glActiveTexture(RegalContext *_context, GLenum texture)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if( _context->dsa->ShadowActiveTexture( texture ) ) {
      return;
  }

  orig.glActiveTexture( _context, texture );

}

static void REGAL_CALL emuProcInterceptDsa_glActiveTextureARB(RegalContext *_context, GLenum texture)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if( _context->dsa->ShadowActiveTexture( texture ) ) {
      return;
  }

  orig.glActiveTextureARB( _context, texture );

}

static void REGAL_CALL emuProcInterceptDsa_glBegin(RegalContext *_context, GLenum mode)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glBegin( _context, mode );

}

static void REGAL_CALL emuProcInterceptDsa_glBindBuffer(RegalContext *_context, GLenum target, GLuint buffer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if (_context->dsa->ShadowBuffer( target, buffer ) ) {
    return;
  }

  orig.glBindBuffer( _context, target, buffer );

}

static void REGAL_CALL emuProcInterceptDsa_glBindBufferARB(RegalContext *_context, GLenum target, GLuint buffer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if (_context->dsa->ShadowBuffer( target, buffer ) ) {
    return;
  }

  orig.glBindBufferARB( _context, target, buffer );

}

static void REGAL_CALL emuProcInterceptDsa_glBindFramebuffer(RegalContext *_context, GLenum target, GLuint framebuffer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if (_context->dsa->ShadowFramebuffer( target, framebuffer ) ) {
    return;
  }

  orig.glBindFramebuffer( _context, target, framebuffer );

}

static void REGAL_CALL emuProcInterceptDsa_glBindFramebufferEXT(RegalContext *_context, GLenum target, GLuint framebuffer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if (_context->dsa->ShadowFramebuffer( target, framebuffer ) ) {
    return;
  }

  orig.glBindFramebufferEXT( _context, target, framebuffer );

}

static void REGAL_CALL emuProcInterceptDsa_glBindMultiTextureEXT(RegalContext *_context, GLenum texunit, GLenum target, GLuint texture)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  _context->dsa->ShadowDsaTexture( target, texture );
  orig.glBindTexture( _context, target, texture );
  return;

  orig.glBindMultiTextureEXT( _context, texunit, target, texture );

}

static void REGAL_CALL emuProcInterceptDsa_glBindProgramARB(RegalContext *_context, GLenum target, GLuint program)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if (_context->dsa->ShadowAsmProgram( target, program ) ) {
    return;
  }

  orig.glBindProgramARB( _context, target, program );

}

static void REGAL_CALL emuProcInterceptDsa_glBindRenderbuffer(RegalContext *_context, GLenum target, GLuint renderbuffer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if (_context->dsa->ShadowRenderbuffer( target, renderbuffer ) ) {
    return;
  }

  orig.glBindRenderbuffer( _context, target, renderbuffer );

}

static void REGAL_CALL emuProcInterceptDsa_glBindRenderbufferEXT(RegalContext *_context, GLenum target, GLuint renderbuffer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if (_context->dsa->ShadowRenderbuffer( target, renderbuffer ) ) {
    return;
  }

  orig.glBindRenderbufferEXT( _context, target, renderbuffer );

}

static void REGAL_CALL emuProcInterceptDsa_glBindTexture(RegalContext *_context, GLenum target, GLuint texture)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if (_context->dsa->ShadowTexture( target, texture )) {
    return;
  }

  orig.glBindTexture( _context, target, texture );

}

static void REGAL_CALL emuProcInterceptDsa_glBindTextureEXT(RegalContext *_context, GLenum target, GLuint texture)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if (_context->dsa->ShadowTexture( target, texture )) {
    return;
  }

  orig.glBindTextureEXT( _context, target, texture );

}

static void REGAL_CALL emuProcInterceptDsa_glBindVertexArray(RegalContext *_context, GLuint array)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if (_context->dsa->ShadowVao( array )) {
    return;
  }

  orig.glBindVertexArray( _context, array );

}

static void REGAL_CALL emuProcInterceptDsa_glBufferData(RegalContext *_context, GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreBuffer( _context );

  orig.glBufferData( _context, target, size, data, usage );

}

static void REGAL_CALL emuProcInterceptDsa_glBufferSubData(RegalContext *_context, GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreBuffer( _context );

  orig.glBufferSubData( _context, target, offset, size, data );

}

static GLenum REGAL_CALL emuProcInterceptDsa_glCheckNamedFramebufferStatusEXT(RegalContext *_context, GLuint framebuffer, GLenum target)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaFramebuffer( _context, GL_FRAMEBUFFER, framebuffer);
  return orig.glCheckFramebufferStatus( _context, target );

  return orig.glCheckNamedFramebufferStatusEXT( _context, framebuffer, target );

}

static void REGAL_CALL emuProcInterceptDsa_glClientActiveTexture(RegalContext *_context, GLenum texture)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if (_context->dsa->ShadowClientActiveTexture( texture )) {
    return;
  }

  orig.glClientActiveTexture( _context, texture );

}

static void REGAL_CALL emuProcInterceptDsa_glClientActiveTextureARB(RegalContext *_context, GLenum texture)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if (_context->dsa->ShadowClientActiveTexture( texture )) {
    return;
  }

  orig.glClientActiveTextureARB( _context, texture );

}

static void REGAL_CALL emuProcInterceptDsa_glClientAttribDefaultEXT(RegalContext *_context, GLbitfield mask)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->ClientAttribDefault( _context, mask ); return;

  orig.glClientAttribDefaultEXT( _context, mask );

}

static void REGAL_CALL emuProcInterceptDsa_glColorPointer(RegalContext *_context, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreBuffer( _context );

  orig.glColorPointer( _context, size, type, stride, pointer );

}

static void REGAL_CALL emuProcInterceptDsa_glCompressedMultiTexImage1DEXT(RegalContext *_context, GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glCompressedTexImage1D( _context, target, level, internalformat, width, border, imageSize, data );
  return;

  orig.glCompressedMultiTexImage1DEXT( _context, texunit, target, level, internalformat, width, border, imageSize, data );

}

static void REGAL_CALL emuProcInterceptDsa_glCompressedMultiTexImage2DEXT(RegalContext *_context, GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glCompressedTexImage2D( _context, target, level, internalformat, width, height, border, imageSize, bits );
  return;

  orig.glCompressedMultiTexImage2DEXT( _context, texunit, target, level, internalformat, width, height, border, imageSize, bits );

}

static void REGAL_CALL emuProcInterceptDsa_glCompressedMultiTexImage3DEXT(RegalContext *_context, GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glCompressedTexImage3D( _context, target, level, internalformat, width, height, depth, border, imageSize, bits );
  return;

  orig.glCompressedMultiTexImage3DEXT( _context, texunit, target, level, internalformat, width, height, depth, border, imageSize, bits );

}

static void REGAL_CALL emuProcInterceptDsa_glCompressedMultiTexSubImage1DEXT(RegalContext *_context, GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glCompressedTexSubImage1D( _context, target, level, xoffset, width, format, imageSize, data );
  return;

  orig.glCompressedMultiTexSubImage1DEXT( _context, texunit, target, level, xoffset, width, format, imageSize, data );

}

static void REGAL_CALL emuProcInterceptDsa_glCompressedMultiTexSubImage2DEXT(RegalContext *_context, GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glCompressedTexSubImage2D( _context, target, level, xoffset, yoffset, width, height, format, imageSize, data );
  return;

  orig.glCompressedMultiTexSubImage2DEXT( _context, texunit, target, level, xoffset, yoffset, width, height, format, imageSize, data );

}

static void REGAL_CALL emuProcInterceptDsa_glCompressedMultiTexSubImage3DEXT(RegalContext *_context, GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glCompressedTexSubImage3D( _context, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data );
  return;

  orig.glCompressedMultiTexSubImage3DEXT( _context, texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data );

}

static void REGAL_CALL emuProcInterceptDsa_glCompressedTextureImage1DEXT(RegalContext *_context, GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glCompressedTexImage1D( _context, target, level, internalformat, width, border, imageSize, bits );
  return;

  orig.glCompressedTextureImage1DEXT( _context, texture, target, level, internalformat, width, border, imageSize, bits );

}

static void REGAL_CALL emuProcInterceptDsa_glCompressedTextureImage2DEXT(RegalContext *_context, GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glCompressedTexImage2D( _context, target, level, internalformat, width, height, border, imageSize, bits );
  return;

  orig.glCompressedTextureImage2DEXT( _context, texture, target, level, internalformat, width, height, border, imageSize, bits );

}

static void REGAL_CALL emuProcInterceptDsa_glCompressedTextureImage3DEXT(RegalContext *_context, GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glCompressedTexImage3D( _context, target, level, internalformat, width, height, depth, border, imageSize, bits );
  return;

  orig.glCompressedTextureImage3DEXT( _context, texture, target, level, internalformat, width, height, depth, border, imageSize, bits );

}

static void REGAL_CALL emuProcInterceptDsa_glCompressedTextureSubImage1DEXT(RegalContext *_context, GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glCompressedTexSubImage1D( _context, target, level, xoffset, width, format, imageSize, bits );
  return;

  orig.glCompressedTextureSubImage1DEXT( _context, texture, target, level, xoffset, width, format, imageSize, bits );

}

static void REGAL_CALL emuProcInterceptDsa_glCompressedTextureSubImage2DEXT(RegalContext *_context, GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glCompressedTexSubImage2D( _context, target, level, xoffset, yoffset, width, height, format, imageSize, bits );
  return;

  orig.glCompressedTextureSubImage2DEXT( _context, texture, target, level, xoffset, yoffset, width, height, format, imageSize, bits );

}

static void REGAL_CALL emuProcInterceptDsa_glCompressedTextureSubImage3DEXT(RegalContext *_context, GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glCompressedTexSubImage3D( _context, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits );
  return;

  orig.glCompressedTextureSubImage3DEXT( _context, texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits );

}

static void REGAL_CALL emuProcInterceptDsa_glCopyBufferSubData(RegalContext *_context, GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreBuffer( _context );

  orig.glCopyBufferSubData( _context, readtarget, writetarget, readoffset, writeoffset, size );

}

static void REGAL_CALL emuProcInterceptDsa_glCopyMultiTexImage1DEXT(RegalContext *_context, GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glCopyTexImage1D( _context, target, level, internalformat, x, y, width, border );
  return;

  orig.glCopyMultiTexImage1DEXT( _context, texunit, target, level, internalformat, x, y, width, border );

}

static void REGAL_CALL emuProcInterceptDsa_glCopyMultiTexImage2DEXT(RegalContext *_context, GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glCopyTexImage2D( _context, target, level, internalformat, x, y, width, height, border );
  return;

  orig.glCopyMultiTexImage2DEXT( _context, texunit, target, level, internalformat, x, y, width, height, border );

}

static void REGAL_CALL emuProcInterceptDsa_glCopyMultiTexSubImage1DEXT(RegalContext *_context, GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glCopyTexSubImage1D( _context, target, level, xoffset, x, y, width );
  return;

  orig.glCopyMultiTexSubImage1DEXT( _context, texunit, target, level, xoffset, x, y, width );

}

static void REGAL_CALL emuProcInterceptDsa_glCopyMultiTexSubImage2DEXT(RegalContext *_context, GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glCopyTexSubImage2D( _context, target, level, xoffset, yoffset, x, y, width, height );
  return;

  orig.glCopyMultiTexSubImage2DEXT( _context, texunit, target, level, xoffset, yoffset, x, y, width, height );

}

static void REGAL_CALL emuProcInterceptDsa_glCopyMultiTexSubImage3DEXT(RegalContext *_context, GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glCopyTexSubImage3D( _context, target, level, xoffset, yoffset, zoffset, x, y, width, height );
  return;

  orig.glCopyMultiTexSubImage3DEXT( _context, texunit, target, level, xoffset, yoffset, zoffset, x, y, width, height );

}

static void REGAL_CALL emuProcInterceptDsa_glCopyTextureImage1DEXT(RegalContext *_context, GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glCopyTexImage1D( _context, target, level, internalformat, x, y, width, border );
  return;

  orig.glCopyTextureImage1DEXT( _context, texture, target, level, internalformat, x, y, width, border );

}

static void REGAL_CALL emuProcInterceptDsa_glCopyTextureImage2DEXT(RegalContext *_context, GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glCopyTexImage2D( _context, target, level, internalformat, x, y, width, height, border );
  return;

  orig.glCopyTextureImage2DEXT( _context, texture, target, level, internalformat, x, y, width, height, border );

}

static void REGAL_CALL emuProcInterceptDsa_glCopyTextureSubImage1DEXT(RegalContext *_context, GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glCopyTexSubImage1D( _context, target, level, xoffset, x, y, width );
  return;

  orig.glCopyTextureSubImage1DEXT( _context, texture, target, level, xoffset, x, y, width );

}

static void REGAL_CALL emuProcInterceptDsa_glCopyTextureSubImage2DEXT(RegalContext *_context, GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glCopyTexSubImage2D( _context, target, level, xoffset, yoffset, x, y, width, height );
  return;

  orig.glCopyTextureSubImage2DEXT( _context, texture, target, level, xoffset, yoffset, x, y, width, height );

}

static void REGAL_CALL emuProcInterceptDsa_glCopyTextureSubImage3DEXT(RegalContext *_context, GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glCopyTexSubImage3D( _context, target, level, xoffset, yoffset, zoffset, x, y, width, height );
  return;

  orig.glCopyTextureSubImage3DEXT( _context, texture, target, level, xoffset, yoffset, zoffset, x, y, width, height );

}

static void REGAL_CALL emuProcInterceptDsa_glDeleteBuffers(RegalContext *_context, GLsizei n, const GLuint *buffers)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->DeleteBuffers( _context, n, buffers );

  orig.glDeleteBuffers( _context, n, buffers );

}

static void REGAL_CALL emuProcInterceptDsa_glDeleteBuffersARB(RegalContext *_context, GLsizei n, const GLuint *buffers)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->DeleteBuffers( _context, n, buffers );

  orig.glDeleteBuffersARB( _context, n, buffers );

}

static void REGAL_CALL emuProcInterceptDsa_glDeleteFramebuffers(RegalContext *_context, GLsizei n, const GLuint *framebuffers)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->DeleteFramebuffers( _context, n, framebuffers );

  orig.glDeleteFramebuffers( _context, n, framebuffers );

}

static void REGAL_CALL emuProcInterceptDsa_glDeleteFramebuffersEXT(RegalContext *_context, GLsizei n, const GLuint *framebuffers)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->DeleteFramebuffers( _context, n, framebuffers );

  orig.glDeleteFramebuffersEXT( _context, n, framebuffers );

}

static void REGAL_CALL emuProcInterceptDsa_glDeleteFramebuffersOES(RegalContext *_context, GLsizei n, const GLuint *framebuffers)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->DeleteFramebuffers( _context, n, framebuffers );

  orig.glDeleteFramebuffersOES( _context, n, framebuffers );

}

static void REGAL_CALL emuProcInterceptDsa_glDeleteProgram(RegalContext *_context, GLuint program)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->DeleteGlslProgram( _context, program );

  orig.glDeleteProgram( _context, program );

}

static void REGAL_CALL emuProcInterceptDsa_glDeleteProgramsARB(RegalContext *_context, GLsizei n, const GLuint *programs)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->DeleteAsmPrograms( _context, n, programs );

  orig.glDeleteProgramsARB( _context, n, programs );

}

static void REGAL_CALL emuProcInterceptDsa_glDeleteProgramsNV(RegalContext *_context, GLsizei n, const GLuint *programs)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->DeleteAsmPrograms( _context, n, programs );

  orig.glDeleteProgramsNV( _context, n, programs );

}

static void REGAL_CALL emuProcInterceptDsa_glDeleteRenderbuffers(RegalContext *_context, GLsizei n, const GLuint *renderbuffers)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->DeleteRenderbuffers( _context, n, renderbuffers );

  orig.glDeleteRenderbuffers( _context, n, renderbuffers );

}

static void REGAL_CALL emuProcInterceptDsa_glDeleteRenderbuffersEXT(RegalContext *_context, GLsizei n, const GLuint *renderbuffers)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->DeleteRenderbuffers( _context, n, renderbuffers );

  orig.glDeleteRenderbuffersEXT( _context, n, renderbuffers );

}

static void REGAL_CALL emuProcInterceptDsa_glDeleteRenderbuffersOES(RegalContext *_context, GLsizei n, const GLuint *renderbuffers)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->DeleteRenderbuffers( _context, n, renderbuffers );

  orig.glDeleteRenderbuffersOES( _context, n, renderbuffers );

}

static void REGAL_CALL emuProcInterceptDsa_glDeleteTextures(RegalContext *_context, GLsizei n, const GLuint *textures)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->DeleteTextures( _context, n, textures );

  orig.glDeleteTextures( _context, n, textures );

}

static void REGAL_CALL emuProcInterceptDsa_glDeleteTexturesEXT(RegalContext *_context, GLsizei n, const GLuint *textures)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->DeleteTextures( _context, n, textures );

  orig.glDeleteTexturesEXT( _context, n, textures );

}

static void REGAL_CALL emuProcInterceptDsa_glDeleteVertexArrays(RegalContext *_context, GLsizei n, const GLuint *arrays)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->DeleteVaos( _context, n, arrays );

  orig.glDeleteVertexArrays( _context, n, arrays );

}

static void REGAL_CALL emuProcInterceptDsa_glDeleteVertexArraysAPPLE(RegalContext *_context, GLsizei n, const GLuint *arrays)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->DeleteVaos( _context, n, arrays );

  orig.glDeleteVertexArraysAPPLE( _context, n, arrays );

}

static void REGAL_CALL emuProcInterceptDsa_glDeleteVertexArraysOES(RegalContext *_context, GLsizei n, const GLuint *arrays)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->DeleteVaos( _context, n, arrays );

  orig.glDeleteVertexArraysOES( _context, n, arrays );

}

static void REGAL_CALL emuProcInterceptDsa_glDisable(RegalContext *_context, GLenum cap)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreActiveTexture( _context );

  orig.glDisable( _context, cap );

}

static void REGAL_CALL emuProcInterceptDsa_glDisableClientState(RegalContext *_context, GLenum cap)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreClientActiveTexture( _context );
  _context->dsa->RestoreBuffer( _context );

  orig.glDisableClientState( _context, cap );

}

static void REGAL_CALL emuProcInterceptDsa_glDisableClientStateIndexedEXT(RegalContext *_context, GLenum array, GLuint index)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaClientActiveTexture( _context, index + GL_TEXTURE0 );
  orig.glDisableClientState( _context, array );
  return;

  orig.glDisableClientStateIndexedEXT( _context, array, index );

}

static void REGAL_CALL emuProcInterceptDsa_glDisableClientStateiEXT(RegalContext *_context, GLenum array, GLuint index)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaClientActiveTexture( _context, index + GL_TEXTURE0 );
  orig.glDisableClientState( _context, array );
  return;

  orig.glDisableClientStateiEXT( _context, array, index );

}

static void REGAL_CALL emuProcInterceptDsa_glDisableIndexedEXT(RegalContext *_context, GLenum target, GLuint index)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, index + GL_TEXTURE0 );
  orig.glDisable( _context, target );
  return;

  orig.glDisableIndexedEXT( _context, target, index );

}

static void REGAL_CALL emuProcInterceptDsa_glDisableVertexArrayAttribEXT(RegalContext *_context, GLuint vaobj, GLenum array)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaVao( _context, vaobj );
  orig.glDisableVertexAttribArray( _context, array );return;

  orig.glDisableVertexArrayAttribEXT( _context, vaobj, array );

}

static void REGAL_CALL emuProcInterceptDsa_glDisableVertexArrayEXT(RegalContext *_context, GLuint vaobj, GLenum array)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaVao( _context, vaobj );
  if ( array >= GL_TEXTURE0 && array <= GL_TEXTURE31) {
    _context->dsa->DsaClientActiveTexture( _context, array );
    orig.glDisableClientState( _context, GL_TEXTURE_COORD_ARRAY );
  } else {
    orig.glDisableClientState( _context, array );
  }return;

  orig.glDisableVertexArrayEXT( _context, vaobj, array );

}

static void REGAL_CALL emuProcInterceptDsa_glDrawArrays(RegalContext *_context, GLenum mode, GLint first, GLsizei count)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glDrawArrays( _context, mode, first, count );

}

static void REGAL_CALL emuProcInterceptDsa_glDrawArraysEXT(RegalContext *_context, GLenum mode, GLint first, GLsizei count)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glDrawArraysEXT( _context, mode, first, count );

}

static void REGAL_CALL emuProcInterceptDsa_glDrawArraysIndirect(RegalContext *_context, GLenum mode, const GLvoid *indirect)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glDrawArraysIndirect( _context, mode, indirect );

}

static void REGAL_CALL emuProcInterceptDsa_glDrawArraysInstanced(RegalContext *_context, GLenum mode, GLint start, GLsizei count, GLsizei primcount)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glDrawArraysInstanced( _context, mode, start, count, primcount );

}

static void REGAL_CALL emuProcInterceptDsa_glDrawArraysInstancedARB(RegalContext *_context, GLenum mode, GLint start, GLsizei count, GLsizei primcount)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glDrawArraysInstancedARB( _context, mode, start, count, primcount );

}

static void REGAL_CALL emuProcInterceptDsa_glDrawArraysInstancedEXT(RegalContext *_context, GLenum mode, GLint start, GLsizei count, GLsizei primcount)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glDrawArraysInstancedEXT( _context, mode, start, count, primcount );

}

static void REGAL_CALL emuProcInterceptDsa_glDrawElementArrayAPPLE(RegalContext *_context, GLenum mode, GLint first, GLsizei count)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glDrawElementArrayAPPLE( _context, mode, first, count );

}

static void REGAL_CALL emuProcInterceptDsa_glDrawElementArrayATI(RegalContext *_context, GLenum mode, GLsizei count)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glDrawElementArrayATI( _context, mode, count );

}

static void REGAL_CALL emuProcInterceptDsa_glDrawElements(RegalContext *_context, GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glDrawElements( _context, mode, count, type, indices );

}

static void REGAL_CALL emuProcInterceptDsa_glDrawElementsBaseVertex(RegalContext *_context, GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glDrawElementsBaseVertex( _context, mode, count, type, indices, basevertex );

}

static void REGAL_CALL emuProcInterceptDsa_glDrawElementsIndirect(RegalContext *_context, GLenum mode, GLenum type, const GLvoid *indirect)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glDrawElementsIndirect( _context, mode, type, indirect );

}

static void REGAL_CALL emuProcInterceptDsa_glDrawElementsInstanced(RegalContext *_context, GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glDrawElementsInstanced( _context, mode, count, type, indices, primcount );

}

static void REGAL_CALL emuProcInterceptDsa_glDrawElementsInstancedARB(RegalContext *_context, GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glDrawElementsInstancedARB( _context, mode, count, type, indices, primcount );

}

static void REGAL_CALL emuProcInterceptDsa_glDrawElementsInstancedBaseVertex(RegalContext *_context, GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount, GLint basevertex)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glDrawElementsInstancedBaseVertex( _context, mode, count, type, indices, primcount, basevertex );

}

static void REGAL_CALL emuProcInterceptDsa_glDrawElementsInstancedEXT(RegalContext *_context, GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glDrawElementsInstancedEXT( _context, mode, count, type, indices, primcount );

}

static void REGAL_CALL emuProcInterceptDsa_glEnable(RegalContext *_context, GLenum cap)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreActiveTexture( _context );

  orig.glEnable( _context, cap );

}

static void REGAL_CALL emuProcInterceptDsa_glEnableClientState(RegalContext *_context, GLenum cap)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreClientActiveTexture( _context );
  _context->dsa->RestoreBuffer( _context );

  orig.glEnableClientState( _context, cap );

}

static void REGAL_CALL emuProcInterceptDsa_glEnableClientStateIndexedEXT(RegalContext *_context, GLenum array, GLuint index)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaClientActiveTexture( _context, index + GL_TEXTURE0 );
  orig.glEnableClientState( _context, array );
  return;

  orig.glEnableClientStateIndexedEXT( _context, array, index );

}

static void REGAL_CALL emuProcInterceptDsa_glEnableClientStateiEXT(RegalContext *_context, GLenum array, GLuint index)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaClientActiveTexture( _context, index + GL_TEXTURE0 );
  orig.glEnableClientState( _context, array );
  return;

  orig.glEnableClientStateiEXT( _context, array, index );

}

static void REGAL_CALL emuProcInterceptDsa_glEnableIndexedEXT(RegalContext *_context, GLenum target, GLuint index)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, index + GL_TEXTURE0 );
  orig.glEnable( _context, target );
  return;

  orig.glEnableIndexedEXT( _context, target, index );

}

static void REGAL_CALL emuProcInterceptDsa_glEnableVertexArrayAttribEXT(RegalContext *_context, GLuint vaobj, GLenum array)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaVao( _context, vaobj );
  orig.glEnableVertexAttribArray( _context, array );return;

  orig.glEnableVertexArrayAttribEXT( _context, vaobj, array );

}

static void REGAL_CALL emuProcInterceptDsa_glEnableVertexArrayEXT(RegalContext *_context, GLuint vaobj, GLenum array)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaVao( _context, vaobj );
  if ( array >= GL_TEXTURE0 && array <= GL_TEXTURE31) {
    _context->dsa->DsaClientActiveTexture( _context, array );
    orig.glEnableClientState( _context, GL_TEXTURE_COORD_ARRAY );
  } else {
    orig.glEnableClientState( _context, array );
  }return;

  orig.glEnableVertexArrayEXT( _context, vaobj, array );

}

static void REGAL_CALL emuProcInterceptDsa_glFlushMappedBufferRange(RegalContext *_context, GLenum target, GLintptr offset, GLsizeiptr length)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreBuffer( _context );

  orig.glFlushMappedBufferRange( _context, target, offset, length );

}

static void REGAL_CALL emuProcInterceptDsa_glFlushMappedBufferRangeEXT(RegalContext *_context, GLenum target, GLintptr offset, GLsizeiptr length)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreBuffer( _context );

  orig.glFlushMappedBufferRangeEXT( _context, target, offset, length );

}

static void REGAL_CALL emuProcInterceptDsa_glFlushMappedNamedBufferRangeEXT(RegalContext *_context, GLuint buffer, GLintptr offset, GLsizeiptr length)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaBuffer( _context, buffer);
  orig.glFlushMappedBufferRange( _context, GL_ARRAY_BUFFER, offset, length );
  return;

  orig.glFlushMappedNamedBufferRangeEXT( _context, buffer, offset, length );

}

static void REGAL_CALL emuProcInterceptDsa_glFramebufferDrawBufferEXT(RegalContext *_context, GLuint framebuffer, GLenum mode)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaFramebuffer( _context, GL_FRAMEBUFFER, framebuffer);
  orig.glDrawBuffer( _context, mode );
  return;

  orig.glFramebufferDrawBufferEXT( _context, framebuffer, mode );

}

static void REGAL_CALL emuProcInterceptDsa_glFramebufferDrawBuffersEXT(RegalContext *_context, GLuint framebuffer, GLsizei n, const GLenum *bufs)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaFramebuffer( _context, GL_FRAMEBUFFER, framebuffer);
  orig.glDrawBuffers( _context, n, bufs );
  return;

  orig.glFramebufferDrawBuffersEXT( _context, framebuffer, n, bufs );

}

static void REGAL_CALL emuProcInterceptDsa_glFramebufferReadBufferEXT(RegalContext *_context, GLuint framebuffer, GLenum mode)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaFramebuffer( _context, GL_FRAMEBUFFER, framebuffer);
  orig.glReadBuffer( _context, mode );
  return;

  orig.glFramebufferReadBufferEXT( _context, framebuffer, mode );

}

static void REGAL_CALL emuProcInterceptDsa_glFramebufferRenderbuffer(RegalContext *_context, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreFramebuffer( _context );

  orig.glFramebufferRenderbuffer( _context, target, attachment, renderbuffertarget, renderbuffer );

}

static void REGAL_CALL emuProcInterceptDsa_glFramebufferRenderbufferEXT(RegalContext *_context, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreFramebuffer( _context );

  orig.glFramebufferRenderbufferEXT( _context, target, attachment, renderbuffertarget, renderbuffer );

}

static void REGAL_CALL emuProcInterceptDsa_glFramebufferTexture(RegalContext *_context, GLenum target, GLenum attachment, GLuint texture, GLint level)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreFramebuffer( _context );

  orig.glFramebufferTexture( _context, target, attachment, texture, level );

}

static void REGAL_CALL emuProcInterceptDsa_glFramebufferTexture1D(RegalContext *_context, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreFramebuffer( _context );

  orig.glFramebufferTexture1D( _context, target, attachment, textarget, texture, level );

}

static void REGAL_CALL emuProcInterceptDsa_glFramebufferTexture1DEXT(RegalContext *_context, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreFramebuffer( _context );

  orig.glFramebufferTexture1DEXT( _context, target, attachment, textarget, texture, level );

}

static void REGAL_CALL emuProcInterceptDsa_glFramebufferTexture2D(RegalContext *_context, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreFramebuffer( _context );

  orig.glFramebufferTexture2D( _context, target, attachment, textarget, texture, level );

}

static void REGAL_CALL emuProcInterceptDsa_glFramebufferTexture2DEXT(RegalContext *_context, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreFramebuffer( _context );

  orig.glFramebufferTexture2DEXT( _context, target, attachment, textarget, texture, level );

}

static void REGAL_CALL emuProcInterceptDsa_glFramebufferTexture3D(RegalContext *_context, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint layer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreFramebuffer( _context );

  orig.glFramebufferTexture3D( _context, target, attachment, textarget, texture, level, layer );

}

static void REGAL_CALL emuProcInterceptDsa_glFramebufferTexture3DEXT(RegalContext *_context, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreFramebuffer( _context );

  orig.glFramebufferTexture3DEXT( _context, target, attachment, textarget, texture, level, zoffset );

}

static void REGAL_CALL emuProcInterceptDsa_glFramebufferTextureARB(RegalContext *_context, GLenum target, GLenum attachment, GLuint texture, GLint level)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreFramebuffer( _context );

  orig.glFramebufferTextureARB( _context, target, attachment, texture, level );

}

static void REGAL_CALL emuProcInterceptDsa_glFramebufferTextureEXT(RegalContext *_context, GLenum target, GLenum attachment, GLuint texture, GLint level)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreFramebuffer( _context );

  orig.glFramebufferTextureEXT( _context, target, attachment, texture, level );

}

static void REGAL_CALL emuProcInterceptDsa_glFramebufferTextureFace(RegalContext *_context, GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreFramebuffer( _context );

  orig.glFramebufferTextureFace( _context, target, attachment, texture, level, face );

}

static void REGAL_CALL emuProcInterceptDsa_glFramebufferTextureFaceARB(RegalContext *_context, GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreFramebuffer( _context );

  orig.glFramebufferTextureFaceARB( _context, target, attachment, texture, level, face );

}

static void REGAL_CALL emuProcInterceptDsa_glFramebufferTextureFaceEXT(RegalContext *_context, GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreFramebuffer( _context );

  orig.glFramebufferTextureFaceEXT( _context, target, attachment, texture, level, face );

}

static void REGAL_CALL emuProcInterceptDsa_glFramebufferTextureLayer(RegalContext *_context, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreFramebuffer( _context );

  orig.glFramebufferTextureLayer( _context, target, attachment, texture, level, layer );

}

static void REGAL_CALL emuProcInterceptDsa_glFramebufferTextureLayerARB(RegalContext *_context, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreFramebuffer( _context );

  orig.glFramebufferTextureLayerARB( _context, target, attachment, texture, level, layer );

}

static void REGAL_CALL emuProcInterceptDsa_glFramebufferTextureLayerEXT(RegalContext *_context, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreFramebuffer( _context );

  orig.glFramebufferTextureLayerEXT( _context, target, attachment, texture, level, layer );

}

static void REGAL_CALL emuProcInterceptDsa_glGenerateMipmap(RegalContext *_context, GLenum target)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreTexture( _context );
  _context->dsa->RestoreActiveTexture( _context );

  orig.glGenerateMipmap( _context, target );

}

static void REGAL_CALL emuProcInterceptDsa_glGenerateMipmapEXT(RegalContext *_context, GLenum target)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreTexture( _context );
  _context->dsa->RestoreActiveTexture( _context );

  orig.glGenerateMipmapEXT( _context, target );

}

static void REGAL_CALL emuProcInterceptDsa_glGenerateMultiTexMipmapEXT(RegalContext *_context, GLenum texunit, GLenum target)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glGenerateMipmap( _context, target );
  return;

  orig.glGenerateMultiTexMipmapEXT( _context, texunit, target );

}

static void REGAL_CALL emuProcInterceptDsa_glGenerateTextureMipmapEXT(RegalContext *_context, GLuint texture, GLenum target)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glGenerateMipmap( _context, target );
  return;

  orig.glGenerateTextureMipmapEXT( _context, texture, target );

}

static void REGAL_CALL emuProcInterceptDsa_glGetBooleanv(RegalContext *_context, GLenum pname, GLboolean *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGet( _context, pname );

  orig.glGetBooleanv( _context, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetBufferParameteriv(RegalContext *_context, GLenum target, GLenum pname, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreBuffer( _context );

  orig.glGetBufferParameteriv( _context, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetBufferPointerv(RegalContext *_context, GLenum target, GLenum pname, GLvoid **params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreBuffer( _context );

  orig.glGetBufferPointerv( _context, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetBufferSubData(RegalContext *_context, GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreBuffer( _context );

  orig.glGetBufferSubData( _context, target, offset, size, data );

}

static void REGAL_CALL emuProcInterceptDsa_glGetCompressedMultiTexImageEXT(RegalContext *_context, GLenum texunit, GLenum target, GLint lod, GLvoid *img)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glGetCompressedTexImage( _context, target, lod, img );
  return;

  orig.glGetCompressedMultiTexImageEXT( _context, texunit, target, lod, img );

}

static void REGAL_CALL emuProcInterceptDsa_glGetCompressedTextureImageEXT(RegalContext *_context, GLuint texture, GLenum target, GLint lod, GLvoid *img)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glGetCompressedTexImage( _context, target, lod, img );
  return;

  orig.glGetCompressedTextureImageEXT( _context, texture, target, lod, img );

}

static void REGAL_CALL emuProcInterceptDsa_glGetDoubleIndexedvEXT(RegalContext *_context, GLenum target, GLuint index, GLdouble *data)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if ( _context->dsa->GetIndexedv( _context, target, index, data ) ) {
    return;
  }

  orig.glGetDoubleIndexedvEXT( _context, target, index, data );

}

static void REGAL_CALL emuProcInterceptDsa_glGetDoublei_v(RegalContext *_context, GLenum target, GLuint index, GLdouble *v)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if ( _context->dsa->GetIndexedv( _context, target, index, v ) ) {
    return;
  }

  orig.glGetDoublei_v( _context, target, index, v );

}

static void REGAL_CALL emuProcInterceptDsa_glGetDoublei_vEXT(RegalContext *_context, GLenum target, GLuint index, GLdouble *data)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if ( _context->dsa->GetIndexedv( _context, target, index, data ) ) {
    return;
  }

  orig.glGetDoublei_vEXT( _context, target, index, data );

}

static void REGAL_CALL emuProcInterceptDsa_glGetDoublev(RegalContext *_context, GLenum pname, GLdouble *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGet( _context, pname );

  orig.glGetDoublev( _context, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetFloatIndexedvEXT(RegalContext *_context, GLenum target, GLuint index, GLfloat *data)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if ( _context->dsa->GetIndexedv( _context, target, index, data ) ) {
    return;
  }

  orig.glGetFloatIndexedvEXT( _context, target, index, data );

}

static void REGAL_CALL emuProcInterceptDsa_glGetFloati_v(RegalContext *_context, GLenum target, GLuint index, GLfloat *v)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if ( _context->dsa->GetIndexedv( _context, target, index, v ) ) {
    return;
  }

  orig.glGetFloati_v( _context, target, index, v );

}

static void REGAL_CALL emuProcInterceptDsa_glGetFloati_vEXT(RegalContext *_context, GLenum target, GLuint index, GLfloat *data)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if ( _context->dsa->GetIndexedv( _context, target, index, data ) ) {
    return;
  }

  orig.glGetFloati_vEXT( _context, target, index, data );

}

static void REGAL_CALL emuProcInterceptDsa_glGetFloatv(RegalContext *_context, GLenum pname, GLfloat *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGet( _context, pname );

  orig.glGetFloatv( _context, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetFramebufferParameterivEXT(RegalContext *_context, GLuint framebuffer, GLenum pname, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaFramebuffer( _context, GL_FRAMEBUFFER, framebuffer );
  orig.glGetIntegerv( _context, pname, params);
  return;

  orig.glGetFramebufferParameterivEXT( _context, framebuffer, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetIntegerv(RegalContext *_context, GLenum pname, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGet( _context, pname );

  orig.glGetIntegerv( _context, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetMultiTexEnvfvEXT(RegalContext *_context, GLenum texunit, GLenum target, GLenum pname, GLfloat *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glGetTexEnvfv( _context, target, pname, params );
  return;

  orig.glGetMultiTexEnvfvEXT( _context, texunit, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetMultiTexEnvivEXT(RegalContext *_context, GLenum texunit, GLenum target, GLenum pname, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glGetTexEnviv( _context, target, pname, params );
  return;

  orig.glGetMultiTexEnvivEXT( _context, texunit, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetMultiTexGendvEXT(RegalContext *_context, GLenum texunit, GLenum coord, GLenum pname, GLdouble *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glGetTexGendv( _context, coord, pname, params );
  return;

  orig.glGetMultiTexGendvEXT( _context, texunit, coord, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetMultiTexGenfvEXT(RegalContext *_context, GLenum texunit, GLenum coord, GLenum pname, GLfloat *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glGetTexGenfv( _context, coord, pname, params );
  return;

  orig.glGetMultiTexGenfvEXT( _context, texunit, coord, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetMultiTexGenivEXT(RegalContext *_context, GLenum texunit, GLenum coord, GLenum pname, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glGetTexGeniv( _context, coord, pname, params );
  return;

  orig.glGetMultiTexGenivEXT( _context, texunit, coord, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetMultiTexImageEXT(RegalContext *_context, GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glGetTexImage( _context, target, level, format, type, pixels );
  return;

  orig.glGetMultiTexImageEXT( _context, texunit, target, level, format, type, pixels );

}

static void REGAL_CALL emuProcInterceptDsa_glGetMultiTexLevelParameterfvEXT(RegalContext *_context, GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glGetTexLevelParameterfv( _context, target, level, pname, params );
  return;

  orig.glGetMultiTexLevelParameterfvEXT( _context, texunit, target, level, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetMultiTexLevelParameterivEXT(RegalContext *_context, GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glGetTexLevelParameteriv( _context, target, level, pname, params );
  return;

  orig.glGetMultiTexLevelParameterivEXT( _context, texunit, target, level, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetMultiTexParameterIivEXT(RegalContext *_context, GLenum texunit, GLenum target, GLenum pname, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glGetTexParameterIiv( _context, target, pname, params );
  return;

  orig.glGetMultiTexParameterIivEXT( _context, texunit, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetMultiTexParameterIuivEXT(RegalContext *_context, GLenum texunit, GLenum target, GLenum pname, GLuint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glGetTexParameterIuiv( _context, target, pname, params );
  return;

  orig.glGetMultiTexParameterIuivEXT( _context, texunit, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetMultiTexParameterfvEXT(RegalContext *_context, GLenum texunit, GLenum target, GLenum pname, GLfloat *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glGetTexParameterfv( _context, target, pname, params );
  return;

  orig.glGetMultiTexParameterfvEXT( _context, texunit, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetMultiTexParameterivEXT(RegalContext *_context, GLenum texunit, GLenum target, GLenum pname, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glGetTexParameteriv( _context, target, pname, params );
  return;

  orig.glGetMultiTexParameterivEXT( _context, texunit, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetNamedBufferParameterivEXT(RegalContext *_context, GLuint buffer, GLenum pname, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaBuffer( _context, buffer);
  orig.glGetBufferParameteriv( _context, GL_ARRAY_BUFFER, pname, params );
  return;

  orig.glGetNamedBufferParameterivEXT( _context, buffer, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetNamedBufferPointervEXT(RegalContext *_context, GLuint buffer, GLenum pname, GLvoid **params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaBuffer( _context, buffer);
  orig.glGetBufferPointerv( _context, GL_ARRAY_BUFFER, pname, params );
  return;

  orig.glGetNamedBufferPointervEXT( _context, buffer, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetNamedBufferSubDataEXT(RegalContext *_context, GLuint buffer, GLintptr offset, GLsizeiptr size, GLvoid *data)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaBuffer( _context, buffer);
  orig.glGetBufferSubData( _context, GL_ARRAY_BUFFER, offset, size, data );
  return;

  orig.glGetNamedBufferSubDataEXT( _context, buffer, offset, size, data );

}

static void REGAL_CALL emuProcInterceptDsa_glGetNamedFramebufferAttachmentParameterivEXT(RegalContext *_context, GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaFramebuffer( _context, GL_FRAMEBUFFER, framebuffer);
  orig.glGetFramebufferAttachmentParameteriv( _context, GL_FRAMEBUFFER, attachment, pname, params );
  return;

  orig.glGetNamedFramebufferAttachmentParameterivEXT( _context, framebuffer, attachment, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetNamedProgramLocalParameterIivEXT(RegalContext *_context, GLuint program, GLenum target, GLuint index, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaAsmProgram( _context, target, program);
  orig.glGetProgramLocalParameterIivNV( _context, target, index, params );
  return;

  orig.glGetNamedProgramLocalParameterIivEXT( _context, program, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetNamedProgramLocalParameterIuivEXT(RegalContext *_context, GLuint program, GLenum target, GLuint index, GLuint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaAsmProgram( _context, target, program);
  orig.glGetProgramLocalParameterIuivNV( _context, target, index, params );
  return;

  orig.glGetNamedProgramLocalParameterIuivEXT( _context, program, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetNamedProgramLocalParameterdvEXT(RegalContext *_context, GLuint program, GLenum target, GLuint index, GLdouble *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaAsmProgram( _context, target, program);
  orig.glGetProgramLocalParameterdvARB( _context, target, index, params );
  return;

  orig.glGetNamedProgramLocalParameterdvEXT( _context, program, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetNamedProgramLocalParameterfvEXT(RegalContext *_context, GLuint program, GLenum target, GLuint index, GLfloat *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaAsmProgram( _context, target, program);
  orig.glGetProgramLocalParameterfvARB( _context, target, index, params );
  return;

  orig.glGetNamedProgramLocalParameterfvEXT( _context, program, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetNamedProgramStringEXT(RegalContext *_context, GLuint program, GLenum target, GLenum pname, GLvoid *string)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaAsmProgram( _context, target, program);
  orig.glGetProgramStringARB( _context, target, pname, string );
  return;

  orig.glGetNamedProgramStringEXT( _context, program, target, pname, string );

}

static void REGAL_CALL emuProcInterceptDsa_glGetNamedProgramivEXT(RegalContext *_context, GLuint program, GLenum target, GLenum pname, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaAsmProgram( _context, target, program);
  orig.glGetProgramivARB( _context, target, pname, params );
  return;

  orig.glGetNamedProgramivEXT( _context, program, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetNamedRenderbufferParameterivEXT(RegalContext *_context, GLuint renderbuffer, GLenum pname, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaRenderbuffer( _context, GL_RENDERBUFFER, renderbuffer);
  orig.glGetRenderbufferParameteriv( _context, GL_RENDERBUFFER, pname, params );
  return;

  orig.glGetNamedRenderbufferParameterivEXT( _context, renderbuffer, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetPointerIndexedvEXT(RegalContext *_context, GLenum target, GLuint index, GLvoid **data)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  // if ( _context->dsa->GetIndexedv( _context, target, index, data ) ) {
  //   return;
  // }

  orig.glGetPointerIndexedvEXT( _context, target, index, data );

}

static void REGAL_CALL emuProcInterceptDsa_glGetProgramEnvParameterIivNV(RegalContext *_context, GLenum target, GLuint index, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glGetProgramEnvParameterIivNV( _context, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetProgramEnvParameterIuivNV(RegalContext *_context, GLenum target, GLuint index, GLuint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glGetProgramEnvParameterIuivNV( _context, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetProgramEnvParameterdvARB(RegalContext *_context, GLenum target, GLuint index, GLdouble *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glGetProgramEnvParameterdvARB( _context, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetProgramEnvParameterfvARB(RegalContext *_context, GLenum target, GLuint index, GLfloat *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glGetProgramEnvParameterfvARB( _context, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetProgramLocalParameterIivNV(RegalContext *_context, GLenum target, GLuint index, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glGetProgramLocalParameterIivNV( _context, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetProgramLocalParameterIuivNV(RegalContext *_context, GLenum target, GLuint index, GLuint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glGetProgramLocalParameterIuivNV( _context, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetProgramLocalParameterdvARB(RegalContext *_context, GLenum target, GLuint index, GLdouble *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glGetProgramLocalParameterdvARB( _context, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetProgramLocalParameterfvARB(RegalContext *_context, GLenum target, GLuint index, GLfloat *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glGetProgramLocalParameterfvARB( _context, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetRenderbufferParameteriv(RegalContext *_context, GLenum target, GLenum pname, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreRenderbuffer( _context );

  orig.glGetRenderbufferParameteriv( _context, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetRenderbufferParameterivEXT(RegalContext *_context, GLenum target, GLenum pname, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreRenderbuffer( _context );

  orig.glGetRenderbufferParameterivEXT( _context, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetTexEnvfv(RegalContext *_context, GLenum target, GLenum pname, GLfloat *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreTexture( _context );
  _context->dsa->RestoreActiveTexture( _context );

  orig.glGetTexEnvfv( _context, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetTexEnviv(RegalContext *_context, GLenum target, GLenum pname, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreTexture( _context );
  _context->dsa->RestoreActiveTexture( _context );

  orig.glGetTexEnviv( _context, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetTexParameterfv(RegalContext *_context, GLenum target, GLenum pname, GLfloat *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreTexture( _context );
  _context->dsa->RestoreActiveTexture( _context );

  orig.glGetTexParameterfv( _context, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetTexParameteriv(RegalContext *_context, GLenum target, GLenum pname, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreTexture( _context );
  _context->dsa->RestoreActiveTexture( _context );

  orig.glGetTexParameteriv( _context, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetTextureImageEXT(RegalContext *_context, GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glGetTexImage( _context, target, level, format, type, pixels );
  return;

  orig.glGetTextureImageEXT( _context, texture, target, level, format, type, pixels );

}

static void REGAL_CALL emuProcInterceptDsa_glGetTextureLevelParameterfvEXT(RegalContext *_context, GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glGetTexLevelParameterfv( _context, target, level, pname, params );
  return;

  orig.glGetTextureLevelParameterfvEXT( _context, texture, target, level, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetTextureLevelParameterivEXT(RegalContext *_context, GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glGetTexLevelParameteriv( _context, target, level, pname, params );
  return;

  orig.glGetTextureLevelParameterivEXT( _context, texture, target, level, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetTextureParameterIivEXT(RegalContext *_context, GLuint texture, GLenum target, GLenum pname, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glGetTexParameterIiv( _context, target, pname, params );
  return;

  orig.glGetTextureParameterIivEXT( _context, texture, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetTextureParameterIuivEXT(RegalContext *_context, GLuint texture, GLenum target, GLenum pname, GLuint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glGetTexParameterIuiv( _context, target, pname, params );
  return;

  orig.glGetTextureParameterIuivEXT( _context, texture, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetTextureParameterfvEXT(RegalContext *_context, GLuint texture, GLenum target, GLenum pname, GLfloat *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glGetTexParameterfv( _context, target, pname, params );
  return;

  orig.glGetTextureParameterfvEXT( _context, texture, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glGetTextureParameterivEXT(RegalContext *_context, GLuint texture, GLenum target, GLenum pname, GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glGetTexParameteriv( _context, target, pname, params );
  return;

  orig.glGetTextureParameterivEXT( _context, texture, target, pname, params );

}

static GLboolean REGAL_CALL emuProcInterceptDsa_glIsEnabled(RegalContext *_context, GLenum cap)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreIsEnabled( _context, cap );

  return orig.glIsEnabled( _context, cap );

}

static GLboolean REGAL_CALL emuProcInterceptDsa_glIsEnabledIndexedEXT(RegalContext *_context, GLenum target, GLuint index)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  GLboolean ret;
  ret = _context->dsa->IsEnabledIndexed( _context, target, index );
  return ret;

  return orig.glIsEnabledIndexedEXT( _context, target, index );

}

static void REGAL_CALL emuProcInterceptDsa_glLoadIdentity(RegalContext *_context)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreMatrixMode( _context );

  orig.glLoadIdentity( _context );

}

static void REGAL_CALL emuProcInterceptDsa_glLoadMatrixd(RegalContext *_context, const GLdouble *m)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreMatrixMode( _context );

  orig.glLoadMatrixd( _context, m );

}

static void REGAL_CALL emuProcInterceptDsa_glLoadMatrixf(RegalContext *_context, const GLfloat *m)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreMatrixMode( _context );

  orig.glLoadMatrixf( _context, m );

}

static void REGAL_CALL emuProcInterceptDsa_glLoadTransposeMatrixd(RegalContext *_context, const GLdouble *m)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreMatrixMode( _context );

  orig.glLoadTransposeMatrixd( _context, m );

}

static void REGAL_CALL emuProcInterceptDsa_glLoadTransposeMatrixf(RegalContext *_context, const GLfloat *m)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreMatrixMode( _context );

  orig.glLoadTransposeMatrixf( _context, m );

}

static GLvoid *REGAL_CALL emuProcInterceptDsa_glMapBuffer(RegalContext *_context, GLenum target, GLenum access)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreBuffer( _context );

  return orig.glMapBuffer( _context, target, access );

}

static GLvoid *REGAL_CALL emuProcInterceptDsa_glMapBufferARB(RegalContext *_context, GLenum target, GLenum access)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreBuffer( _context );

  return orig.glMapBufferARB( _context, target, access );

}

static GLvoid *REGAL_CALL emuProcInterceptDsa_glMapBufferRange(RegalContext *_context, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreBuffer( _context );

  return orig.glMapBufferRange( _context, target, offset, length, access );

}

static GLvoid *REGAL_CALL emuProcInterceptDsa_glMapBufferRangeEXT(RegalContext *_context, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreBuffer( _context );

  return orig.glMapBufferRangeEXT( _context, target, offset, length, access );

}

static GLvoid *REGAL_CALL emuProcInterceptDsa_glMapNamedBufferEXT(RegalContext *_context, GLuint buffer, GLenum access)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaBuffer( _context, buffer);
  return orig.glMapBuffer( _context, GL_ARRAY_BUFFER, access );

  return orig.glMapNamedBufferEXT( _context, buffer, access );

}

static GLvoid *REGAL_CALL emuProcInterceptDsa_glMapNamedBufferRangeEXT(RegalContext *_context, GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaBuffer( _context, buffer);
  return orig.glMapBufferRange( _context, GL_ARRAY_BUFFER, offset, length, access );

  return orig.glMapNamedBufferRangeEXT( _context, buffer, offset, length, access );

}

static void REGAL_CALL emuProcInterceptDsa_glMatrixFrustumEXT(RegalContext *_context, GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaMatrixMode( _context, mode );
  orig.glFrustum( _context, left, right, bottom, top, zNear, zFar);
  return;

  orig.glMatrixFrustumEXT( _context, mode, left, right, bottom, top, zNear, zFar );

}

static void REGAL_CALL emuProcInterceptDsa_glMatrixLoadIdentityEXT(RegalContext *_context, GLenum mode)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaMatrixMode( _context, mode );
  orig.glLoadIdentity( _context );
  return;

  orig.glMatrixLoadIdentityEXT( _context, mode );

}

static void REGAL_CALL emuProcInterceptDsa_glMatrixLoadTransposedEXT(RegalContext *_context, GLenum mode, const GLdouble *m)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaMatrixMode( _context, mode );
  orig.glLoadTransposeMatrixd( _context, m);
  return;

  orig.glMatrixLoadTransposedEXT( _context, mode, m );

}

static void REGAL_CALL emuProcInterceptDsa_glMatrixLoadTransposefEXT(RegalContext *_context, GLenum mode, const GLfloat *m)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaMatrixMode( _context, mode );
  orig.glLoadTransposeMatrixf( _context, m);
  return;

  orig.glMatrixLoadTransposefEXT( _context, mode, m );

}

static void REGAL_CALL emuProcInterceptDsa_glMatrixLoaddEXT(RegalContext *_context, GLenum mode, const GLdouble *m)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaMatrixMode( _context, mode );
  orig.glLoadMatrixd( _context, m);
  return;

  orig.glMatrixLoaddEXT( _context, mode, m );

}

static void REGAL_CALL emuProcInterceptDsa_glMatrixLoadfEXT(RegalContext *_context, GLenum mode, const GLfloat *m)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaMatrixMode( _context, mode );
  orig.glLoadMatrixf( _context, m);
  return;

  orig.glMatrixLoadfEXT( _context, mode, m );

}

static void REGAL_CALL emuProcInterceptDsa_glMatrixMode(RegalContext *_context, GLenum mode)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if (_context->dsa->ShadowMatrixMode(mode)) {
    return;
  }

  orig.glMatrixMode( _context, mode );

}

static void REGAL_CALL emuProcInterceptDsa_glMatrixMultTransposedEXT(RegalContext *_context, GLenum mode, const GLdouble *m)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaMatrixMode( _context, mode );
  orig.glMultTransposeMatrixd( _context, m);
  return;

  orig.glMatrixMultTransposedEXT( _context, mode, m );

}

static void REGAL_CALL emuProcInterceptDsa_glMatrixMultTransposefEXT(RegalContext *_context, GLenum mode, const GLfloat *m)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaMatrixMode( _context, mode );
  orig.glMultTransposeMatrixf( _context, m);
  return;

  orig.glMatrixMultTransposefEXT( _context, mode, m );

}

static void REGAL_CALL emuProcInterceptDsa_glMatrixMultdEXT(RegalContext *_context, GLenum mode, const GLdouble *m)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaMatrixMode( _context, mode );
  orig.glMultMatrixd( _context, m);
  return;

  orig.glMatrixMultdEXT( _context, mode, m );

}

static void REGAL_CALL emuProcInterceptDsa_glMatrixMultfEXT(RegalContext *_context, GLenum mode, const GLfloat *m)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaMatrixMode( _context, mode );
  orig.glMultMatrixf( _context, m);
  return;

  orig.glMatrixMultfEXT( _context, mode, m );

}

static void REGAL_CALL emuProcInterceptDsa_glMatrixOrthoEXT(RegalContext *_context, GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaMatrixMode( _context, mode );
  orig.glOrtho( _context, left, right, bottom, top, zNear, zFar);
  return;

  orig.glMatrixOrthoEXT( _context, mode, left, right, bottom, top, zNear, zFar );

}

static void REGAL_CALL emuProcInterceptDsa_glMatrixPopEXT(RegalContext *_context, GLenum mode)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaMatrixMode( _context, mode );
  orig.glPopMatrix( _context );
  return;

  orig.glMatrixPopEXT( _context, mode );

}

static void REGAL_CALL emuProcInterceptDsa_glMatrixPushEXT(RegalContext *_context, GLenum mode)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaMatrixMode( _context, mode );
  orig.glPushMatrix( _context );
  return;

  orig.glMatrixPushEXT( _context, mode );

}

static void REGAL_CALL emuProcInterceptDsa_glMatrixRotatedEXT(RegalContext *_context, GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaMatrixMode( _context, mode );
  orig.glRotated( _context, angle, x, y, z);
  return;

  orig.glMatrixRotatedEXT( _context, mode, angle, x, y, z );

}

static void REGAL_CALL emuProcInterceptDsa_glMatrixRotatefEXT(RegalContext *_context, GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaMatrixMode( _context, mode );
  orig.glRotatef( _context, angle, x, y, z);
  return;

  orig.glMatrixRotatefEXT( _context, mode, angle, x, y, z );

}

static void REGAL_CALL emuProcInterceptDsa_glMatrixScaledEXT(RegalContext *_context, GLenum mode, GLdouble x, GLdouble y, GLdouble z)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaMatrixMode( _context, mode );
  orig.glScaled( _context, x, y, z);
  return;

  orig.glMatrixScaledEXT( _context, mode, x, y, z );

}

static void REGAL_CALL emuProcInterceptDsa_glMatrixScalefEXT(RegalContext *_context, GLenum mode, GLfloat x, GLfloat y, GLfloat z)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaMatrixMode( _context, mode );
  orig.glScalef( _context, x, y, z);
  return;

  orig.glMatrixScalefEXT( _context, mode, x, y, z );

}

static void REGAL_CALL emuProcInterceptDsa_glMatrixTranslatedEXT(RegalContext *_context, GLenum mode, GLdouble x, GLdouble y, GLdouble z)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaMatrixMode( _context, mode );
  orig.glTranslated( _context, x, y, z);
  return;

  orig.glMatrixTranslatedEXT( _context, mode, x, y, z );

}

static void REGAL_CALL emuProcInterceptDsa_glMatrixTranslatefEXT(RegalContext *_context, GLenum mode, GLfloat x, GLfloat y, GLfloat z)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaMatrixMode( _context, mode );
  orig.glTranslatef( _context, x, y, z);
  return;

  orig.glMatrixTranslatefEXT( _context, mode, x, y, z );

}

static void REGAL_CALL emuProcInterceptDsa_glMultMatrixd(RegalContext *_context, const GLdouble *m)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreMatrixMode( _context );

  orig.glMultMatrixd( _context, m );

}

static void REGAL_CALL emuProcInterceptDsa_glMultMatrixf(RegalContext *_context, const GLfloat *m)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreMatrixMode( _context );

  orig.glMultMatrixf( _context, m );

}

static void REGAL_CALL emuProcInterceptDsa_glMultTransposeMatrixd(RegalContext *_context, const GLdouble *m)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreMatrixMode( _context );

  orig.glMultTransposeMatrixd( _context, m );

}

static void REGAL_CALL emuProcInterceptDsa_glMultTransposeMatrixf(RegalContext *_context, const GLfloat *m)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreMatrixMode( _context );

  orig.glMultTransposeMatrixf( _context, m );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiDrawArrays(RegalContext *_context, GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glMultiDrawArrays( _context, mode, first, count, primcount );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiDrawArraysEXT(RegalContext *_context, GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glMultiDrawArraysEXT( _context, mode, first, count, primcount );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiDrawArraysIndirect(RegalContext *_context, GLenum mode, const GLvoid *indirect, GLsizei primcount, GLsizei stride)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glMultiDrawArraysIndirect( _context, mode, indirect, primcount, stride );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiDrawArraysIndirectAMD(RegalContext *_context, GLenum mode, const GLvoid *indirect, GLsizei primcount, GLsizei stride)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glMultiDrawArraysIndirectAMD( _context, mode, indirect, primcount, stride );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiDrawElementArrayAPPLE(RegalContext *_context, GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glMultiDrawElementArrayAPPLE( _context, mode, first, count, primcount );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiDrawElements(RegalContext *_context, GLenum mode, const GLsizei *count, GLenum type, const GLvoid * const *indices, GLsizei primcount)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glMultiDrawElements( _context, mode, count, type, indices, primcount );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiDrawElementsBaseVertex(RegalContext *_context, GLenum mode, const GLsizei *count, GLenum type, const GLvoid * const *indices, GLsizei primcount, const GLint *basevertex)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glMultiDrawElementsBaseVertex( _context, mode, count, type, indices, primcount, basevertex );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiDrawElementsEXT(RegalContext *_context, GLenum mode, const GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glMultiDrawElementsEXT( _context, mode, count, type, indices, primcount );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiDrawElementsIndirect(RegalContext *_context, GLenum mode, GLenum type, const GLvoid *indirect, GLsizei primcount, GLsizei stride)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glMultiDrawElementsIndirect( _context, mode, type, indirect, primcount, stride );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiDrawElementsIndirectAMD(RegalContext *_context, GLenum mode, GLenum type, const GLvoid *indirect, GLsizei primcount, GLsizei stride)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->Restore( _context );

  orig.glMultiDrawElementsIndirectAMD( _context, mode, type, indirect, primcount, stride );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexBufferEXT(RegalContext *_context, GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexBuffer( _context, target, internalformat, buffer );
  return;

  orig.glMultiTexBufferEXT( _context, texunit, target, internalformat, buffer );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexCoordPointerEXT(RegalContext *_context, GLenum texunit, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaClientActiveTexture( _context, texunit );
  orig.glTexCoordPointer( _context, size, type, stride, pointer );
  return;

  orig.glMultiTexCoordPointerEXT( _context, texunit, size, type, stride, pointer );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexEnvfEXT(RegalContext *_context, GLenum texunit, GLenum target, GLenum pname, GLfloat param)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexEnvf( _context, target, pname, param );
  return;

  orig.glMultiTexEnvfEXT( _context, texunit, target, pname, param );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexEnvfvEXT(RegalContext *_context, GLenum texunit, GLenum target, GLenum pname, const GLfloat *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexEnvfv( _context, target, pname, params );
  return;

  orig.glMultiTexEnvfvEXT( _context, texunit, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexEnviEXT(RegalContext *_context, GLenum texunit, GLenum target, GLenum pname, GLint param)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexEnvi( _context, target, pname, param );
  return;

  orig.glMultiTexEnviEXT( _context, texunit, target, pname, param );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexEnvivEXT(RegalContext *_context, GLenum texunit, GLenum target, GLenum pname, const GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexEnviv( _context, target, pname, params );
  return;

  orig.glMultiTexEnvivEXT( _context, texunit, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexGendEXT(RegalContext *_context, GLenum texunit, GLenum coord, GLenum pname, GLdouble param)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexGend( _context, coord, pname, param );
  return;

  orig.glMultiTexGendEXT( _context, texunit, coord, pname, param );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexGendvEXT(RegalContext *_context, GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexGendv( _context, coord, pname, params );
  return;

  orig.glMultiTexGendvEXT( _context, texunit, coord, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexGenfEXT(RegalContext *_context, GLenum texunit, GLenum coord, GLenum pname, GLfloat param)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexGenf( _context, coord, pname, param );
  return;

  orig.glMultiTexGenfEXT( _context, texunit, coord, pname, param );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexGenfvEXT(RegalContext *_context, GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexGenfv( _context, coord, pname, params );
  return;

  orig.glMultiTexGenfvEXT( _context, texunit, coord, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexGeniEXT(RegalContext *_context, GLenum texunit, GLenum coord, GLenum pname, GLint param)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexGeni( _context, coord, pname, param );
  return;

  orig.glMultiTexGeniEXT( _context, texunit, coord, pname, param );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexGenivEXT(RegalContext *_context, GLenum texunit, GLenum coord, GLenum pname, const GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexGeniv( _context, coord, pname, params );
  return;

  orig.glMultiTexGenivEXT( _context, texunit, coord, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexImage1DEXT(RegalContext *_context, GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexImage1D( _context, target, level, internalformat, width, border, format, type, pixels );
  return;

  orig.glMultiTexImage1DEXT( _context, texunit, target, level, internalformat, width, border, format, type, pixels );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexImage2DEXT(RegalContext *_context, GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexImage2D( _context, target, level, internalformat, width, height, border, format, type, pixels );
  return;

  orig.glMultiTexImage2DEXT( _context, texunit, target, level, internalformat, width, height, border, format, type, pixels );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexImage3DEXT(RegalContext *_context, GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexImage3D( _context, target, level, internalformat, width, height, depth, border, format, type, pixels );
  return;

  orig.glMultiTexImage3DEXT( _context, texunit, target, level, internalformat, width, height, depth, border, format, type, pixels );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexParameterIivEXT(RegalContext *_context, GLenum texunit, GLenum target, GLenum pname, const GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexParameterIiv( _context, target, pname, params );
  return;

  orig.glMultiTexParameterIivEXT( _context, texunit, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexParameterIuivEXT(RegalContext *_context, GLenum texunit, GLenum target, GLenum pname, const GLuint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexParameterIuiv( _context, target, pname, params );
  return;

  orig.glMultiTexParameterIuivEXT( _context, texunit, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexParameterfEXT(RegalContext *_context, GLenum texunit, GLenum target, GLenum pname, GLfloat param)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexParameterf( _context, target, pname, param );
  return;

  orig.glMultiTexParameterfEXT( _context, texunit, target, pname, param );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexParameterfvEXT(RegalContext *_context, GLenum texunit, GLenum target, GLenum pname, const GLfloat *param)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexParameterfv( _context, target, pname, param );
  return;

  orig.glMultiTexParameterfvEXT( _context, texunit, target, pname, param );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexParameteriEXT(RegalContext *_context, GLenum texunit, GLenum target, GLenum pname, GLint param)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexParameteri( _context, target, pname, param );
  return;

  orig.glMultiTexParameteriEXT( _context, texunit, target, pname, param );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexParameterivEXT(RegalContext *_context, GLenum texunit, GLenum target, GLenum pname, const GLint *param)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexParameteriv( _context, target, pname, param );
  return;

  orig.glMultiTexParameterivEXT( _context, texunit, target, pname, param );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexRenderbufferEXT(RegalContext *_context, GLenum texunit, GLenum target, GLuint renderbuffer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexRenderbufferNV( _context, target, renderbuffer );
  return;

  orig.glMultiTexRenderbufferEXT( _context, texunit, target, renderbuffer );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexSubImage1DEXT(RegalContext *_context, GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexSubImage1D( _context, target, level, xoffset, width, format, type, pixels );
  return;

  orig.glMultiTexSubImage1DEXT( _context, texunit, target, level, xoffset, width, format, type, pixels );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexSubImage2DEXT(RegalContext *_context, GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexSubImage2D( _context, target, level, xoffset, yoffset, width, height, format, type, pixels );
  return;

  orig.glMultiTexSubImage2DEXT( _context, texunit, target, level, xoffset, yoffset, width, height, format, type, pixels );

}

static void REGAL_CALL emuProcInterceptDsa_glMultiTexSubImage3DEXT(RegalContext *_context, GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaActiveTexture( _context, texunit );
  orig.glTexSubImage3D( _context, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels );
  return;

  orig.glMultiTexSubImage3DEXT( _context, texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedBufferDataEXT(RegalContext *_context, GLuint buffer, GLsizeiptr size, const GLvoid *data, GLenum usage)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaBuffer( _context, buffer);
  orig.glBufferData( _context, GL_ARRAY_BUFFER, size, data, usage );
  return;

  orig.glNamedBufferDataEXT( _context, buffer, size, data, usage );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedBufferSubDataEXT(RegalContext *_context, GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid *data)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaBuffer( _context, buffer);
  orig.glBufferSubData( _context, GL_ARRAY_BUFFER, offset, size, data );
  return;

  orig.glNamedBufferSubDataEXT( _context, buffer, offset, size, data );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedCopyBufferSubDataEXT(RegalContext *_context, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaBuffer( _context, readBuffer);
  orig.glCopyBufferSubData( _context, GL_ARRAY_BUFFER, writeBuffer, readOffset, writeOffset, size );
  return;

  orig.glNamedCopyBufferSubDataEXT( _context, readBuffer, writeBuffer, readOffset, writeOffset, size );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedFramebufferRenderbufferEXT(RegalContext *_context, GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaFramebuffer( _context, GL_FRAMEBUFFER, framebuffer);
  orig.glFramebufferRenderbuffer( _context, GL_FRAMEBUFFER, attachment, renderbuffertarget, renderbuffer );
  return;

  orig.glNamedFramebufferRenderbufferEXT( _context, framebuffer, attachment, renderbuffertarget, renderbuffer );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedFramebufferTexture1DEXT(RegalContext *_context, GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaFramebuffer( _context, GL_FRAMEBUFFER, framebuffer);
  orig.glFramebufferTexture1D( _context, GL_FRAMEBUFFER, attachment, textarget, texture, level );
  return;

  orig.glNamedFramebufferTexture1DEXT( _context, framebuffer, attachment, textarget, texture, level );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedFramebufferTexture2DEXT(RegalContext *_context, GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaFramebuffer( _context, GL_FRAMEBUFFER, framebuffer);
  orig.glFramebufferTexture2D( _context, GL_FRAMEBUFFER, attachment, textarget, texture, level );
  return;

  orig.glNamedFramebufferTexture2DEXT( _context, framebuffer, attachment, textarget, texture, level );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedFramebufferTexture3DEXT(RegalContext *_context, GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaFramebuffer( _context, GL_FRAMEBUFFER, framebuffer);
  orig.glFramebufferTexture3D( _context, GL_FRAMEBUFFER, attachment, textarget, texture, level, zoffset );
  return;

  orig.glNamedFramebufferTexture3DEXT( _context, framebuffer, attachment, textarget, texture, level, zoffset );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedFramebufferTextureEXT(RegalContext *_context, GLuint framebuffer, GLenum attachment, GLuint texture, GLint level)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaFramebuffer( _context, GL_FRAMEBUFFER, framebuffer);
  orig.glFramebufferTexture( _context, GL_FRAMEBUFFER, attachment, texture, level );
  return;

  orig.glNamedFramebufferTextureEXT( _context, framebuffer, attachment, texture, level );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedFramebufferTextureFaceEXT(RegalContext *_context, GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaFramebuffer( _context, GL_FRAMEBUFFER, framebuffer);
  orig.glFramebufferTextureFaceARB( _context, GL_FRAMEBUFFER, attachment, texture, level, face );
  return;

  orig.glNamedFramebufferTextureFaceEXT( _context, framebuffer, attachment, texture, level, face );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedFramebufferTextureLayerEXT(RegalContext *_context, GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaFramebuffer( _context, GL_FRAMEBUFFER, framebuffer);
  orig.glFramebufferTextureLayer( _context, GL_FRAMEBUFFER, attachment, texture, level, layer );
  return;

  orig.glNamedFramebufferTextureLayerEXT( _context, framebuffer, attachment, texture, level, layer );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedProgramLocalParameter4dEXT(RegalContext *_context, GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaAsmProgram( _context, target, program);
  orig.glProgramLocalParameter4dARB( _context, target, index, x, y, z, w );
  return;

  orig.glNamedProgramLocalParameter4dEXT( _context, program, target, index, x, y, z, w );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedProgramLocalParameter4dvEXT(RegalContext *_context, GLuint program, GLenum target, GLuint index, const GLdouble *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaAsmProgram( _context, target, program);
  orig.glProgramLocalParameter4dvARB( _context, target, index, params );
  return;

  orig.glNamedProgramLocalParameter4dvEXT( _context, program, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedProgramLocalParameter4fEXT(RegalContext *_context, GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaAsmProgram( _context, target, program);
  orig.glProgramLocalParameter4fARB( _context, target, index, x, y, z, w );
  return;

  orig.glNamedProgramLocalParameter4fEXT( _context, program, target, index, x, y, z, w );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedProgramLocalParameter4fvEXT(RegalContext *_context, GLuint program, GLenum target, GLuint index, const GLfloat *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaAsmProgram( _context, target, program);
  orig.glProgramLocalParameter4fvARB( _context, target, index, params );
  return;

  orig.glNamedProgramLocalParameter4fvEXT( _context, program, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedProgramLocalParameterI4iEXT(RegalContext *_context, GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaAsmProgram( _context, target, program);
  orig.glProgramLocalParameterI4iNV( _context, target, index, x, y, z, w );
  return;

  orig.glNamedProgramLocalParameterI4iEXT( _context, program, target, index, x, y, z, w );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedProgramLocalParameterI4ivEXT(RegalContext *_context, GLuint program, GLenum target, GLuint index, const GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaAsmProgram( _context, target, program);
  orig.glProgramLocalParameterI4ivNV( _context, target, index, params );
  return;

  orig.glNamedProgramLocalParameterI4ivEXT( _context, program, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedProgramLocalParameterI4uiEXT(RegalContext *_context, GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaAsmProgram( _context, target, program);
  orig.glProgramLocalParameterI4uiNV( _context, target, index, x, y, z, w );
  return;

  orig.glNamedProgramLocalParameterI4uiEXT( _context, program, target, index, x, y, z, w );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedProgramLocalParameterI4uivEXT(RegalContext *_context, GLuint program, GLenum target, GLuint index, const GLuint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaAsmProgram( _context, target, program);
  orig.glProgramLocalParameterI4uivNV( _context, target, index, params );
  return;

  orig.glNamedProgramLocalParameterI4uivEXT( _context, program, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedProgramLocalParameters4fvEXT(RegalContext *_context, GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaAsmProgram( _context, target, program);
  orig.glProgramLocalParameters4fvEXT( _context, target, index, count, params );
  return;

  orig.glNamedProgramLocalParameters4fvEXT( _context, program, target, index, count, params );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedProgramLocalParametersI4ivEXT(RegalContext *_context, GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaAsmProgram( _context, target, program);
  orig.glProgramLocalParametersI4ivNV( _context, target, index, count, params );
  return;

  orig.glNamedProgramLocalParametersI4ivEXT( _context, program, target, index, count, params );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedProgramLocalParametersI4uivEXT(RegalContext *_context, GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaAsmProgram( _context, target, program);
  orig.glProgramLocalParametersI4uivNV( _context, target, index, count, params );
  return;

  orig.glNamedProgramLocalParametersI4uivEXT( _context, program, target, index, count, params );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedProgramStringEXT(RegalContext *_context, GLuint program, GLenum target, GLenum format, GLsizei len, const GLvoid *string)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaAsmProgram( _context, target, program);
  orig.glProgramStringARB( _context, target, format, len, string );
  return;

  orig.glNamedProgramStringEXT( _context, program, target, format, len, string );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedRenderbufferStorageEXT(RegalContext *_context, GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaRenderbuffer( _context, GL_RENDERBUFFER, renderbuffer);
  orig.glRenderbufferStorage( _context, GL_RENDERBUFFER, internalformat, width, height );
  return;

  orig.glNamedRenderbufferStorageEXT( _context, renderbuffer, internalformat, width, height );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedRenderbufferStorageMultisampleCoverageEXT(RegalContext *_context, GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaRenderbuffer( _context, GL_RENDERBUFFER, renderbuffer);
  orig.glRenderbufferStorageMultisampleCoverageNV( _context, GL_RENDERBUFFER, coverageSamples, colorSamples, internalformat, width, height );
  return;

  orig.glNamedRenderbufferStorageMultisampleCoverageEXT( _context, renderbuffer, coverageSamples, colorSamples, internalformat, width, height );

}

static void REGAL_CALL emuProcInterceptDsa_glNamedRenderbufferStorageMultisampleEXT(RegalContext *_context, GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaRenderbuffer( _context, GL_RENDERBUFFER, renderbuffer);
  orig.glRenderbufferStorageMultisample( _context, GL_RENDERBUFFER, samples, internalformat, width, height );
  return;

  orig.glNamedRenderbufferStorageMultisampleEXT( _context, renderbuffer, samples, internalformat, width, height );

}

static void REGAL_CALL emuProcInterceptDsa_glNormalPointer(RegalContext *_context, GLenum type, GLsizei stride, const GLvoid *pointer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreBuffer( _context );

  orig.glNormalPointer( _context, type, stride, pointer );

}

static void REGAL_CALL emuProcInterceptDsa_glPopMatrix(RegalContext *_context)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreMatrixMode( _context );

  orig.glPopMatrix( _context );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramEnvParameter4dARB(RegalContext *_context, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glProgramEnvParameter4dARB( _context, target, index, x, y, z, w );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramEnvParameter4dvARB(RegalContext *_context, GLenum target, GLuint index, const GLdouble *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glProgramEnvParameter4dvARB( _context, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramEnvParameter4fARB(RegalContext *_context, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glProgramEnvParameter4fARB( _context, target, index, x, y, z, w );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramEnvParameter4fvARB(RegalContext *_context, GLenum target, GLuint index, const GLfloat *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glProgramEnvParameter4fvARB( _context, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramEnvParameterI4iNV(RegalContext *_context, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glProgramEnvParameterI4iNV( _context, target, index, x, y, z, w );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramEnvParameterI4ivNV(RegalContext *_context, GLenum target, GLuint index, const GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glProgramEnvParameterI4ivNV( _context, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramEnvParameterI4uiNV(RegalContext *_context, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glProgramEnvParameterI4uiNV( _context, target, index, x, y, z, w );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramEnvParameterI4uivNV(RegalContext *_context, GLenum target, GLuint index, const GLuint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glProgramEnvParameterI4uivNV( _context, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramEnvParametersI4ivNV(RegalContext *_context, GLenum target, GLuint index, GLsizei count, const GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glProgramEnvParametersI4ivNV( _context, target, index, count, params );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramEnvParametersI4uivNV(RegalContext *_context, GLenum target, GLuint index, GLsizei count, const GLuint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glProgramEnvParametersI4uivNV( _context, target, index, count, params );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramLocalParameter4dARB(RegalContext *_context, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glProgramLocalParameter4dARB( _context, target, index, x, y, z, w );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramLocalParameter4dvARB(RegalContext *_context, GLenum target, GLuint index, const GLdouble *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glProgramLocalParameter4dvARB( _context, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramLocalParameter4fARB(RegalContext *_context, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glProgramLocalParameter4fARB( _context, target, index, x, y, z, w );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramLocalParameter4fvARB(RegalContext *_context, GLenum target, GLuint index, const GLfloat *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glProgramLocalParameter4fvARB( _context, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramLocalParameterI4iNV(RegalContext *_context, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glProgramLocalParameterI4iNV( _context, target, index, x, y, z, w );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramLocalParameterI4ivNV(RegalContext *_context, GLenum target, GLuint index, const GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glProgramLocalParameterI4ivNV( _context, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramLocalParameterI4uiNV(RegalContext *_context, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glProgramLocalParameterI4uiNV( _context, target, index, x, y, z, w );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramLocalParameterI4uivNV(RegalContext *_context, GLenum target, GLuint index, const GLuint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glProgramLocalParameterI4uivNV( _context, target, index, params );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramLocalParametersI4ivNV(RegalContext *_context, GLenum target, GLuint index, GLsizei count, const GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glProgramLocalParametersI4ivNV( _context, target, index, count, params );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramLocalParametersI4uivNV(RegalContext *_context, GLenum target, GLuint index, GLsizei count, const GLuint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreAsmProgram( _context, target );

  orig.glProgramLocalParametersI4uivNV( _context, target, index, count, params );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform1dEXT(RegalContext *_context, GLuint program, GLint location, GLdouble x)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform1d( _context, location, x );
  return;

  orig.glProgramUniform1dEXT( _context, program, location, x );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform1dvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform1dv( _context, location, count, value );
  return;

  orig.glProgramUniform1dvEXT( _context, program, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform1fEXT(RegalContext *_context, GLuint program, GLint location, GLfloat v0)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform1f( _context, location, v0 );
  return;

  orig.glProgramUniform1fEXT( _context, program, location, v0 );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform1fvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform1fv( _context, location, count, value );
  return;

  orig.glProgramUniform1fvEXT( _context, program, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform1iEXT(RegalContext *_context, GLuint program, GLint location, GLint v0)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform1i( _context, location, v0 );
  return;

  orig.glProgramUniform1iEXT( _context, program, location, v0 );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform1ivEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, const GLint *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform1iv( _context, location, count, value );
  return;

  orig.glProgramUniform1ivEXT( _context, program, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform1uiEXT(RegalContext *_context, GLuint program, GLint location, GLuint v0)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform1ui( _context, location, v0 );
  return;

  orig.glProgramUniform1uiEXT( _context, program, location, v0 );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform1uivEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, const GLuint *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform1uiv( _context, location, count, value );
  return;

  orig.glProgramUniform1uivEXT( _context, program, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform2dEXT(RegalContext *_context, GLuint program, GLint location, GLdouble x, GLdouble y)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform2d( _context, location, x, y );
  return;

  orig.glProgramUniform2dEXT( _context, program, location, x, y );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform2dvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform2dv( _context, location, count, value );
  return;

  orig.glProgramUniform2dvEXT( _context, program, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform2fEXT(RegalContext *_context, GLuint program, GLint location, GLfloat v0, GLfloat v1)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform2f( _context, location, v0, v1 );
  return;

  orig.glProgramUniform2fEXT( _context, program, location, v0, v1 );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform2fvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform2fv( _context, location, count, value );
  return;

  orig.glProgramUniform2fvEXT( _context, program, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform2iEXT(RegalContext *_context, GLuint program, GLint location, GLint v0, GLint v1)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform2i( _context, location, v0, v1 );
  return;

  orig.glProgramUniform2iEXT( _context, program, location, v0, v1 );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform2ivEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, const GLint *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform2iv( _context, location, count, value );
  return;

  orig.glProgramUniform2ivEXT( _context, program, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform2uiEXT(RegalContext *_context, GLuint program, GLint location, GLuint v0, GLuint v1)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform2ui( _context, location, v0, v1 );
  return;

  orig.glProgramUniform2uiEXT( _context, program, location, v0, v1 );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform2uivEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, const GLuint *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform2uiv( _context, location, count, value );
  return;

  orig.glProgramUniform2uivEXT( _context, program, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform3dEXT(RegalContext *_context, GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform3d( _context, location, x, y, z );
  return;

  orig.glProgramUniform3dEXT( _context, program, location, x, y, z );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform3dvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform3dv( _context, location, count, value );
  return;

  orig.glProgramUniform3dvEXT( _context, program, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform3fEXT(RegalContext *_context, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform3f( _context, location, v0, v1, v2 );
  return;

  orig.glProgramUniform3fEXT( _context, program, location, v0, v1, v2 );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform3fvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform3fv( _context, location, count, value );
  return;

  orig.glProgramUniform3fvEXT( _context, program, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform3iEXT(RegalContext *_context, GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform3i( _context, location, v0, v1, v2 );
  return;

  orig.glProgramUniform3iEXT( _context, program, location, v0, v1, v2 );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform3ivEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, const GLint *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform3iv( _context, location, count, value );
  return;

  orig.glProgramUniform3ivEXT( _context, program, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform3uiEXT(RegalContext *_context, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform3ui( _context, location, v0, v1, v2 );
  return;

  orig.glProgramUniform3uiEXT( _context, program, location, v0, v1, v2 );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform3uivEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, const GLuint *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform3uiv( _context, location, count, value );
  return;

  orig.glProgramUniform3uivEXT( _context, program, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform4dEXT(RegalContext *_context, GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform4d( _context, location, x, y, z, w );
  return;

  orig.glProgramUniform4dEXT( _context, program, location, x, y, z, w );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform4dvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform4dv( _context, location, count, value );
  return;

  orig.glProgramUniform4dvEXT( _context, program, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform4fEXT(RegalContext *_context, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform4f( _context, location, v0, v1, v2, v3 );
  return;

  orig.glProgramUniform4fEXT( _context, program, location, v0, v1, v2, v3 );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform4fvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform4fv( _context, location, count, value );
  return;

  orig.glProgramUniform4fvEXT( _context, program, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform4iEXT(RegalContext *_context, GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform4i( _context, location, v0, v1, v2, v3 );
  return;

  orig.glProgramUniform4iEXT( _context, program, location, v0, v1, v2, v3 );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform4ivEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, const GLint *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform4iv( _context, location, count, value );
  return;

  orig.glProgramUniform4ivEXT( _context, program, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform4uiEXT(RegalContext *_context, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform4ui( _context, location, v0, v1, v2, v3 );
  return;

  orig.glProgramUniform4uiEXT( _context, program, location, v0, v1, v2, v3 );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniform4uivEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, const GLuint *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniform4uiv( _context, location, count, value );
  return;

  orig.glProgramUniform4uivEXT( _context, program, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniformMatrix2dvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniformMatrix2dv( _context, location, count, transpose, value );
  return;

  orig.glProgramUniformMatrix2dvEXT( _context, program, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniformMatrix2fvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniformMatrix2fv( _context, location, count, transpose, value );
  return;

  orig.glProgramUniformMatrix2fvEXT( _context, program, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniformMatrix2x3dvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniformMatrix2x3dv( _context, location, count, transpose, value );
  return;

  orig.glProgramUniformMatrix2x3dvEXT( _context, program, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniformMatrix2x3fvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniformMatrix2x3fv( _context, location, count, transpose, value );
  return;

  orig.glProgramUniformMatrix2x3fvEXT( _context, program, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniformMatrix2x4dvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniformMatrix2x4dv( _context, location, count, transpose, value );
  return;

  orig.glProgramUniformMatrix2x4dvEXT( _context, program, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniformMatrix2x4fvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniformMatrix2x4fv( _context, location, count, transpose, value );
  return;

  orig.glProgramUniformMatrix2x4fvEXT( _context, program, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniformMatrix3dvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniformMatrix3dv( _context, location, count, transpose, value );
  return;

  orig.glProgramUniformMatrix3dvEXT( _context, program, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniformMatrix3fvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniformMatrix3fv( _context, location, count, transpose, value );
  return;

  orig.glProgramUniformMatrix3fvEXT( _context, program, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniformMatrix3x2dvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniformMatrix3x2dv( _context, location, count, transpose, value );
  return;

  orig.glProgramUniformMatrix3x2dvEXT( _context, program, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniformMatrix3x2fvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniformMatrix3x2fv( _context, location, count, transpose, value );
  return;

  orig.glProgramUniformMatrix3x2fvEXT( _context, program, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniformMatrix3x4dvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniformMatrix3x4dv( _context, location, count, transpose, value );
  return;

  orig.glProgramUniformMatrix3x4dvEXT( _context, program, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniformMatrix3x4fvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniformMatrix3x4fv( _context, location, count, transpose, value );
  return;

  orig.glProgramUniformMatrix3x4fvEXT( _context, program, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniformMatrix4dvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniformMatrix4dv( _context, location, count, transpose, value );
  return;

  orig.glProgramUniformMatrix4dvEXT( _context, program, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniformMatrix4fvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniformMatrix4fv( _context, location, count, transpose, value );
  return;

  orig.glProgramUniformMatrix4fvEXT( _context, program, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniformMatrix4x2dvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniformMatrix4x2dv( _context, location, count, transpose, value );
  return;

  orig.glProgramUniformMatrix4x2dvEXT( _context, program, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniformMatrix4x2fvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniformMatrix4x2fv( _context, location, count, transpose, value );
  return;

  orig.glProgramUniformMatrix4x2fvEXT( _context, program, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniformMatrix4x3dvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniformMatrix4x3dv( _context, location, count, transpose, value );
  return;

  orig.glProgramUniformMatrix4x3dvEXT( _context, program, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glProgramUniformMatrix4x3fvEXT(RegalContext *_context, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaGlslProgram( _context, program);
  orig.glUniformMatrix4x3fv( _context, location, count, transpose, value );
  return;

  orig.glProgramUniformMatrix4x3fvEXT( _context, program, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glPushClientAttribDefaultEXT(RegalContext *_context, GLbitfield mask)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  orig.glPushClientAttrib( _context, mask);
  _context->dsa->ClientAttribDefault(_context, mask);
  return;

  orig.glPushClientAttribDefaultEXT( _context, mask );

}

static void REGAL_CALL emuProcInterceptDsa_glPushMatrix(RegalContext *_context)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreMatrixMode( _context );

  orig.glPushMatrix( _context );

}

static void REGAL_CALL emuProcInterceptDsa_glRenderbufferStorage(RegalContext *_context, GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreRenderbuffer( _context );

  orig.glRenderbufferStorage( _context, target, internalformat, width, height );

}

static void REGAL_CALL emuProcInterceptDsa_glRenderbufferStorageEXT(RegalContext *_context, GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreRenderbuffer( _context );

  orig.glRenderbufferStorageEXT( _context, target, internalformat, width, height );

}

static void REGAL_CALL emuProcInterceptDsa_glRenderbufferStorageMultisample(RegalContext *_context, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreRenderbuffer( _context );

  orig.glRenderbufferStorageMultisample( _context, target, samples, internalformat, width, height );

}

static void REGAL_CALL emuProcInterceptDsa_glRenderbufferStorageMultisampleCoverageNV(RegalContext *_context, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreRenderbuffer( _context );

  orig.glRenderbufferStorageMultisampleCoverageNV( _context, target, coverageSamples, colorSamples, internalformat, width, height );

}

static void REGAL_CALL emuProcInterceptDsa_glRenderbufferStorageMultisampleEXT(RegalContext *_context, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreRenderbuffer( _context );

  orig.glRenderbufferStorageMultisampleEXT( _context, target, samples, internalformat, width, height );

}

static void REGAL_CALL emuProcInterceptDsa_glRotated(RegalContext *_context, GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreMatrixMode( _context );

  orig.glRotated( _context, angle, x, y, z );

}

static void REGAL_CALL emuProcInterceptDsa_glRotatef(RegalContext *_context, GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreMatrixMode( _context );

  orig.glRotatef( _context, angle, x, y, z );

}

static void REGAL_CALL emuProcInterceptDsa_glScaled(RegalContext *_context, GLdouble x, GLdouble y, GLdouble z)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreMatrixMode( _context );

  orig.glScaled( _context, x, y, z );

}

static void REGAL_CALL emuProcInterceptDsa_glScalef(RegalContext *_context, GLfloat x, GLfloat y, GLfloat z)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreMatrixMode( _context );

  orig.glScalef( _context, x, y, z );

}

static void REGAL_CALL emuProcInterceptDsa_glSecondaryColorPointer(RegalContext *_context, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreBuffer( _context );

  orig.glSecondaryColorPointer( _context, size, type, stride, pointer );

}

static void REGAL_CALL emuProcInterceptDsa_glTexBuffer(RegalContext *_context, GLenum target, GLenum internalformat, GLuint buffer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreTexture( _context );
  _context->dsa->RestoreActiveTexture( _context );

  orig.glTexBuffer( _context, target, internalformat, buffer );

}

static void REGAL_CALL emuProcInterceptDsa_glTexCoordPointer(RegalContext *_context, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreClientActiveTexture( _context );
  _context->dsa->RestoreBuffer( _context );

  orig.glTexCoordPointer( _context, size, type, stride, pointer );

}

static void REGAL_CALL emuProcInterceptDsa_glTexEnvf(RegalContext *_context, GLenum target, GLenum pname, GLfloat param)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreTexture( _context );
  _context->dsa->RestoreActiveTexture( _context );

  orig.glTexEnvf( _context, target, pname, param );

}

static void REGAL_CALL emuProcInterceptDsa_glTexEnvfv(RegalContext *_context, GLenum target, GLenum pname, const GLfloat *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreTexture( _context );
  _context->dsa->RestoreActiveTexture( _context );

  orig.glTexEnvfv( _context, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glTexEnvi(RegalContext *_context, GLenum target, GLenum pname, GLint param)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreTexture( _context );
  _context->dsa->RestoreActiveTexture( _context );

  orig.glTexEnvi( _context, target, pname, param );

}

static void REGAL_CALL emuProcInterceptDsa_glTexEnviv(RegalContext *_context, GLenum target, GLenum pname, const GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreTexture( _context );
  _context->dsa->RestoreActiveTexture( _context );

  orig.glTexEnviv( _context, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glTexGenf(RegalContext *_context, GLenum coord, GLenum pname, GLfloat param)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreActiveTexture( _context );

  orig.glTexGenf( _context, coord, pname, param );

}

static void REGAL_CALL emuProcInterceptDsa_glTexGenfv(RegalContext *_context, GLenum coord, GLenum pname, const GLfloat *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreActiveTexture( _context );

  orig.glTexGenfv( _context, coord, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glTexGeni(RegalContext *_context, GLenum coord, GLenum pname, GLint param)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreActiveTexture( _context );

  orig.glTexGeni( _context, coord, pname, param );

}

static void REGAL_CALL emuProcInterceptDsa_glTexGeniv(RegalContext *_context, GLenum coord, GLenum pname, const GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreActiveTexture( _context );

  orig.glTexGeniv( _context, coord, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glTexParameterf(RegalContext *_context, GLenum target, GLenum pname, GLfloat param)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreTexture( _context );
  _context->dsa->RestoreActiveTexture( _context );

  orig.glTexParameterf( _context, target, pname, param );

}

static void REGAL_CALL emuProcInterceptDsa_glTexParameterfv(RegalContext *_context, GLenum target, GLenum pname, const GLfloat *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreTexture( _context );
  _context->dsa->RestoreActiveTexture( _context );

  orig.glTexParameterfv( _context, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glTexParameteri(RegalContext *_context, GLenum target, GLenum pname, GLint param)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreTexture( _context );
  _context->dsa->RestoreActiveTexture( _context );

  orig.glTexParameteri( _context, target, pname, param );

}

static void REGAL_CALL emuProcInterceptDsa_glTexParameteriv(RegalContext *_context, GLenum target, GLenum pname, const GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreTexture( _context );
  _context->dsa->RestoreActiveTexture( _context );

  orig.glTexParameteriv( _context, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glTexRenderbufferNV(RegalContext *_context, GLenum target, GLuint renderbuffer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreTexture( _context );
  _context->dsa->RestoreActiveTexture( _context );

  orig.glTexRenderbufferNV( _context, target, renderbuffer );

}

static void REGAL_CALL emuProcInterceptDsa_glTextureBufferEXT(RegalContext *_context, GLuint texture, GLenum target, GLenum internalformat, GLuint buffer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glTexBuffer( _context, target, internalformat, buffer );
  return;

  orig.glTextureBufferEXT( _context, texture, target, internalformat, buffer );

}

static void REGAL_CALL emuProcInterceptDsa_glTextureImage1DEXT(RegalContext *_context, GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glTexImage1D( _context, target, level, internalformat, width, border, format, type, pixels );
  return;

  orig.glTextureImage1DEXT( _context, texture, target, level, internalformat, width, border, format, type, pixels );

}

static void REGAL_CALL emuProcInterceptDsa_glTextureImage2DEXT(RegalContext *_context, GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glTexImage2D( _context, target, level, internalformat, width, height, border, format, type, pixels );
  return;

  orig.glTextureImage2DEXT( _context, texture, target, level, internalformat, width, height, border, format, type, pixels );

}

static void REGAL_CALL emuProcInterceptDsa_glTextureImage3DEXT(RegalContext *_context, GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glTexImage3D( _context, target, level, internalformat, width, height, depth, border, format, type, pixels );
  return;

  orig.glTextureImage3DEXT( _context, texture, target, level, internalformat, width, height, depth, border, format, type, pixels );

}

static void REGAL_CALL emuProcInterceptDsa_glTextureParameterIivEXT(RegalContext *_context, GLuint texture, GLenum target, GLenum pname, const GLint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glTexParameterIiv( _context, target, pname, params );
  return;

  orig.glTextureParameterIivEXT( _context, texture, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glTextureParameterIuivEXT(RegalContext *_context, GLuint texture, GLenum target, GLenum pname, const GLuint *params)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glTexParameterIuiv( _context, target, pname, params );
  return;

  orig.glTextureParameterIuivEXT( _context, texture, target, pname, params );

}

static void REGAL_CALL emuProcInterceptDsa_glTextureParameterfEXT(RegalContext *_context, GLuint texture, GLenum target, GLenum pname, GLfloat param)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glTexParameterf( _context, target, pname, param );
  return;

  orig.glTextureParameterfEXT( _context, texture, target, pname, param );

}

static void REGAL_CALL emuProcInterceptDsa_glTextureParameterfvEXT(RegalContext *_context, GLuint texture, GLenum target, GLenum pname, const GLfloat *param)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glTexParameterfv( _context, target, pname, param );
  return;

  orig.glTextureParameterfvEXT( _context, texture, target, pname, param );

}

static void REGAL_CALL emuProcInterceptDsa_glTextureParameteriEXT(RegalContext *_context, GLuint texture, GLenum target, GLenum pname, GLint param)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glTexParameteri( _context, target, pname, param );
  return;

  orig.glTextureParameteriEXT( _context, texture, target, pname, param );

}

static void REGAL_CALL emuProcInterceptDsa_glTextureParameterivEXT(RegalContext *_context, GLuint texture, GLenum target, GLenum pname, const GLint *param)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glTexParameteriv( _context, target, pname, param );
  return;

  orig.glTextureParameterivEXT( _context, texture, target, pname, param );

}

static void REGAL_CALL emuProcInterceptDsa_glTextureRenderbufferEXT(RegalContext *_context, GLuint texture, GLenum target, GLuint renderbuffer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glTexRenderbufferNV( _context, target, renderbuffer );
  return;

  orig.glTextureRenderbufferEXT( _context, texture, target, renderbuffer );

}

static void REGAL_CALL emuProcInterceptDsa_glTextureStorage1DEXT(RegalContext *_context, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glTexStorage1D( _context, target, levels, internalformat, width );
  return;

  orig.glTextureStorage1DEXT( _context, texture, target, levels, internalformat, width );

}

static void REGAL_CALL emuProcInterceptDsa_glTextureStorage2DEXT(RegalContext *_context, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glTexStorage2D( _context, target, levels, internalformat, width, height );
  return;

  orig.glTextureStorage2DEXT( _context, texture, target, levels, internalformat, width, height );

}

static void REGAL_CALL emuProcInterceptDsa_glTextureStorage3DEXT(RegalContext *_context, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glTexStorage3D( _context, target, levels, internalformat, width, height, depth );
  return;

  orig.glTextureStorage3DEXT( _context, texture, target, levels, internalformat, width, height, depth );

}

static void REGAL_CALL emuProcInterceptDsa_glTextureSubImage1DEXT(RegalContext *_context, GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glTexSubImage1D( _context, target, level, xoffset, width, format, type, pixels );
  return;

  orig.glTextureSubImage1DEXT( _context, texture, target, level, xoffset, width, format, type, pixels );

}

static void REGAL_CALL emuProcInterceptDsa_glTextureSubImage2DEXT(RegalContext *_context, GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glTexSubImage2D( _context, target, level, xoffset, yoffset, width, height, format, type, pixels );
  return;

  orig.glTextureSubImage2DEXT( _context, texture, target, level, xoffset, yoffset, width, height, format, type, pixels );

}

static void REGAL_CALL emuProcInterceptDsa_glTextureSubImage3DEXT(RegalContext *_context, GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaTexture( _context, target, texture );
  orig.glTexSubImage3D( _context, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels );
  return;

  orig.glTextureSubImage3DEXT( _context, texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels );

}

static void REGAL_CALL emuProcInterceptDsa_glTranslated(RegalContext *_context, GLdouble x, GLdouble y, GLdouble z)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreMatrixMode( _context );

  orig.glTranslated( _context, x, y, z );

}

static void REGAL_CALL emuProcInterceptDsa_glTranslatef(RegalContext *_context, GLfloat x, GLfloat y, GLfloat z)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreMatrixMode( _context );

  orig.glTranslatef( _context, x, y, z );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform1d(RegalContext *_context, GLint location, GLdouble x)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform1d( _context, location, x );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform1dv(RegalContext *_context, GLint location, GLsizei count, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform1dv( _context, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform1f(RegalContext *_context, GLint location, GLfloat v0)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform1f( _context, location, v0 );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform1fv(RegalContext *_context, GLint location, GLsizei count, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform1fv( _context, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform1i(RegalContext *_context, GLint location, GLint v0)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform1i( _context, location, v0 );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform1iv(RegalContext *_context, GLint location, GLsizei count, const GLint *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform1iv( _context, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform1ui(RegalContext *_context, GLint location, GLuint v0)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform1ui( _context, location, v0 );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform1uiv(RegalContext *_context, GLint location, GLsizei count, const GLuint *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform1uiv( _context, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform2d(RegalContext *_context, GLint location, GLdouble x, GLdouble y)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform2d( _context, location, x, y );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform2dv(RegalContext *_context, GLint location, GLsizei count, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform2dv( _context, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform2f(RegalContext *_context, GLint location, GLfloat v0, GLfloat v1)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform2f( _context, location, v0, v1 );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform2fv(RegalContext *_context, GLint location, GLsizei count, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform2fv( _context, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform2i(RegalContext *_context, GLint location, GLint v0, GLint v1)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform2i( _context, location, v0, v1 );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform2iv(RegalContext *_context, GLint location, GLsizei count, const GLint *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform2iv( _context, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform2ui(RegalContext *_context, GLint location, GLuint v0, GLuint v1)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform2ui( _context, location, v0, v1 );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform2uiv(RegalContext *_context, GLint location, GLsizei count, const GLuint *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform2uiv( _context, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform3d(RegalContext *_context, GLint location, GLdouble x, GLdouble y, GLdouble z)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform3d( _context, location, x, y, z );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform3dv(RegalContext *_context, GLint location, GLsizei count, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform3dv( _context, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform3f(RegalContext *_context, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform3f( _context, location, v0, v1, v2 );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform3fv(RegalContext *_context, GLint location, GLsizei count, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform3fv( _context, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform3i(RegalContext *_context, GLint location, GLint v0, GLint v1, GLint v2)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform3i( _context, location, v0, v1, v2 );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform3iv(RegalContext *_context, GLint location, GLsizei count, const GLint *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform3iv( _context, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform3ui(RegalContext *_context, GLint location, GLuint v0, GLuint v1, GLuint v2)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform3ui( _context, location, v0, v1, v2 );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform3uiv(RegalContext *_context, GLint location, GLsizei count, const GLuint *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform3uiv( _context, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform4d(RegalContext *_context, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform4d( _context, location, x, y, z, w );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform4dv(RegalContext *_context, GLint location, GLsizei count, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform4dv( _context, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform4f(RegalContext *_context, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform4f( _context, location, v0, v1, v2, v3 );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform4fv(RegalContext *_context, GLint location, GLsizei count, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform4fv( _context, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform4i(RegalContext *_context, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform4i( _context, location, v0, v1, v2, v3 );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform4iv(RegalContext *_context, GLint location, GLsizei count, const GLint *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform4iv( _context, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform4ui(RegalContext *_context, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform4ui( _context, location, v0, v1, v2, v3 );

}

static void REGAL_CALL emuProcInterceptDsa_glUniform4uiv(RegalContext *_context, GLint location, GLsizei count, const GLuint *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniform4uiv( _context, location, count, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniformMatrix2dv(RegalContext *_context, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniformMatrix2dv( _context, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniformMatrix2fv(RegalContext *_context, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniformMatrix2fv( _context, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniformMatrix2x3dv(RegalContext *_context, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniformMatrix2x3dv( _context, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniformMatrix2x3fv(RegalContext *_context, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniformMatrix2x3fv( _context, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniformMatrix2x4dv(RegalContext *_context, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniformMatrix2x4dv( _context, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniformMatrix2x4fv(RegalContext *_context, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniformMatrix2x4fv( _context, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniformMatrix3dv(RegalContext *_context, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniformMatrix3dv( _context, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniformMatrix3fv(RegalContext *_context, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniformMatrix3fv( _context, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniformMatrix3x2dv(RegalContext *_context, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniformMatrix3x2dv( _context, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniformMatrix3x2fv(RegalContext *_context, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniformMatrix3x2fv( _context, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniformMatrix3x4dv(RegalContext *_context, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniformMatrix3x4dv( _context, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniformMatrix3x4fv(RegalContext *_context, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniformMatrix3x4fv( _context, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniformMatrix4dv(RegalContext *_context, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniformMatrix4dv( _context, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniformMatrix4fv(RegalContext *_context, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniformMatrix4fv( _context, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniformMatrix4x2dv(RegalContext *_context, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniformMatrix4x2dv( _context, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniformMatrix4x2fv(RegalContext *_context, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniformMatrix4x2fv( _context, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniformMatrix4x3dv(RegalContext *_context, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniformMatrix4x3dv( _context, location, count, transpose, value );

}

static void REGAL_CALL emuProcInterceptDsa_glUniformMatrix4x3fv(RegalContext *_context, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreGlslProgram( _context );

  orig.glUniformMatrix4x3fv( _context, location, count, transpose, value );

}

static GLboolean REGAL_CALL emuProcInterceptDsa_glUnmapBuffer(RegalContext *_context, GLenum target)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreBuffer( _context );

  return orig.glUnmapBuffer( _context, target );

}

static GLboolean REGAL_CALL emuProcInterceptDsa_glUnmapBufferARB(RegalContext *_context, GLenum target)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreBuffer( _context );

  return orig.glUnmapBufferARB( _context, target );

}

static GLboolean REGAL_CALL emuProcInterceptDsa_glUnmapNamedBufferEXT(RegalContext *_context, GLuint buffer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaBuffer( _context, buffer);
  return orig.glUnmapBuffer( _context, GL_ARRAY_BUFFER );

  return orig.glUnmapNamedBufferEXT( _context, buffer );

}

static void REGAL_CALL emuProcInterceptDsa_glUseProgram(RegalContext *_context, GLuint program)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  if( _context->dsa->ShadowGlslProgram( program ) ) {
    return;
  }

  orig.glUseProgram( _context, program );

}

static void REGAL_CALL emuProcInterceptDsa_glVertexArrayColorOffsetEXT(RegalContext *_context, GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, const GLintptr offset)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaVao( _context, vaobj );_context->dsa->DsaBuffer( _context, buffer );
  orig.glColorPointer( _context, size, type, stride, reinterpret_cast<const GLvoid *>(offset) );
  return;

  orig.glVertexArrayColorOffsetEXT( _context, vaobj, buffer, size, type, stride, offset );

}

static void REGAL_CALL emuProcInterceptDsa_glVertexArrayEdgeFlagOffsetEXT(RegalContext *_context, GLuint vaobj, GLuint buffer, GLsizei stride, const GLintptr offset)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaVao( _context, vaobj );_context->dsa->DsaBuffer( _context, buffer );
  orig.glEdgeFlagPointer( _context, stride, reinterpret_cast<const GLvoid *>(offset) );
  return;

  orig.glVertexArrayEdgeFlagOffsetEXT( _context, vaobj, buffer, stride, offset );

}

static void REGAL_CALL emuProcInterceptDsa_glVertexArrayFogCoordOffsetEXT(RegalContext *_context, GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, const GLintptr offset)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaVao( _context, vaobj );_context->dsa->DsaBuffer( _context, buffer );
  orig.glFogCoordPointer( _context, type, stride, reinterpret_cast<const GLvoid *>(offset) );
  return;

  orig.glVertexArrayFogCoordOffsetEXT( _context, vaobj, buffer, type, stride, offset );

}

static void REGAL_CALL emuProcInterceptDsa_glVertexArrayIndexOffsetEXT(RegalContext *_context, GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, const GLintptr offset)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaVao( _context, vaobj );_context->dsa->DsaBuffer( _context, buffer );
  orig.glIndexPointer( _context, type, stride, reinterpret_cast<const GLvoid *>(offset) );
  return;

  orig.glVertexArrayIndexOffsetEXT( _context, vaobj, buffer, type, stride, offset );

}

static void REGAL_CALL emuProcInterceptDsa_glVertexArrayMultiTexCoordOffsetEXT(RegalContext *_context, GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, const GLintptr offset)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaVao( _context, vaobj );_context->dsa->DsaBuffer( _context, buffer );
  orig.glMultiTexCoordPointerEXT( _context, texunit, size, type, stride, reinterpret_cast<const GLvoid *>(offset) );
  return;

  orig.glVertexArrayMultiTexCoordOffsetEXT( _context, vaobj, buffer, texunit, size, type, stride, offset );

}

static void REGAL_CALL emuProcInterceptDsa_glVertexArrayNormalOffsetEXT(RegalContext *_context, GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, const GLintptr offset)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaVao( _context, vaobj );_context->dsa->DsaBuffer( _context, buffer );
  orig.glNormalPointer( _context, type, stride, reinterpret_cast<const GLvoid *>(offset) );
  return;

  orig.glVertexArrayNormalOffsetEXT( _context, vaobj, buffer, type, stride, offset );

}

static void REGAL_CALL emuProcInterceptDsa_glVertexArraySecondaryColorOffsetEXT(RegalContext *_context, GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, const GLintptr offset)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaVao( _context, vaobj );_context->dsa->DsaBuffer( _context, buffer );
  orig.glSecondaryColorPointer( _context, size, type, stride, reinterpret_cast<const GLvoid *>(offset) );
  return;

  orig.glVertexArraySecondaryColorOffsetEXT( _context, vaobj, buffer, size, type, stride, offset );

}

static void REGAL_CALL emuProcInterceptDsa_glVertexArrayTexCoordOffsetEXT(RegalContext *_context, GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, const GLintptr offset)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaVao( _context, vaobj );_context->dsa->DsaBuffer( _context, buffer );
  orig.glTexCoordPointer( _context, size, type, stride, reinterpret_cast<const GLvoid *>(offset) );
  return;

  orig.glVertexArrayTexCoordOffsetEXT( _context, vaobj, buffer, size, type, stride, offset );

}

static void REGAL_CALL emuProcInterceptDsa_glVertexArrayVertexAttribIOffsetEXT(RegalContext *_context, GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, const GLintptr offset)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaVao( _context, vaobj );_context->dsa->DsaBuffer( _context, buffer );
  orig.glVertexAttribIPointer( _context, index, size, type, stride, reinterpret_cast<const GLvoid *>(offset) );
  return;

  orig.glVertexArrayVertexAttribIOffsetEXT( _context, vaobj, buffer, index, size, type, stride, offset );

}

static void REGAL_CALL emuProcInterceptDsa_glVertexArrayVertexAttribOffsetEXT(RegalContext *_context, GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLintptr offset)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaVao( _context, vaobj );_context->dsa->DsaBuffer( _context, buffer );
  orig.glVertexAttribPointer( _context, index, size, type, normalized, stride, reinterpret_cast<const GLvoid *>(offset) );
  return;

  orig.glVertexArrayVertexAttribOffsetEXT( _context, vaobj, buffer, index, size, type, normalized, stride, offset );

}

static void REGAL_CALL emuProcInterceptDsa_glVertexArrayVertexOffsetEXT(RegalContext *_context, GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, const GLintptr offset)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // impl
  _context->dsa->DsaVao( _context, vaobj );_context->dsa->DsaBuffer( _context, buffer );
  orig.glVertexPointer( _context, size, type, stride, reinterpret_cast<const GLvoid *>(offset) );
  return;

  orig.glVertexArrayVertexOffsetEXT( _context, vaobj, buffer, size, type, stride, offset );

}

static void REGAL_CALL emuProcInterceptDsa_glVertexPointer(RegalContext *_context, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
{
  RegalAssert(_context);
  EmuProcsOriginateDsa & orig = _context->dsa->orig;

  // prefix
  _context->dsa->RestoreBuffer( _context );

  orig.glVertexPointer( _context, size, type, stride, pointer );

}

void EmuProcsInterceptDsa( Dispatch::GL & dt ) {
  dt.glActiveTexture                                  = emuProcInterceptDsa_glActiveTexture;
  dt.glActiveTextureARB                               = emuProcInterceptDsa_glActiveTextureARB;
  dt.glBegin                                          = emuProcInterceptDsa_glBegin;
  dt.glBindBuffer                                     = emuProcInterceptDsa_glBindBuffer;
  dt.glBindBufferARB                                  = emuProcInterceptDsa_glBindBufferARB;
  dt.glBindFramebuffer                                = emuProcInterceptDsa_glBindFramebuffer;
  dt.glBindFramebufferEXT                             = emuProcInterceptDsa_glBindFramebufferEXT;
  dt.glBindMultiTextureEXT                            = emuProcInterceptDsa_glBindMultiTextureEXT;
  dt.glBindProgramARB                                 = emuProcInterceptDsa_glBindProgramARB;
  dt.glBindRenderbuffer                               = emuProcInterceptDsa_glBindRenderbuffer;
  dt.glBindRenderbufferEXT                            = emuProcInterceptDsa_glBindRenderbufferEXT;
  dt.glBindTexture                                    = emuProcInterceptDsa_glBindTexture;
  dt.glBindTextureEXT                                 = emuProcInterceptDsa_glBindTextureEXT;
  dt.glBindVertexArray                                = emuProcInterceptDsa_glBindVertexArray;
  dt.glBufferData                                     = emuProcInterceptDsa_glBufferData;
  dt.glBufferSubData                                  = emuProcInterceptDsa_glBufferSubData;
  dt.glCheckNamedFramebufferStatusEXT                 = emuProcInterceptDsa_glCheckNamedFramebufferStatusEXT;
  dt.glClientActiveTexture                            = emuProcInterceptDsa_glClientActiveTexture;
  dt.glClientActiveTextureARB                         = emuProcInterceptDsa_glClientActiveTextureARB;
  dt.glClientAttribDefaultEXT                         = emuProcInterceptDsa_glClientAttribDefaultEXT;
  dt.glColorPointer                                   = emuProcInterceptDsa_glColorPointer;
  dt.glCompressedMultiTexImage1DEXT                   = emuProcInterceptDsa_glCompressedMultiTexImage1DEXT;
  dt.glCompressedMultiTexImage2DEXT                   = emuProcInterceptDsa_glCompressedMultiTexImage2DEXT;
  dt.glCompressedMultiTexImage3DEXT                   = emuProcInterceptDsa_glCompressedMultiTexImage3DEXT;
  dt.glCompressedMultiTexSubImage1DEXT                = emuProcInterceptDsa_glCompressedMultiTexSubImage1DEXT;
  dt.glCompressedMultiTexSubImage2DEXT                = emuProcInterceptDsa_glCompressedMultiTexSubImage2DEXT;
  dt.glCompressedMultiTexSubImage3DEXT                = emuProcInterceptDsa_glCompressedMultiTexSubImage3DEXT;
  dt.glCompressedTextureImage1DEXT                    = emuProcInterceptDsa_glCompressedTextureImage1DEXT;
  dt.glCompressedTextureImage2DEXT                    = emuProcInterceptDsa_glCompressedTextureImage2DEXT;
  dt.glCompressedTextureImage3DEXT                    = emuProcInterceptDsa_glCompressedTextureImage3DEXT;
  dt.glCompressedTextureSubImage1DEXT                 = emuProcInterceptDsa_glCompressedTextureSubImage1DEXT;
  dt.glCompressedTextureSubImage2DEXT                 = emuProcInterceptDsa_glCompressedTextureSubImage2DEXT;
  dt.glCompressedTextureSubImage3DEXT                 = emuProcInterceptDsa_glCompressedTextureSubImage3DEXT;
  dt.glCopyBufferSubData                              = emuProcInterceptDsa_glCopyBufferSubData;
  dt.glCopyMultiTexImage1DEXT                         = emuProcInterceptDsa_glCopyMultiTexImage1DEXT;
  dt.glCopyMultiTexImage2DEXT                         = emuProcInterceptDsa_glCopyMultiTexImage2DEXT;
  dt.glCopyMultiTexSubImage1DEXT                      = emuProcInterceptDsa_glCopyMultiTexSubImage1DEXT;
  dt.glCopyMultiTexSubImage2DEXT                      = emuProcInterceptDsa_glCopyMultiTexSubImage2DEXT;
  dt.glCopyMultiTexSubImage3DEXT                      = emuProcInterceptDsa_glCopyMultiTexSubImage3DEXT;
  dt.glCopyTextureImage1DEXT                          = emuProcInterceptDsa_glCopyTextureImage1DEXT;
  dt.glCopyTextureImage2DEXT                          = emuProcInterceptDsa_glCopyTextureImage2DEXT;
  dt.glCopyTextureSubImage1DEXT                       = emuProcInterceptDsa_glCopyTextureSubImage1DEXT;
  dt.glCopyTextureSubImage2DEXT                       = emuProcInterceptDsa_glCopyTextureSubImage2DEXT;
  dt.glCopyTextureSubImage3DEXT                       = emuProcInterceptDsa_glCopyTextureSubImage3DEXT;
  dt.glDeleteBuffers                                  = emuProcInterceptDsa_glDeleteBuffers;
  dt.glDeleteBuffersARB                               = emuProcInterceptDsa_glDeleteBuffersARB;
  dt.glDeleteFramebuffers                             = emuProcInterceptDsa_glDeleteFramebuffers;
  dt.glDeleteFramebuffersEXT                          = emuProcInterceptDsa_glDeleteFramebuffersEXT;
  dt.glDeleteFramebuffersOES                          = emuProcInterceptDsa_glDeleteFramebuffersOES;
  dt.glDeleteProgram                                  = emuProcInterceptDsa_glDeleteProgram;
  dt.glDeleteProgramsARB                              = emuProcInterceptDsa_glDeleteProgramsARB;
  dt.glDeleteProgramsNV                               = emuProcInterceptDsa_glDeleteProgramsNV;
  dt.glDeleteRenderbuffers                            = emuProcInterceptDsa_glDeleteRenderbuffers;
  dt.glDeleteRenderbuffersEXT                         = emuProcInterceptDsa_glDeleteRenderbuffersEXT;
  dt.glDeleteRenderbuffersOES                         = emuProcInterceptDsa_glDeleteRenderbuffersOES;
  dt.glDeleteTextures                                 = emuProcInterceptDsa_glDeleteTextures;
  dt.glDeleteTexturesEXT                              = emuProcInterceptDsa_glDeleteTexturesEXT;
  dt.glDeleteVertexArrays                             = emuProcInterceptDsa_glDeleteVertexArrays;
  dt.glDeleteVertexArraysAPPLE                        = emuProcInterceptDsa_glDeleteVertexArraysAPPLE;
  dt.glDeleteVertexArraysOES                          = emuProcInterceptDsa_glDeleteVertexArraysOES;
  dt.glDisable                                        = emuProcInterceptDsa_glDisable;
  dt.glDisableClientState                             = emuProcInterceptDsa_glDisableClientState;
  dt.glDisableClientStateIndexedEXT                   = emuProcInterceptDsa_glDisableClientStateIndexedEXT;
  dt.glDisableClientStateiEXT                         = emuProcInterceptDsa_glDisableClientStateiEXT;
  dt.glDisableIndexedEXT                              = emuProcInterceptDsa_glDisableIndexedEXT;
  dt.glDisableVertexArrayAttribEXT                    = emuProcInterceptDsa_glDisableVertexArrayAttribEXT;
  dt.glDisableVertexArrayEXT                          = emuProcInterceptDsa_glDisableVertexArrayEXT;
  dt.glDrawArrays                                     = emuProcInterceptDsa_glDrawArrays;
  dt.glDrawArraysEXT                                  = emuProcInterceptDsa_glDrawArraysEXT;
  dt.glDrawArraysIndirect                             = emuProcInterceptDsa_glDrawArraysIndirect;
  dt.glDrawArraysInstanced                            = emuProcInterceptDsa_glDrawArraysInstanced;
  dt.glDrawArraysInstancedARB                         = emuProcInterceptDsa_glDrawArraysInstancedARB;
  dt.glDrawArraysInstancedEXT                         = emuProcInterceptDsa_glDrawArraysInstancedEXT;
  dt.glDrawElementArrayAPPLE                          = emuProcInterceptDsa_glDrawElementArrayAPPLE;
  dt.glDrawElementArrayATI                            = emuProcInterceptDsa_glDrawElementArrayATI;
  dt.glDrawElements                                   = emuProcInterceptDsa_glDrawElements;
  dt.glDrawElementsBaseVertex                         = emuProcInterceptDsa_glDrawElementsBaseVertex;
  dt.glDrawElementsIndirect                           = emuProcInterceptDsa_glDrawElementsIndirect;
  dt.glDrawElementsInstanced                          = emuProcInterceptDsa_glDrawElementsInstanced;
  dt.glDrawElementsInstancedARB                       = emuProcInterceptDsa_glDrawElementsInstancedARB;
  dt.glDrawElementsInstancedBaseVertex                = emuProcInterceptDsa_glDrawElementsInstancedBaseVertex;
  dt.glDrawElementsInstancedEXT                       = emuProcInterceptDsa_glDrawElementsInstancedEXT;
  dt.glEnable                                         = emuProcInterceptDsa_glEnable;
  dt.glEnableClientState                              = emuProcInterceptDsa_glEnableClientState;
  dt.glEnableClientStateIndexedEXT                    = emuProcInterceptDsa_glEnableClientStateIndexedEXT;
  dt.glEnableClientStateiEXT                          = emuProcInterceptDsa_glEnableClientStateiEXT;
  dt.glEnableIndexedEXT                               = emuProcInterceptDsa_glEnableIndexedEXT;
  dt.glEnableVertexArrayAttribEXT                     = emuProcInterceptDsa_glEnableVertexArrayAttribEXT;
  dt.glEnableVertexArrayEXT                           = emuProcInterceptDsa_glEnableVertexArrayEXT;
  dt.glFlushMappedBufferRange                         = emuProcInterceptDsa_glFlushMappedBufferRange;
  dt.glFlushMappedBufferRangeEXT                      = emuProcInterceptDsa_glFlushMappedBufferRangeEXT;
  dt.glFlushMappedNamedBufferRangeEXT                 = emuProcInterceptDsa_glFlushMappedNamedBufferRangeEXT;
  dt.glFramebufferDrawBufferEXT                       = emuProcInterceptDsa_glFramebufferDrawBufferEXT;
  dt.glFramebufferDrawBuffersEXT                      = emuProcInterceptDsa_glFramebufferDrawBuffersEXT;
  dt.glFramebufferReadBufferEXT                       = emuProcInterceptDsa_glFramebufferReadBufferEXT;
  dt.glFramebufferRenderbuffer                        = emuProcInterceptDsa_glFramebufferRenderbuffer;
  dt.glFramebufferRenderbufferEXT                     = emuProcInterceptDsa_glFramebufferRenderbufferEXT;
  dt.glFramebufferTexture                             = emuProcInterceptDsa_glFramebufferTexture;
  dt.glFramebufferTexture1D                           = emuProcInterceptDsa_glFramebufferTexture1D;
  dt.glFramebufferTexture1DEXT                        = emuProcInterceptDsa_glFramebufferTexture1DEXT;
  dt.glFramebufferTexture2D                           = emuProcInterceptDsa_glFramebufferTexture2D;
  dt.glFramebufferTexture2DEXT                        = emuProcInterceptDsa_glFramebufferTexture2DEXT;
  dt.glFramebufferTexture3D                           = emuProcInterceptDsa_glFramebufferTexture3D;
  dt.glFramebufferTexture3DEXT                        = emuProcInterceptDsa_glFramebufferTexture3DEXT;
  dt.glFramebufferTextureARB                          = emuProcInterceptDsa_glFramebufferTextureARB;
  dt.glFramebufferTextureEXT                          = emuProcInterceptDsa_glFramebufferTextureEXT;
  dt.glFramebufferTextureFace                         = emuProcInterceptDsa_glFramebufferTextureFace;
  dt.glFramebufferTextureFaceARB                      = emuProcInterceptDsa_glFramebufferTextureFaceARB;
  dt.glFramebufferTextureFaceEXT                      = emuProcInterceptDsa_glFramebufferTextureFaceEXT;
  dt.glFramebufferTextureLayer                        = emuProcInterceptDsa_glFramebufferTextureLayer;
  dt.glFramebufferTextureLayerARB                     = emuProcInterceptDsa_glFramebufferTextureLayerARB;
  dt.glFramebufferTextureLayerEXT                     = emuProcInterceptDsa_glFramebufferTextureLayerEXT;
  dt.glGenerateMipmap                                 = emuProcInterceptDsa_glGenerateMipmap;
  dt.glGenerateMipmapEXT                              = emuProcInterceptDsa_glGenerateMipmapEXT;
  dt.glGenerateMultiTexMipmapEXT                      = emuProcInterceptDsa_glGenerateMultiTexMipmapEXT;
  dt.glGenerateTextureMipmapEXT                       = emuProcInterceptDsa_glGenerateTextureMipmapEXT;
  dt.glGetBooleanv                                    = emuProcInterceptDsa_glGetBooleanv;
  dt.glGetBufferParameteriv                           = emuProcInterceptDsa_glGetBufferParameteriv;
  dt.glGetBufferPointerv                              = emuProcInterceptDsa_glGetBufferPointerv;
  dt.glGetBufferSubData                               = emuProcInterceptDsa_glGetBufferSubData;
  dt.glGetCompressedMultiTexImageEXT                  = emuProcInterceptDsa_glGetCompressedMultiTexImageEXT;
  dt.glGetCompressedTextureImageEXT                   = emuProcInterceptDsa_glGetCompressedTextureImageEXT;
  dt.glGetDoubleIndexedvEXT                           = emuProcInterceptDsa_glGetDoubleIndexedvEXT;
  dt.glGetDoublei_v                                   = emuProcInterceptDsa_glGetDoublei_v;
  dt.glGetDoublei_vEXT                                = emuProcInterceptDsa_glGetDoublei_vEXT;
  dt.glGetDoublev                                     = emuProcInterceptDsa_glGetDoublev;
  dt.glGetFloatIndexedvEXT                            = emuProcInterceptDsa_glGetFloatIndexedvEXT;
  dt.glGetFloati_v                                    = emuProcInterceptDsa_glGetFloati_v;
  dt.glGetFloati_vEXT                                 = emuProcInterceptDsa_glGetFloati_vEXT;
  dt.glGetFloatv                                      = emuProcInterceptDsa_glGetFloatv;
  dt.glGetFramebufferParameterivEXT                   = emuProcInterceptDsa_glGetFramebufferParameterivEXT;
  dt.glGetIntegerv                                    = emuProcInterceptDsa_glGetIntegerv;
  dt.glGetMultiTexEnvfvEXT                            = emuProcInterceptDsa_glGetMultiTexEnvfvEXT;
  dt.glGetMultiTexEnvivEXT                            = emuProcInterceptDsa_glGetMultiTexEnvivEXT;
  dt.glGetMultiTexGendvEXT                            = emuProcInterceptDsa_glGetMultiTexGendvEXT;
  dt.glGetMultiTexGenfvEXT                            = emuProcInterceptDsa_glGetMultiTexGenfvEXT;
  dt.glGetMultiTexGenivEXT                            = emuProcInterceptDsa_glGetMultiTexGenivEXT;
  dt.glGetMultiTexImageEXT                            = emuProcInterceptDsa_glGetMultiTexImageEXT;
  dt.glGetMultiTexLevelParameterfvEXT                 = emuProcInterceptDsa_glGetMultiTexLevelParameterfvEXT;
  dt.glGetMultiTexLevelParameterivEXT                 = emuProcInterceptDsa_glGetMultiTexLevelParameterivEXT;
  dt.glGetMultiTexParameterIivEXT                     = emuProcInterceptDsa_glGetMultiTexParameterIivEXT;
  dt.glGetMultiTexParameterIuivEXT                    = emuProcInterceptDsa_glGetMultiTexParameterIuivEXT;
  dt.glGetMultiTexParameterfvEXT                      = emuProcInterceptDsa_glGetMultiTexParameterfvEXT;
  dt.glGetMultiTexParameterivEXT                      = emuProcInterceptDsa_glGetMultiTexParameterivEXT;
  dt.glGetNamedBufferParameterivEXT                   = emuProcInterceptDsa_glGetNamedBufferParameterivEXT;
  dt.glGetNamedBufferPointervEXT                      = emuProcInterceptDsa_glGetNamedBufferPointervEXT;
  dt.glGetNamedBufferSubDataEXT                       = emuProcInterceptDsa_glGetNamedBufferSubDataEXT;
  dt.glGetNamedFramebufferAttachmentParameterivEXT    = emuProcInterceptDsa_glGetNamedFramebufferAttachmentParameterivEXT;
  dt.glGetNamedProgramLocalParameterIivEXT            = emuProcInterceptDsa_glGetNamedProgramLocalParameterIivEXT;
  dt.glGetNamedProgramLocalParameterIuivEXT           = emuProcInterceptDsa_glGetNamedProgramLocalParameterIuivEXT;
  dt.glGetNamedProgramLocalParameterdvEXT             = emuProcInterceptDsa_glGetNamedProgramLocalParameterdvEXT;
  dt.glGetNamedProgramLocalParameterfvEXT             = emuProcInterceptDsa_glGetNamedProgramLocalParameterfvEXT;
  dt.glGetNamedProgramStringEXT                       = emuProcInterceptDsa_glGetNamedProgramStringEXT;
  dt.glGetNamedProgramivEXT                           = emuProcInterceptDsa_glGetNamedProgramivEXT;
  dt.glGetNamedRenderbufferParameterivEXT             = emuProcInterceptDsa_glGetNamedRenderbufferParameterivEXT;
  dt.glGetPointerIndexedvEXT                          = emuProcInterceptDsa_glGetPointerIndexedvEXT;
  dt.glGetProgramEnvParameterIivNV                    = emuProcInterceptDsa_glGetProgramEnvParameterIivNV;
  dt.glGetProgramEnvParameterIuivNV                   = emuProcInterceptDsa_glGetProgramEnvParameterIuivNV;
  dt.glGetProgramEnvParameterdvARB                    = emuProcInterceptDsa_glGetProgramEnvParameterdvARB;
  dt.glGetProgramEnvParameterfvARB                    = emuProcInterceptDsa_glGetProgramEnvParameterfvARB;
  dt.glGetProgramLocalParameterIivNV                  = emuProcInterceptDsa_glGetProgramLocalParameterIivNV;
  dt.glGetProgramLocalParameterIuivNV                 = emuProcInterceptDsa_glGetProgramLocalParameterIuivNV;
  dt.glGetProgramLocalParameterdvARB                  = emuProcInterceptDsa_glGetProgramLocalParameterdvARB;
  dt.glGetProgramLocalParameterfvARB                  = emuProcInterceptDsa_glGetProgramLocalParameterfvARB;
  dt.glGetRenderbufferParameteriv                     = emuProcInterceptDsa_glGetRenderbufferParameteriv;
  dt.glGetRenderbufferParameterivEXT                  = emuProcInterceptDsa_glGetRenderbufferParameterivEXT;
  dt.glGetTexEnvfv                                    = emuProcInterceptDsa_glGetTexEnvfv;
  dt.glGetTexEnviv                                    = emuProcInterceptDsa_glGetTexEnviv;
  dt.glGetTexParameterfv                              = emuProcInterceptDsa_glGetTexParameterfv;
  dt.glGetTexParameteriv                              = emuProcInterceptDsa_glGetTexParameteriv;
  dt.glGetTextureImageEXT                             = emuProcInterceptDsa_glGetTextureImageEXT;
  dt.glGetTextureLevelParameterfvEXT                  = emuProcInterceptDsa_glGetTextureLevelParameterfvEXT;
  dt.glGetTextureLevelParameterivEXT                  = emuProcInterceptDsa_glGetTextureLevelParameterivEXT;
  dt.glGetTextureParameterIivEXT                      = emuProcInterceptDsa_glGetTextureParameterIivEXT;
  dt.glGetTextureParameterIuivEXT                     = emuProcInterceptDsa_glGetTextureParameterIuivEXT;
  dt.glGetTextureParameterfvEXT                       = emuProcInterceptDsa_glGetTextureParameterfvEXT;
  dt.glGetTextureParameterivEXT                       = emuProcInterceptDsa_glGetTextureParameterivEXT;
  dt.glIsEnabled                                      = emuProcInterceptDsa_glIsEnabled;
  dt.glIsEnabledIndexedEXT                            = emuProcInterceptDsa_glIsEnabledIndexedEXT;
  dt.glLoadIdentity                                   = emuProcInterceptDsa_glLoadIdentity;
  dt.glLoadMatrixd                                    = emuProcInterceptDsa_glLoadMatrixd;
  dt.glLoadMatrixf                                    = emuProcInterceptDsa_glLoadMatrixf;
  dt.glLoadTransposeMatrixd                           = emuProcInterceptDsa_glLoadTransposeMatrixd;
  dt.glLoadTransposeMatrixf                           = emuProcInterceptDsa_glLoadTransposeMatrixf;
  dt.glMapBuffer                                      = emuProcInterceptDsa_glMapBuffer;
  dt.glMapBufferARB                                   = emuProcInterceptDsa_glMapBufferARB;
  dt.glMapBufferRange                                 = emuProcInterceptDsa_glMapBufferRange;
  dt.glMapBufferRangeEXT                              = emuProcInterceptDsa_glMapBufferRangeEXT;
  dt.glMapNamedBufferEXT                              = emuProcInterceptDsa_glMapNamedBufferEXT;
  dt.glMapNamedBufferRangeEXT                         = emuProcInterceptDsa_glMapNamedBufferRangeEXT;
  dt.glMatrixFrustumEXT                               = emuProcInterceptDsa_glMatrixFrustumEXT;
  dt.glMatrixLoadIdentityEXT                          = emuProcInterceptDsa_glMatrixLoadIdentityEXT;
  dt.glMatrixLoadTransposedEXT                        = emuProcInterceptDsa_glMatrixLoadTransposedEXT;
  dt.glMatrixLoadTransposefEXT                        = emuProcInterceptDsa_glMatrixLoadTransposefEXT;
  dt.glMatrixLoaddEXT                                 = emuProcInterceptDsa_glMatrixLoaddEXT;
  dt.glMatrixLoadfEXT                                 = emuProcInterceptDsa_glMatrixLoadfEXT;
  dt.glMatrixMode                                     = emuProcInterceptDsa_glMatrixMode;
  dt.glMatrixMultTransposedEXT                        = emuProcInterceptDsa_glMatrixMultTransposedEXT;
  dt.glMatrixMultTransposefEXT                        = emuProcInterceptDsa_glMatrixMultTransposefEXT;
  dt.glMatrixMultdEXT                                 = emuProcInterceptDsa_glMatrixMultdEXT;
  dt.glMatrixMultfEXT                                 = emuProcInterceptDsa_glMatrixMultfEXT;
  dt.glMatrixOrthoEXT                                 = emuProcInterceptDsa_glMatrixOrthoEXT;
  dt.glMatrixPopEXT                                   = emuProcInterceptDsa_glMatrixPopEXT;
  dt.glMatrixPushEXT                                  = emuProcInterceptDsa_glMatrixPushEXT;
  dt.glMatrixRotatedEXT                               = emuProcInterceptDsa_glMatrixRotatedEXT;
  dt.glMatrixRotatefEXT                               = emuProcInterceptDsa_glMatrixRotatefEXT;
  dt.glMatrixScaledEXT                                = emuProcInterceptDsa_glMatrixScaledEXT;
  dt.glMatrixScalefEXT                                = emuProcInterceptDsa_glMatrixScalefEXT;
  dt.glMatrixTranslatedEXT                            = emuProcInterceptDsa_glMatrixTranslatedEXT;
  dt.glMatrixTranslatefEXT                            = emuProcInterceptDsa_glMatrixTranslatefEXT;
  dt.glMultMatrixd                                    = emuProcInterceptDsa_glMultMatrixd;
  dt.glMultMatrixf                                    = emuProcInterceptDsa_glMultMatrixf;
  dt.glMultTransposeMatrixd                           = emuProcInterceptDsa_glMultTransposeMatrixd;
  dt.glMultTransposeMatrixf                           = emuProcInterceptDsa_glMultTransposeMatrixf;
  dt.glMultiDrawArrays                                = emuProcInterceptDsa_glMultiDrawArrays;
  dt.glMultiDrawArraysEXT                             = emuProcInterceptDsa_glMultiDrawArraysEXT;
  dt.glMultiDrawArraysIndirect                        = emuProcInterceptDsa_glMultiDrawArraysIndirect;
  dt.glMultiDrawArraysIndirectAMD                     = emuProcInterceptDsa_glMultiDrawArraysIndirectAMD;
  dt.glMultiDrawElementArrayAPPLE                     = emuProcInterceptDsa_glMultiDrawElementArrayAPPLE;
  dt.glMultiDrawElements                              = emuProcInterceptDsa_glMultiDrawElements;
  dt.glMultiDrawElementsBaseVertex                    = emuProcInterceptDsa_glMultiDrawElementsBaseVertex;
  dt.glMultiDrawElementsEXT                           = emuProcInterceptDsa_glMultiDrawElementsEXT;
  dt.glMultiDrawElementsIndirect                      = emuProcInterceptDsa_glMultiDrawElementsIndirect;
  dt.glMultiDrawElementsIndirectAMD                   = emuProcInterceptDsa_glMultiDrawElementsIndirectAMD;
  dt.glMultiTexBufferEXT                              = emuProcInterceptDsa_glMultiTexBufferEXT;
  dt.glMultiTexCoordPointerEXT                        = emuProcInterceptDsa_glMultiTexCoordPointerEXT;
  dt.glMultiTexEnvfEXT                                = emuProcInterceptDsa_glMultiTexEnvfEXT;
  dt.glMultiTexEnvfvEXT                               = emuProcInterceptDsa_glMultiTexEnvfvEXT;
  dt.glMultiTexEnviEXT                                = emuProcInterceptDsa_glMultiTexEnviEXT;
  dt.glMultiTexEnvivEXT                               = emuProcInterceptDsa_glMultiTexEnvivEXT;
  dt.glMultiTexGendEXT                                = emuProcInterceptDsa_glMultiTexGendEXT;
  dt.glMultiTexGendvEXT                               = emuProcInterceptDsa_glMultiTexGendvEXT;
  dt.glMultiTexGenfEXT                                = emuProcInterceptDsa_glMultiTexGenfEXT;
  dt.glMultiTexGenfvEXT                               = emuProcInterceptDsa_glMultiTexGenfvEXT;
  dt.glMultiTexGeniEXT                                = emuProcInterceptDsa_glMultiTexGeniEXT;
  dt.glMultiTexGenivEXT                               = emuProcInterceptDsa_glMultiTexGenivEXT;
  dt.glMultiTexImage1DEXT                             = emuProcInterceptDsa_glMultiTexImage1DEXT;
  dt.glMultiTexImage2DEXT                             = emuProcInterceptDsa_glMultiTexImage2DEXT;
  dt.glMultiTexImage3DEXT                             = emuProcInterceptDsa_glMultiTexImage3DEXT;
  dt.glMultiTexParameterIivEXT                        = emuProcInterceptDsa_glMultiTexParameterIivEXT;
  dt.glMultiTexParameterIuivEXT                       = emuProcInterceptDsa_glMultiTexParameterIuivEXT;
  dt.glMultiTexParameterfEXT                          = emuProcInterceptDsa_glMultiTexParameterfEXT;
  dt.glMultiTexParameterfvEXT                         = emuProcInterceptDsa_glMultiTexParameterfvEXT;
  dt.glMultiTexParameteriEXT                          = emuProcInterceptDsa_glMultiTexParameteriEXT;
  dt.glMultiTexParameterivEXT                         = emuProcInterceptDsa_glMultiTexParameterivEXT;
  dt.glMultiTexRenderbufferEXT                        = emuProcInterceptDsa_glMultiTexRenderbufferEXT;
  dt.glMultiTexSubImage1DEXT                          = emuProcInterceptDsa_glMultiTexSubImage1DEXT;
  dt.glMultiTexSubImage2DEXT                          = emuProcInterceptDsa_glMultiTexSubImage2DEXT;
  dt.glMultiTexSubImage3DEXT                          = emuProcInterceptDsa_glMultiTexSubImage3DEXT;
  dt.glNamedBufferDataEXT                             = emuProcInterceptDsa_glNamedBufferDataEXT;
  dt.glNamedBufferSubDataEXT                          = emuProcInterceptDsa_glNamedBufferSubDataEXT;
  dt.glNamedCopyBufferSubDataEXT                      = emuProcInterceptDsa_glNamedCopyBufferSubDataEXT;
  dt.glNamedFramebufferRenderbufferEXT                = emuProcInterceptDsa_glNamedFramebufferRenderbufferEXT;
  dt.glNamedFramebufferTexture1DEXT                   = emuProcInterceptDsa_glNamedFramebufferTexture1DEXT;
  dt.glNamedFramebufferTexture2DEXT                   = emuProcInterceptDsa_glNamedFramebufferTexture2DEXT;
  dt.glNamedFramebufferTexture3DEXT                   = emuProcInterceptDsa_glNamedFramebufferTexture3DEXT;
  dt.glNamedFramebufferTextureEXT                     = emuProcInterceptDsa_glNamedFramebufferTextureEXT;
  dt.glNamedFramebufferTextureFaceEXT                 = emuProcInterceptDsa_glNamedFramebufferTextureFaceEXT;
  dt.glNamedFramebufferTextureLayerEXT                = emuProcInterceptDsa_glNamedFramebufferTextureLayerEXT;
  dt.glNamedProgramLocalParameter4dEXT                = emuProcInterceptDsa_glNamedProgramLocalParameter4dEXT;
  dt.glNamedProgramLocalParameter4dvEXT               = emuProcInterceptDsa_glNamedProgramLocalParameter4dvEXT;
  dt.glNamedProgramLocalParameter4fEXT                = emuProcInterceptDsa_glNamedProgramLocalParameter4fEXT;
  dt.glNamedProgramLocalParameter4fvEXT               = emuProcInterceptDsa_glNamedProgramLocalParameter4fvEXT;
  dt.glNamedProgramLocalParameterI4iEXT               = emuProcInterceptDsa_glNamedProgramLocalParameterI4iEXT;
  dt.glNamedProgramLocalParameterI4ivEXT              = emuProcInterceptDsa_glNamedProgramLocalParameterI4ivEXT;
  dt.glNamedProgramLocalParameterI4uiEXT              = emuProcInterceptDsa_glNamedProgramLocalParameterI4uiEXT;
  dt.glNamedProgramLocalParameterI4uivEXT             = emuProcInterceptDsa_glNamedProgramLocalParameterI4uivEXT;
  dt.glNamedProgramLocalParameters4fvEXT              = emuProcInterceptDsa_glNamedProgramLocalParameters4fvEXT;
  dt.glNamedProgramLocalParametersI4ivEXT             = emuProcInterceptDsa_glNamedProgramLocalParametersI4ivEXT;
  dt.glNamedProgramLocalParametersI4uivEXT            = emuProcInterceptDsa_glNamedProgramLocalParametersI4uivEXT;
  dt.glNamedProgramStringEXT                          = emuProcInterceptDsa_glNamedProgramStringEXT;
  dt.glNamedRenderbufferStorageEXT                    = emuProcInterceptDsa_glNamedRenderbufferStorageEXT;
  dt.glNamedRenderbufferStorageMultisampleCoverageEXT = emuProcInterceptDsa_glNamedRenderbufferStorageMultisampleCoverageEXT;
  dt.glNamedRenderbufferStorageMultisampleEXT         = emuProcInterceptDsa_glNamedRenderbufferStorageMultisampleEXT;
  dt.glNormalPointer                                  = emuProcInterceptDsa_glNormalPointer;
  dt.glPopMatrix                                      = emuProcInterceptDsa_glPopMatrix;
  dt.glProgramEnvParameter4dARB                       = emuProcInterceptDsa_glProgramEnvParameter4dARB;
  dt.glProgramEnvParameter4dvARB                      = emuProcInterceptDsa_glProgramEnvParameter4dvARB;
  dt.glProgramEnvParameter4fARB                       = emuProcInterceptDsa_glProgramEnvParameter4fARB;
  dt.glProgramEnvParameter4fvARB                      = emuProcInterceptDsa_glProgramEnvParameter4fvARB;
  dt.glProgramEnvParameterI4iNV                       = emuProcInterceptDsa_glProgramEnvParameterI4iNV;
  dt.glProgramEnvParameterI4ivNV                      = emuProcInterceptDsa_glProgramEnvParameterI4ivNV;
  dt.glProgramEnvParameterI4uiNV                      = emuProcInterceptDsa_glProgramEnvParameterI4uiNV;
  dt.glProgramEnvParameterI4uivNV                     = emuProcInterceptDsa_glProgramEnvParameterI4uivNV;
  dt.glProgramEnvParametersI4ivNV                     = emuProcInterceptDsa_glProgramEnvParametersI4ivNV;
  dt.glProgramEnvParametersI4uivNV                    = emuProcInterceptDsa_glProgramEnvParametersI4uivNV;
  dt.glProgramLocalParameter4dARB                     = emuProcInterceptDsa_glProgramLocalParameter4dARB;
  dt.glProgramLocalParameter4dvARB                    = emuProcInterceptDsa_glProgramLocalParameter4dvARB;
  dt.glProgramLocalParameter4fARB                     = emuProcInterceptDsa_glProgramLocalParameter4fARB;
  dt.glProgramLocalParameter4fvARB                    = emuProcInterceptDsa_glProgramLocalParameter4fvARB;
  dt.glProgramLocalParameterI4iNV                     = emuProcInterceptDsa_glProgramLocalParameterI4iNV;
  dt.glProgramLocalParameterI4ivNV                    = emuProcInterceptDsa_glProgramLocalParameterI4ivNV;
  dt.glProgramLocalParameterI4uiNV                    = emuProcInterceptDsa_glProgramLocalParameterI4uiNV;
  dt.glProgramLocalParameterI4uivNV                   = emuProcInterceptDsa_glProgramLocalParameterI4uivNV;
  dt.glProgramLocalParametersI4ivNV                   = emuProcInterceptDsa_glProgramLocalParametersI4ivNV;
  dt.glProgramLocalParametersI4uivNV                  = emuProcInterceptDsa_glProgramLocalParametersI4uivNV;
  dt.glProgramUniform1dEXT                            = emuProcInterceptDsa_glProgramUniform1dEXT;
  dt.glProgramUniform1dvEXT                           = emuProcInterceptDsa_glProgramUniform1dvEXT;
  dt.glProgramUniform1fEXT                            = emuProcInterceptDsa_glProgramUniform1fEXT;
  dt.glProgramUniform1fvEXT                           = emuProcInterceptDsa_glProgramUniform1fvEXT;
  dt.glProgramUniform1iEXT                            = emuProcInterceptDsa_glProgramUniform1iEXT;
  dt.glProgramUniform1ivEXT                           = emuProcInterceptDsa_glProgramUniform1ivEXT;
  dt.glProgramUniform1uiEXT                           = emuProcInterceptDsa_glProgramUniform1uiEXT;
  dt.glProgramUniform1uivEXT                          = emuProcInterceptDsa_glProgramUniform1uivEXT;
  dt.glProgramUniform2dEXT                            = emuProcInterceptDsa_glProgramUniform2dEXT;
  dt.glProgramUniform2dvEXT                           = emuProcInterceptDsa_glProgramUniform2dvEXT;
  dt.glProgramUniform2fEXT                            = emuProcInterceptDsa_glProgramUniform2fEXT;
  dt.glProgramUniform2fvEXT                           = emuProcInterceptDsa_glProgramUniform2fvEXT;
  dt.glProgramUniform2iEXT                            = emuProcInterceptDsa_glProgramUniform2iEXT;
  dt.glProgramUniform2ivEXT                           = emuProcInterceptDsa_glProgramUniform2ivEXT;
  dt.glProgramUniform2uiEXT                           = emuProcInterceptDsa_glProgramUniform2uiEXT;
  dt.glProgramUniform2uivEXT                          = emuProcInterceptDsa_glProgramUniform2uivEXT;
  dt.glProgramUniform3dEXT                            = emuProcInterceptDsa_glProgramUniform3dEXT;
  dt.glProgramUniform3dvEXT                           = emuProcInterceptDsa_glProgramUniform3dvEXT;
  dt.glProgramUniform3fEXT                            = emuProcInterceptDsa_glProgramUniform3fEXT;
  dt.glProgramUniform3fvEXT                           = emuProcInterceptDsa_glProgramUniform3fvEXT;
  dt.glProgramUniform3iEXT                            = emuProcInterceptDsa_glProgramUniform3iEXT;
  dt.glProgramUniform3ivEXT                           = emuProcInterceptDsa_glProgramUniform3ivEXT;
  dt.glProgramUniform3uiEXT                           = emuProcInterceptDsa_glProgramUniform3uiEXT;
  dt.glProgramUniform3uivEXT                          = emuProcInterceptDsa_glProgramUniform3uivEXT;
  dt.glProgramUniform4dEXT                            = emuProcInterceptDsa_glProgramUniform4dEXT;
  dt.glProgramUniform4dvEXT                           = emuProcInterceptDsa_glProgramUniform4dvEXT;
  dt.glProgramUniform4fEXT                            = emuProcInterceptDsa_glProgramUniform4fEXT;
  dt.glProgramUniform4fvEXT                           = emuProcInterceptDsa_glProgramUniform4fvEXT;
  dt.glProgramUniform4iEXT                            = emuProcInterceptDsa_glProgramUniform4iEXT;
  dt.glProgramUniform4ivEXT                           = emuProcInterceptDsa_glProgramUniform4ivEXT;
  dt.glProgramUniform4uiEXT                           = emuProcInterceptDsa_glProgramUniform4uiEXT;
  dt.glProgramUniform4uivEXT                          = emuProcInterceptDsa_glProgramUniform4uivEXT;
  dt.glProgramUniformMatrix2dvEXT                     = emuProcInterceptDsa_glProgramUniformMatrix2dvEXT;
  dt.glProgramUniformMatrix2fvEXT                     = emuProcInterceptDsa_glProgramUniformMatrix2fvEXT;
  dt.glProgramUniformMatrix2x3dvEXT                   = emuProcInterceptDsa_glProgramUniformMatrix2x3dvEXT;
  dt.glProgramUniformMatrix2x3fvEXT                   = emuProcInterceptDsa_glProgramUniformMatrix2x3fvEXT;
  dt.glProgramUniformMatrix2x4dvEXT                   = emuProcInterceptDsa_glProgramUniformMatrix2x4dvEXT;
  dt.glProgramUniformMatrix2x4fvEXT                   = emuProcInterceptDsa_glProgramUniformMatrix2x4fvEXT;
  dt.glProgramUniformMatrix3dvEXT                     = emuProcInterceptDsa_glProgramUniformMatrix3dvEXT;
  dt.glProgramUniformMatrix3fvEXT                     = emuProcInterceptDsa_glProgramUniformMatrix3fvEXT;
  dt.glProgramUniformMatrix3x2dvEXT                   = emuProcInterceptDsa_glProgramUniformMatrix3x2dvEXT;
  dt.glProgramUniformMatrix3x2fvEXT                   = emuProcInterceptDsa_glProgramUniformMatrix3x2fvEXT;
  dt.glProgramUniformMatrix3x4dvEXT                   = emuProcInterceptDsa_glProgramUniformMatrix3x4dvEXT;
  dt.glProgramUniformMatrix3x4fvEXT                   = emuProcInterceptDsa_glProgramUniformMatrix3x4fvEXT;
  dt.glProgramUniformMatrix4dvEXT                     = emuProcInterceptDsa_glProgramUniformMatrix4dvEXT;
  dt.glProgramUniformMatrix4fvEXT                     = emuProcInterceptDsa_glProgramUniformMatrix4fvEXT;
  dt.glProgramUniformMatrix4x2dvEXT                   = emuProcInterceptDsa_glProgramUniformMatrix4x2dvEXT;
  dt.glProgramUniformMatrix4x2fvEXT                   = emuProcInterceptDsa_glProgramUniformMatrix4x2fvEXT;
  dt.glProgramUniformMatrix4x3dvEXT                   = emuProcInterceptDsa_glProgramUniformMatrix4x3dvEXT;
  dt.glProgramUniformMatrix4x3fvEXT                   = emuProcInterceptDsa_glProgramUniformMatrix4x3fvEXT;
  dt.glPushClientAttribDefaultEXT                     = emuProcInterceptDsa_glPushClientAttribDefaultEXT;
  dt.glPushMatrix                                     = emuProcInterceptDsa_glPushMatrix;
  dt.glRenderbufferStorage                            = emuProcInterceptDsa_glRenderbufferStorage;
  dt.glRenderbufferStorageEXT                         = emuProcInterceptDsa_glRenderbufferStorageEXT;
  dt.glRenderbufferStorageMultisample                 = emuProcInterceptDsa_glRenderbufferStorageMultisample;
  dt.glRenderbufferStorageMultisampleCoverageNV       = emuProcInterceptDsa_glRenderbufferStorageMultisampleCoverageNV;
  dt.glRenderbufferStorageMultisampleEXT              = emuProcInterceptDsa_glRenderbufferStorageMultisampleEXT;
  dt.glRotated                                        = emuProcInterceptDsa_glRotated;
  dt.glRotatef                                        = emuProcInterceptDsa_glRotatef;
  dt.glScaled                                         = emuProcInterceptDsa_glScaled;
  dt.glScalef                                         = emuProcInterceptDsa_glScalef;
  dt.glSecondaryColorPointer                          = emuProcInterceptDsa_glSecondaryColorPointer;
  dt.glTexBuffer                                      = emuProcInterceptDsa_glTexBuffer;
  dt.glTexCoordPointer                                = emuProcInterceptDsa_glTexCoordPointer;
  dt.glTexEnvf                                        = emuProcInterceptDsa_glTexEnvf;
  dt.glTexEnvfv                                       = emuProcInterceptDsa_glTexEnvfv;
  dt.glTexEnvi                                        = emuProcInterceptDsa_glTexEnvi;
  dt.glTexEnviv                                       = emuProcInterceptDsa_glTexEnviv;
  dt.glTexGenf                                        = emuProcInterceptDsa_glTexGenf;
  dt.glTexGenfv                                       = emuProcInterceptDsa_glTexGenfv;
  dt.glTexGeni                                        = emuProcInterceptDsa_glTexGeni;
  dt.glTexGeniv                                       = emuProcInterceptDsa_glTexGeniv;
  dt.glTexParameterf                                  = emuProcInterceptDsa_glTexParameterf;
  dt.glTexParameterfv                                 = emuProcInterceptDsa_glTexParameterfv;
  dt.glTexParameteri                                  = emuProcInterceptDsa_glTexParameteri;
  dt.glTexParameteriv                                 = emuProcInterceptDsa_glTexParameteriv;
  dt.glTexRenderbufferNV                              = emuProcInterceptDsa_glTexRenderbufferNV;
  dt.glTextureBufferEXT                               = emuProcInterceptDsa_glTextureBufferEXT;
  dt.glTextureImage1DEXT                              = emuProcInterceptDsa_glTextureImage1DEXT;
  dt.glTextureImage2DEXT                              = emuProcInterceptDsa_glTextureImage2DEXT;
  dt.glTextureImage3DEXT                              = emuProcInterceptDsa_glTextureImage3DEXT;
  dt.glTextureParameterIivEXT                         = emuProcInterceptDsa_glTextureParameterIivEXT;
  dt.glTextureParameterIuivEXT                        = emuProcInterceptDsa_glTextureParameterIuivEXT;
  dt.glTextureParameterfEXT                           = emuProcInterceptDsa_glTextureParameterfEXT;
  dt.glTextureParameterfvEXT                          = emuProcInterceptDsa_glTextureParameterfvEXT;
  dt.glTextureParameteriEXT                           = emuProcInterceptDsa_glTextureParameteriEXT;
  dt.glTextureParameterivEXT                          = emuProcInterceptDsa_glTextureParameterivEXT;
  dt.glTextureRenderbufferEXT                         = emuProcInterceptDsa_glTextureRenderbufferEXT;
  dt.glTextureStorage1DEXT                            = emuProcInterceptDsa_glTextureStorage1DEXT;
  dt.glTextureStorage2DEXT                            = emuProcInterceptDsa_glTextureStorage2DEXT;
  dt.glTextureStorage3DEXT                            = emuProcInterceptDsa_glTextureStorage3DEXT;
  dt.glTextureSubImage1DEXT                           = emuProcInterceptDsa_glTextureSubImage1DEXT;
  dt.glTextureSubImage2DEXT                           = emuProcInterceptDsa_glTextureSubImage2DEXT;
  dt.glTextureSubImage3DEXT                           = emuProcInterceptDsa_glTextureSubImage3DEXT;
  dt.glTranslated                                     = emuProcInterceptDsa_glTranslated;
  dt.glTranslatef                                     = emuProcInterceptDsa_glTranslatef;
  dt.glUniform1d                                      = emuProcInterceptDsa_glUniform1d;
  dt.glUniform1dv                                     = emuProcInterceptDsa_glUniform1dv;
  dt.glUniform1f                                      = emuProcInterceptDsa_glUniform1f;
  dt.glUniform1fv                                     = emuProcInterceptDsa_glUniform1fv;
  dt.glUniform1i                                      = emuProcInterceptDsa_glUniform1i;
  dt.glUniform1iv                                     = emuProcInterceptDsa_glUniform1iv;
  dt.glUniform1ui                                     = emuProcInterceptDsa_glUniform1ui;
  dt.glUniform1uiv                                    = emuProcInterceptDsa_glUniform1uiv;
  dt.glUniform2d                                      = emuProcInterceptDsa_glUniform2d;
  dt.glUniform2dv                                     = emuProcInterceptDsa_glUniform2dv;
  dt.glUniform2f                                      = emuProcInterceptDsa_glUniform2f;
  dt.glUniform2fv                                     = emuProcInterceptDsa_glUniform2fv;
  dt.glUniform2i                                      = emuProcInterceptDsa_glUniform2i;
  dt.glUniform2iv                                     = emuProcInterceptDsa_glUniform2iv;
  dt.glUniform2ui                                     = emuProcInterceptDsa_glUniform2ui;
  dt.glUniform2uiv                                    = emuProcInterceptDsa_glUniform2uiv;
  dt.glUniform3d                                      = emuProcInterceptDsa_glUniform3d;
  dt.glUniform3dv                                     = emuProcInterceptDsa_glUniform3dv;
  dt.glUniform3f                                      = emuProcInterceptDsa_glUniform3f;
  dt.glUniform3fv                                     = emuProcInterceptDsa_glUniform3fv;
  dt.glUniform3i                                      = emuProcInterceptDsa_glUniform3i;
  dt.glUniform3iv                                     = emuProcInterceptDsa_glUniform3iv;
  dt.glUniform3ui                                     = emuProcInterceptDsa_glUniform3ui;
  dt.glUniform3uiv                                    = emuProcInterceptDsa_glUniform3uiv;
  dt.glUniform4d                                      = emuProcInterceptDsa_glUniform4d;
  dt.glUniform4dv                                     = emuProcInterceptDsa_glUniform4dv;
  dt.glUniform4f                                      = emuProcInterceptDsa_glUniform4f;
  dt.glUniform4fv                                     = emuProcInterceptDsa_glUniform4fv;
  dt.glUniform4i                                      = emuProcInterceptDsa_glUniform4i;
  dt.glUniform4iv                                     = emuProcInterceptDsa_glUniform4iv;
  dt.glUniform4ui                                     = emuProcInterceptDsa_glUniform4ui;
  dt.glUniform4uiv                                    = emuProcInterceptDsa_glUniform4uiv;
  dt.glUniformMatrix2dv                               = emuProcInterceptDsa_glUniformMatrix2dv;
  dt.glUniformMatrix2fv                               = emuProcInterceptDsa_glUniformMatrix2fv;
  dt.glUniformMatrix2x3dv                             = emuProcInterceptDsa_glUniformMatrix2x3dv;
  dt.glUniformMatrix2x3fv                             = emuProcInterceptDsa_glUniformMatrix2x3fv;
  dt.glUniformMatrix2x4dv                             = emuProcInterceptDsa_glUniformMatrix2x4dv;
  dt.glUniformMatrix2x4fv                             = emuProcInterceptDsa_glUniformMatrix2x4fv;
  dt.glUniformMatrix3dv                               = emuProcInterceptDsa_glUniformMatrix3dv;
  dt.glUniformMatrix3fv                               = emuProcInterceptDsa_glUniformMatrix3fv;
  dt.glUniformMatrix3x2dv                             = emuProcInterceptDsa_glUniformMatrix3x2dv;
  dt.glUniformMatrix3x2fv                             = emuProcInterceptDsa_glUniformMatrix3x2fv;
  dt.glUniformMatrix3x4dv                             = emuProcInterceptDsa_glUniformMatrix3x4dv;
  dt.glUniformMatrix3x4fv                             = emuProcInterceptDsa_glUniformMatrix3x4fv;
  dt.glUniformMatrix4dv                               = emuProcInterceptDsa_glUniformMatrix4dv;
  dt.glUniformMatrix4fv                               = emuProcInterceptDsa_glUniformMatrix4fv;
  dt.glUniformMatrix4x2dv                             = emuProcInterceptDsa_glUniformMatrix4x2dv;
  dt.glUniformMatrix4x2fv                             = emuProcInterceptDsa_glUniformMatrix4x2fv;
  dt.glUniformMatrix4x3dv                             = emuProcInterceptDsa_glUniformMatrix4x3dv;
  dt.glUniformMatrix4x3fv                             = emuProcInterceptDsa_glUniformMatrix4x3fv;
  dt.glUnmapBuffer                                    = emuProcInterceptDsa_glUnmapBuffer;
  dt.glUnmapBufferARB                                 = emuProcInterceptDsa_glUnmapBufferARB;
  dt.glUnmapNamedBufferEXT                            = emuProcInterceptDsa_glUnmapNamedBufferEXT;
  dt.glUseProgram                                     = emuProcInterceptDsa_glUseProgram;
  dt.glVertexArrayColorOffsetEXT                      = emuProcInterceptDsa_glVertexArrayColorOffsetEXT;
  dt.glVertexArrayEdgeFlagOffsetEXT                   = emuProcInterceptDsa_glVertexArrayEdgeFlagOffsetEXT;
  dt.glVertexArrayFogCoordOffsetEXT                   = emuProcInterceptDsa_glVertexArrayFogCoordOffsetEXT;
  dt.glVertexArrayIndexOffsetEXT                      = emuProcInterceptDsa_glVertexArrayIndexOffsetEXT;
  dt.glVertexArrayMultiTexCoordOffsetEXT              = emuProcInterceptDsa_glVertexArrayMultiTexCoordOffsetEXT;
  dt.glVertexArrayNormalOffsetEXT                     = emuProcInterceptDsa_glVertexArrayNormalOffsetEXT;
  dt.glVertexArraySecondaryColorOffsetEXT             = emuProcInterceptDsa_glVertexArraySecondaryColorOffsetEXT;
  dt.glVertexArrayTexCoordOffsetEXT                   = emuProcInterceptDsa_glVertexArrayTexCoordOffsetEXT;
  dt.glVertexArrayVertexAttribIOffsetEXT              = emuProcInterceptDsa_glVertexArrayVertexAttribIOffsetEXT;
  dt.glVertexArrayVertexAttribOffsetEXT               = emuProcInterceptDsa_glVertexArrayVertexAttribOffsetEXT;
  dt.glVertexArrayVertexOffsetEXT                     = emuProcInterceptDsa_glVertexArrayVertexOffsetEXT;
  dt.glVertexPointer                                  = emuProcInterceptDsa_glVertexPointer;
}

REGAL_NAMESPACE_END

#endif // REGAL_EMULATION
