/* 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_TEXSTO_H
#define REGAL_EMU_PROCS_TEXSTO_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 EmuProcsInterceptTexSto( Dispatch::GL & dt );

struct EmuProcsOriginateTexSto {

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

  REGALGLDELETETEXTURESPROC glDeleteTextures;
  REGALGLGETINTEGERVPROC glGetIntegerv;
  REGALGLGETTEXPARAMETERIIVPROC glGetTexParameterIiv;
  REGALGLGETTEXPARAMETERIUIVPROC glGetTexParameterIuiv;
  REGALGLGETTEXPARAMETERFVPROC glGetTexParameterfv;
  REGALGLGETTEXPARAMETERIVPROC glGetTexParameteriv;
  REGALGLTEXIMAGE1DPROC glTexImage1D;
  REGALGLTEXIMAGE2DPROC glTexImage2D;
  REGALGLTEXIMAGE3DPROC glTexImage3D;
  REGALGLTEXSTORAGE1DPROC glTexStorage1D;
  REGALGLTEXSTORAGE1DEXTPROC glTexStorage1DEXT;
  REGALGLTEXSTORAGE2DPROC glTexStorage2D;
  REGALGLTEXSTORAGE2DEXTPROC glTexStorage2DEXT;
  REGALGLTEXSTORAGE3DPROC glTexStorage3D;
  REGALGLTEXSTORAGE3DEXTPROC glTexStorage3DEXT;

  void Initialize( Dispatch::GL & dt ) {
    glDeleteTextures = dt.glDeleteTextures;
    glGetIntegerv = dt.glGetIntegerv;
    glGetTexParameterIiv = dt.glGetTexParameterIiv;
    glGetTexParameterIuiv = dt.glGetTexParameterIuiv;
    glGetTexParameterfv = dt.glGetTexParameterfv;
    glGetTexParameteriv = dt.glGetTexParameteriv;
    glTexImage1D = dt.glTexImage1D;
    glTexImage2D = dt.glTexImage2D;
    glTexImage3D = dt.glTexImage3D;
    glTexStorage1D = dt.glTexStorage1D;
    glTexStorage1DEXT = dt.glTexStorage1DEXT;
    glTexStorage2D = dt.glTexStorage2D;
    glTexStorage2DEXT = dt.glTexStorage2DEXT;
    glTexStorage3D = dt.glTexStorage3D;
    glTexStorage3DEXT = dt.glTexStorage3DEXT;
  }
};

REGAL_NAMESPACE_END

#endif // REGAL_EMULATION

#endif // REGAL_EMU_PROCS_TEXSTO_H
