/* 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
*/

#ifndef REGAL_EMU_PROCS_OBJ_H
#define REGAL_EMU_PROCS_OBJ_H

#include "RegalUtil.h"

#if REGAL_EMULATION

REGAL_GLOBAL_BEGIN

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

REGAL_GLOBAL_END

REGAL_NAMESPACE_BEGIN

void EmuProcsInterceptObj( Dispatch::GL & dt );

struct EmuProcsOriginateObj {

  EmuProcsOriginateObj() {
    memset(this, 0, sizeof( *this ) );
  }

  REGALGLBINDBUFFERPROC glBindBuffer;
  REGALGLBINDBUFFERARBPROC glBindBufferARB;
  REGALGLBINDTEXTUREPROC glBindTexture;
  REGALGLBINDVERTEXARRAYPROC glBindVertexArray;
  REGALGLDELETEBUFFERSPROC glDeleteBuffers;
  REGALGLDELETEBUFFERSARBPROC glDeleteBuffersARB;
  REGALGLDELETETEXTURESPROC glDeleteTextures;
  REGALGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
  REGALGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D;
  REGALGLFRAMEBUFFERTEXTURE1DEXTPROC glFramebufferTexture1DEXT;
  REGALGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
  REGALGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
  REGALGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC glFramebufferTexture2DMultisampleEXT;
  REGALGLFRAMEBUFFERTEXTURE2DOESPROC glFramebufferTexture2DOES;
  REGALGLFRAMEBUFFERTEXTURE3DEXTPROC glFramebufferTexture3DEXT;
  REGALGLFRAMEBUFFERTEXTURE3DOESPROC glFramebufferTexture3DOES;
  REGALGLGENBUFFERSPROC glGenBuffers;
  REGALGLGENBUFFERSARBPROC glGenBuffersARB;
  REGALGLGENTEXTURESPROC glGenTextures;
  REGALGLGENVERTEXARRAYSPROC glGenVertexArrays;
  REGALGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv;
  REGALGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetFramebufferAttachmentParameterivEXT;
  REGALGLISBUFFERPROC glIsBuffer;
  REGALGLISBUFFERARBPROC glIsBufferARB;
  REGALGLISTEXTUREPROC glIsTexture;
  REGALGLISVERTEXARRAYPROC glIsVertexArray;

  void Initialize( Dispatch::GL & dt ) {
    glBindBuffer = dt.glBindBuffer;
    glBindBufferARB = dt.glBindBufferARB;
    glBindTexture = dt.glBindTexture;
    glBindVertexArray = dt.glBindVertexArray;
    glDeleteBuffers = dt.glDeleteBuffers;
    glDeleteBuffersARB = dt.glDeleteBuffersARB;
    glDeleteTextures = dt.glDeleteTextures;
    glDeleteVertexArrays = dt.glDeleteVertexArrays;
    glFramebufferTexture1D = dt.glFramebufferTexture1D;
    glFramebufferTexture1DEXT = dt.glFramebufferTexture1DEXT;
    glFramebufferTexture2D = dt.glFramebufferTexture2D;
    glFramebufferTexture2DEXT = dt.glFramebufferTexture2DEXT;
    glFramebufferTexture2DMultisampleEXT = dt.glFramebufferTexture2DMultisampleEXT;
    glFramebufferTexture2DOES = dt.glFramebufferTexture2DOES;
    glFramebufferTexture3DEXT = dt.glFramebufferTexture3DEXT;
    glFramebufferTexture3DOES = dt.glFramebufferTexture3DOES;
    glGenBuffers = dt.glGenBuffers;
    glGenBuffersARB = dt.glGenBuffersARB;
    glGenTextures = dt.glGenTextures;
    glGenVertexArrays = dt.glGenVertexArrays;
    glGetFramebufferAttachmentParameteriv = dt.glGetFramebufferAttachmentParameteriv;
    glGetFramebufferAttachmentParameterivEXT = dt.glGetFramebufferAttachmentParameterivEXT;
    glIsBuffer = dt.glIsBuffer;
    glIsBufferARB = dt.glIsBufferARB;
    glIsTexture = dt.glIsTexture;
    glIsVertexArray = dt.glIsVertexArray;
  }
};

REGAL_NAMESPACE_END

#endif // REGAL_EMULATION

#endif // REGAL_EMU_PROCS_OBJ_H
