OpenSceneGraph/src/osg/GLStaticLibrary.cpp
2010-11-22 11:22:03 +00:00

211 lines
6.6 KiB
C++

/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
* Copyright (C) 2003-2005 3Dlabs Inc. Ltd.
* Copyright (C) 2004-2005 Nathan Cournia
* Copyright (C) 2008 Zebra Imaging
*
* This application is open source and may be redistributed and/or modified
* freely and without restriction, both in commercial and non commercial
* applications, as long as this copyright notice is maintained.
*
* This application is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
*/
/* file: src/osg/GLStaticLibrary.cpp
* author: Alok Priyadarshi 2010-04-27
*/
#include "GLStaticLibrary.h"
#include <osg/GL>
#include <osg/Notify>
#include <map>
#include <string>
// This file is intended for GL static linking only.
#if defined(OSG_GL_LIBRARY_STATIC)
using namespace osg;
namespace {
typedef void (*GLProc)(void);
typedef std::map<std::string, GLProc> GLProcAddressMap;
static bool sProcAddressInitialized = false;
static GLProcAddressMap sProcAddressMap;
#define ADD_FUNCTION(FunctionName) sProcAddressMap[#FunctionName] = reinterpret_cast<GLProc>(&FunctionName);
void initGLES2ProcAddress()
{
ADD_FUNCTION(glActiveTexture)
ADD_FUNCTION(glAttachShader)
ADD_FUNCTION(glBindAttribLocation)
ADD_FUNCTION(glBindBuffer)
ADD_FUNCTION(glBindFramebuffer)
ADD_FUNCTION(glBindRenderbuffer)
ADD_FUNCTION(glBindTexture)
ADD_FUNCTION(glBlendColor)
ADD_FUNCTION(glBlendEquation)
ADD_FUNCTION(glBlendEquationSeparate)
ADD_FUNCTION(glBlendFunc)
ADD_FUNCTION(glBlendFuncSeparate)
ADD_FUNCTION(glBufferData)
ADD_FUNCTION(glBufferSubData)
ADD_FUNCTION(glCheckFramebufferStatus)
ADD_FUNCTION(glClear)
ADD_FUNCTION(glClearColor)
ADD_FUNCTION(glClearDepthf)
ADD_FUNCTION(glClearStencil)
ADD_FUNCTION(glColorMask)
ADD_FUNCTION(glCompileShader)
ADD_FUNCTION(glCompressedTexImage2D)
ADD_FUNCTION(glCompressedTexSubImage2D)
ADD_FUNCTION(glCopyTexImage2D)
ADD_FUNCTION(glCopyTexSubImage2D)
ADD_FUNCTION(glCreateProgram)
ADD_FUNCTION(glCreateShader)
ADD_FUNCTION(glCullFace)
ADD_FUNCTION(glDeleteBuffers)
ADD_FUNCTION(glDeleteFramebuffers)
ADD_FUNCTION(glDeleteProgram)
ADD_FUNCTION(glDeleteRenderbuffers)
ADD_FUNCTION(glDeleteShader)
ADD_FUNCTION(glDeleteTextures)
ADD_FUNCTION(glDepthFunc)
ADD_FUNCTION(glDepthMask)
ADD_FUNCTION(glDepthRangef)
ADD_FUNCTION(glDetachShader)
ADD_FUNCTION(glDisable)
ADD_FUNCTION(glDisableVertexAttribArray)
ADD_FUNCTION(glDrawArrays)
ADD_FUNCTION(glDrawElements)
ADD_FUNCTION(glEnable)
ADD_FUNCTION(glEnableVertexAttribArray)
ADD_FUNCTION(glFinish)
ADD_FUNCTION(glFlush)
ADD_FUNCTION(glFramebufferRenderbuffer)
ADD_FUNCTION(glFramebufferTexture2D)
ADD_FUNCTION(glFrontFace)
ADD_FUNCTION(glGenBuffers)
ADD_FUNCTION(glGenerateMipmap)
ADD_FUNCTION(glGenFramebuffers)
ADD_FUNCTION(glGenRenderbuffers)
ADD_FUNCTION(glGenTextures)
ADD_FUNCTION(glGetActiveAttrib)
ADD_FUNCTION(glGetActiveUniform)
ADD_FUNCTION(glGetAttachedShaders)
ADD_FUNCTION(glGetAttribLocation)
ADD_FUNCTION(glGetBooleanv)
ADD_FUNCTION(glGetBufferParameteriv)
ADD_FUNCTION(glGetError)
ADD_FUNCTION(glGetFloatv)
ADD_FUNCTION(glGetFramebufferAttachmentParameteriv)
ADD_FUNCTION(glGetIntegerv)
ADD_FUNCTION(glGetProgramiv)
ADD_FUNCTION(glGetProgramInfoLog)
ADD_FUNCTION(glGetRenderbufferParameteriv)
ADD_FUNCTION(glGetShaderiv)
ADD_FUNCTION(glGetShaderInfoLog)
ADD_FUNCTION(glGetShaderPrecisionFormat)
ADD_FUNCTION(glGetShaderSource)
ADD_FUNCTION(glGetString)
ADD_FUNCTION(glGetTexParameterfv)
ADD_FUNCTION(glGetTexParameteriv)
ADD_FUNCTION(glGetUniformfv)
ADD_FUNCTION(glGetUniformiv)
ADD_FUNCTION(glGetUniformLocation)
ADD_FUNCTION(glGetVertexAttribfv)
ADD_FUNCTION(glGetVertexAttribiv)
ADD_FUNCTION(glGetVertexAttribPointerv)
ADD_FUNCTION(glHint)
ADD_FUNCTION(glIsBuffer)
ADD_FUNCTION(glIsEnabled)
ADD_FUNCTION(glIsFramebuffer)
ADD_FUNCTION(glIsProgram)
ADD_FUNCTION(glIsRenderbuffer)
ADD_FUNCTION(glIsShader)
ADD_FUNCTION(glIsTexture)
ADD_FUNCTION(glLineWidth)
ADD_FUNCTION(glLinkProgram)
ADD_FUNCTION(glPixelStorei)
ADD_FUNCTION(glPolygonOffset)
ADD_FUNCTION(glReadPixels)
ADD_FUNCTION(glReleaseShaderCompiler)
ADD_FUNCTION(glRenderbufferStorage)
ADD_FUNCTION(glSampleCoverage)
ADD_FUNCTION(glScissor)
ADD_FUNCTION(glShaderBinary)
ADD_FUNCTION(glShaderSource)
ADD_FUNCTION(glStencilFunc)
ADD_FUNCTION(glStencilFuncSeparate)
ADD_FUNCTION(glStencilMask)
ADD_FUNCTION(glStencilMaskSeparate)
ADD_FUNCTION(glStencilOp)
ADD_FUNCTION(glStencilOpSeparate)
ADD_FUNCTION(glTexImage2D)
ADD_FUNCTION(glTexParameterf)
ADD_FUNCTION(glTexParameterfv)
ADD_FUNCTION(glTexParameteri)
ADD_FUNCTION(glTexParameteriv)
ADD_FUNCTION(glTexSubImage2D)
ADD_FUNCTION(glUniform1f)
ADD_FUNCTION(glUniform1fv)
ADD_FUNCTION(glUniform1i)
ADD_FUNCTION(glUniform1iv)
ADD_FUNCTION(glUniform2f)
ADD_FUNCTION(glUniform2fv)
ADD_FUNCTION(glUniform2i)
ADD_FUNCTION(glUniform2iv)
ADD_FUNCTION(glUniform3f)
ADD_FUNCTION(glUniform3fv)
ADD_FUNCTION(glUniform3i)
ADD_FUNCTION(glUniform3iv)
ADD_FUNCTION(glUniform4f)
ADD_FUNCTION(glUniform4fv)
ADD_FUNCTION(glUniform4i)
ADD_FUNCTION(glUniform4iv)
ADD_FUNCTION(glUniformMatrix2fv)
ADD_FUNCTION(glUniformMatrix3fv)
ADD_FUNCTION(glUniformMatrix4fv)
ADD_FUNCTION(glUseProgram)
ADD_FUNCTION(glValidateProgram)
ADD_FUNCTION(glVertexAttrib1f)
ADD_FUNCTION(glVertexAttrib1fv)
ADD_FUNCTION(glVertexAttrib2f)
ADD_FUNCTION(glVertexAttrib2fv)
ADD_FUNCTION(glVertexAttrib3f)
ADD_FUNCTION(glVertexAttrib3fv)
ADD_FUNCTION(glVertexAttrib4f)
ADD_FUNCTION(glVertexAttrib4fv)
ADD_FUNCTION(glVertexAttribPointer)
ADD_FUNCTION(glViewport)
}
void initProcAddress()
{
#if defined(OSG_GLES2_AVAILABLE)
initGLES2ProcAddress();
#else
OSG_NOTICE << "initProcAddress() not implemented for static GL lib yet." << std::endl;
#endif
}
} // namespace
void* GLStaticLibrary::getProcAddress(const char* procName)
{
// TODO(alokp): Add a mutex around sProcAddressInitialized.
if (!sProcAddressInitialized)
{
initProcAddress();
sProcAddressInitialized = true;
}
GLProcAddressMap::const_iterator iter = sProcAddressMap.find(procName);
return iter != sProcAddressMap.end() ? reinterpret_cast<void*>(iter->second) : 0;
}
#endif // OSG_GLES2_LIBRARY_STATIC