336 lines
15 KiB
C++
Executable File
336 lines
15 KiB
C++
Executable File
#include "OpenGlExtensions.h"
|
|
|
|
#include "Utils.h"
|
|
#include <iostream>
|
|
|
|
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
|
|
|
|
//====================================================
|
|
//===================== GLSL Shaders =================
|
|
//====================================================
|
|
|
|
//Requires GL_VERSION_2_0
|
|
PFNGLCREATEPROGRAMPROC glCreateProgram = NULL;
|
|
PFNGLDELETEPROGRAMPROC glDeleteProgram = NULL;
|
|
PFNGLLINKPROGRAMPROC glLinkProgram = NULL;
|
|
PFNGLVALIDATEPROGRAMPROC glValidateProgram = NULL;
|
|
PFNGLUSEPROGRAMPROC glUseProgram = NULL;
|
|
PFNGLGETPROGRAMIVPROC glGetProgramiv = NULL;
|
|
PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog = NULL;
|
|
PFNGLCREATESHADERPROC glCreateShader = NULL;
|
|
PFNGLDELETESHADERPROC glDeleteShader = NULL;
|
|
PFNGLSHADERSOURCEPROC glShaderSource = NULL;
|
|
PFNGLCOMPILESHADERPROC glCompileShader = NULL;
|
|
PFNGLATTACHSHADERPROC glAttachShader = NULL;
|
|
PFNGLDETACHSHADERPROC glDetachShader = NULL;
|
|
PFNGLGETSHADERIVPROC glGetShaderiv = NULL;
|
|
PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog = NULL;
|
|
PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation = NULL;
|
|
PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer = NULL;
|
|
PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray = NULL;
|
|
PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray = NULL;
|
|
PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation = NULL;
|
|
PFNGLUNIFORMMATRIX3FVPROC glUniformMatrix3fv = NULL;
|
|
PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv = NULL;
|
|
PFNGLUNIFORM1IPROC glUniform1i = NULL;
|
|
PFNGLUNIFORM1FVPROC glUniform1fv = NULL;
|
|
PFNGLUNIFORM3FVPROC glUniform2fv = NULL;
|
|
PFNGLUNIFORM3FVPROC glUniform3fv = NULL;
|
|
PFNGLUNIFORM4FVPROC glUniform4fv = NULL;
|
|
PFNGLVERTEXATTRIB1FPROC glVertexAttrib1f = NULL;
|
|
PFNGLVERTEXATTRIB2FPROC glVertexAttrib2f = NULL;
|
|
PFNGLVERTEXATTRIB3FPROC glVertexAttrib3f = NULL;
|
|
PFNGLVERTEXATTRIB4FPROC glVertexAttrib4f = NULL;
|
|
PFNGLVERTEXATTRIB2FVPROC glVertexAttrib2fv = NULL;
|
|
PFNGLVERTEXATTRIB3FVPROC glVertexAttrib3fv = NULL;
|
|
PFNGLVERTEXATTRIB4FVPROC glVertexAttrib4fv = NULL;
|
|
PFNGLGETACTIVEATTRIBPROC glGetActiveAttrib = NULL;
|
|
PFNGLGETACTIVEUNIFORMPROC glGetActiveUniform = NULL;
|
|
|
|
|
|
//=======================================
|
|
//=========== Multitexture ==============
|
|
//=======================================
|
|
|
|
//Requires GL version 1.3
|
|
PFNGLACTIVETEXTUREPROC glActiveTexture = NULL;
|
|
|
|
//=======================================
|
|
//========== Vertex buffer ==============
|
|
//=======================================
|
|
|
|
//Requires GL_VERSION_1_5
|
|
PFNGLGENBUFFERSPROC glGenBuffers = NULL;
|
|
PFNGLDELETEBUFFERSPROC glDeleteBuffers = NULL;
|
|
PFNGLBINDBUFFERPROC glBindBuffer = NULL;
|
|
PFNGLBUFFERDATAPROC glBufferData = NULL;
|
|
PFNGLBUFFERSUBDATAPROC glBufferSubData = NULL;
|
|
PFNGLMAPBUFFERPROC glMapBuffer = NULL;
|
|
PFNGLUNMAPBUFFERPROC glUnmapBuffer = NULL;
|
|
|
|
//=========================================
|
|
//============ Frame buffer ===============
|
|
//=========================================
|
|
|
|
//Requires GL_ARB_framebuffer_object
|
|
PFNGLISRENDERBUFFERPROC glIsRenderbuffer = NULL;
|
|
PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer = NULL;
|
|
PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers = NULL;
|
|
PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers = NULL;
|
|
PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage = NULL;
|
|
PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv = NULL;
|
|
PFNGLISFRAMEBUFFERPROC glIsFramebuffer = NULL;
|
|
PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer = NULL;
|
|
PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers = NULL;
|
|
PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers = NULL;
|
|
PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus = NULL;
|
|
PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D = NULL;
|
|
PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D = NULL;
|
|
PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D = NULL;
|
|
PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer = NULL;
|
|
PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv = NULL;
|
|
PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer = NULL;
|
|
PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample = NULL;
|
|
PFNGLGENERATEMIPMAPPROC glGenerateMipmap = NULL;
|
|
PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer = NULL;
|
|
|
|
|
|
|
|
//===========================================
|
|
//============ Uniform buffer ===============
|
|
//===========================================
|
|
|
|
//Requires GL_ARB_uniform_buffer_object
|
|
PFNGLGETUNIFORMINDICESPROC glGetUniformIndices = NULL;
|
|
PFNGLGETACTIVEUNIFORMSIVPROC glGetActiveUniformsiv = NULL;
|
|
PFNGLGETACTIVEUNIFORMNAMEPROC glGetActiveUniformName = NULL;
|
|
PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex = NULL;
|
|
PFNGLGETACTIVEUNIFORMBLOCKIVPROC glGetActiveUniformBlockiv = NULL;
|
|
PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glGetActiveUniformBlockName = NULL;
|
|
PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding = NULL;
|
|
PFNGLBINDBUFFERBASEPROC glBindBufferBase = NULL;
|
|
|
|
|
|
PFNGLGENVERTEXARRAYSPROC glGenVertexArrays = NULL;
|
|
PFNGLBINDVERTEXARRAYPROC glBindVertexArray = NULL;
|
|
PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArray = NULL;
|
|
|
|
#endif
|
|
|
|
namespace ZL {
|
|
|
|
bool BindOpenGlFunctions()
|
|
{
|
|
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
|
|
//char* extensionList = (char*)glGetString(GL_EXTENSIONS);
|
|
char* glVersion = (char*)glGetString(GL_VERSION);
|
|
bool ok = true;
|
|
|
|
//Requires OpenGL 2.0 or above
|
|
if (glVersion[0] >= '2')
|
|
{
|
|
|
|
glActiveTexture = (PFNGLACTIVETEXTUREPROC)wglGetProcAddress("glActiveTexture");
|
|
|
|
glGenBuffers = (PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffers");
|
|
glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)wglGetProcAddress("glDeleteBuffers");
|
|
glBindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer");
|
|
glBufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferData");
|
|
glBufferSubData = (PFNGLBUFFERSUBDATAPROC)wglGetProcAddress("glBufferSubData");
|
|
glMapBuffer = (PFNGLMAPBUFFERPROC)wglGetProcAddress("glMapBuffer");
|
|
glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)wglGetProcAddress("glUnmapBuffer");
|
|
|
|
glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");
|
|
glDeleteProgram = (PFNGLDELETEPROGRAMPROC)wglGetProcAddress("glDeleteProgram");
|
|
glLinkProgram = (PFNGLLINKPROGRAMPROC)wglGetProcAddress("glLinkProgram");
|
|
glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)wglGetProcAddress("glValidateProgram");
|
|
glUseProgram = (PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram");
|
|
glGetProgramiv = (PFNGLGETPROGRAMIVPROC)wglGetProcAddress("glGetProgramiv");
|
|
glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)wglGetProcAddress("glGetProgramInfoLog");
|
|
glCreateShader = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader");
|
|
|
|
|
|
glDeleteShader = (PFNGLDELETESHADERPROC)wglGetProcAddress("glDeleteShader");
|
|
glShaderSource = (PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource");
|
|
glCompileShader = (PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader");
|
|
glAttachShader = (PFNGLATTACHSHADERPROC)wglGetProcAddress("glAttachShader");
|
|
glDetachShader = (PFNGLDETACHSHADERPROC)wglGetProcAddress("glDetachShader");
|
|
glGetShaderiv = (PFNGLGETSHADERIVPROC)wglGetProcAddress("glGetShaderiv");
|
|
glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)wglGetProcAddress("glGetShaderInfoLog");
|
|
glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)wglGetProcAddress("glGetAttribLocation");
|
|
glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)wglGetProcAddress("glVertexAttribPointer");
|
|
glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glEnableVertexAttribArray");
|
|
|
|
glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glDisableVertexAttribArray");
|
|
glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)wglGetProcAddress("glGetUniformLocation");
|
|
glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)wglGetProcAddress("glUniformMatrix3fv");
|
|
glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)wglGetProcAddress("glUniformMatrix4fv");
|
|
glUniform1i = (PFNGLUNIFORM1IPROC)wglGetProcAddress("glUniform1i");
|
|
glUniform1fv = (PFNGLUNIFORM1FVPROC)wglGetProcAddress("glUniform1fv");
|
|
glUniform2fv = (PFNGLUNIFORM2FVPROC)wglGetProcAddress("glUniform2fv");
|
|
glUniform3fv = (PFNGLUNIFORM3FVPROC)wglGetProcAddress("glUniform3fv");
|
|
glUniform4fv = (PFNGLUNIFORM4FVPROC)wglGetProcAddress("glUniform4fv");
|
|
|
|
glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)wglGetProcAddress("glVertexAttrib1f");
|
|
glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)wglGetProcAddress("glVertexAttrib2f");
|
|
glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)wglGetProcAddress("glVertexAttrib3f");
|
|
glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)wglGetProcAddress("glVertexAttrib4f");
|
|
glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)wglGetProcAddress("glVertexAttrib2fv");
|
|
glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)wglGetProcAddress("glVertexAttrib3fv");
|
|
glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)wglGetProcAddress("glVertexAttrib4fv");
|
|
glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)wglGetProcAddress("glGetActiveAttrib");
|
|
glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)wglGetProcAddress("glGetActiveUniform");
|
|
|
|
|
|
if (glActiveTexture == NULL ||
|
|
glGenBuffers == NULL ||
|
|
glDeleteBuffers == NULL ||
|
|
glBindBuffer == NULL ||
|
|
glBufferData == NULL ||
|
|
glBufferSubData == NULL ||
|
|
glMapBuffer == NULL ||
|
|
glCreateProgram == NULL ||
|
|
glDeleteProgram == NULL ||
|
|
glLinkProgram == NULL ||
|
|
glValidateProgram == NULL ||
|
|
glUseProgram == NULL ||
|
|
glGetProgramiv == NULL ||
|
|
glGetProgramInfoLog == NULL ||
|
|
glCreateShader == NULL ||
|
|
glDeleteShader == NULL ||
|
|
glShaderSource == NULL ||
|
|
glCompileShader == NULL ||
|
|
glAttachShader == NULL ||
|
|
glDetachShader == NULL ||
|
|
glGetShaderiv == NULL ||
|
|
glGetShaderInfoLog == NULL ||
|
|
glGetAttribLocation == NULL ||
|
|
glVertexAttribPointer == NULL ||
|
|
glEnableVertexAttribArray == NULL ||
|
|
glDisableVertexAttribArray == NULL ||
|
|
glGetUniformLocation == NULL ||
|
|
glUniformMatrix3fv == NULL ||
|
|
glUniformMatrix4fv == NULL ||
|
|
glUniform1i == NULL ||
|
|
glUniform1fv == NULL ||
|
|
glUniform2fv == NULL ||
|
|
glUniform3fv == NULL ||
|
|
glUniform4fv == NULL ||
|
|
glEnableVertexAttribArray == NULL ||
|
|
glVertexAttrib1f == NULL ||
|
|
glVertexAttrib2f == NULL ||
|
|
glVertexAttrib3f == NULL ||
|
|
glVertexAttrib4f == NULL ||
|
|
glVertexAttrib2fv == NULL ||
|
|
glVertexAttrib3fv == NULL ||
|
|
glVertexAttrib4fv == NULL ||
|
|
glGetActiveAttrib == NULL ||
|
|
glGetActiveUniform == NULL)
|
|
{
|
|
ok = false;
|
|
}
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
ok = false;
|
|
}
|
|
|
|
|
|
glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)wglGetProcAddress("glIsRenderbuffer");
|
|
glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)wglGetProcAddress("glBindRenderbuffer");
|
|
glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)wglGetProcAddress("glDeleteRenderbuffers");
|
|
glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)wglGetProcAddress("glGenRenderbuffers");
|
|
glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)wglGetProcAddress("glRenderbufferStorage");
|
|
glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)wglGetProcAddress("glGetRenderbufferParameteriv");
|
|
glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)wglGetProcAddress("glIsFramebuffer");
|
|
glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)wglGetProcAddress("glBindFramebuffer");
|
|
glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)wglGetProcAddress("glDeleteFramebuffers");
|
|
glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)wglGetProcAddress("glGenFramebuffers");
|
|
glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)wglGetProcAddress("glCheckFramebufferStatus");
|
|
glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)wglGetProcAddress("glFramebufferTexture1D");
|
|
glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)wglGetProcAddress("glFramebufferTexture2D");
|
|
glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)wglGetProcAddress("glFramebufferTexture3D");
|
|
glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)wglGetProcAddress("glFramebufferRenderbuffer");
|
|
glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)wglGetProcAddress("glGetFramebufferAttachmentParameteriv");
|
|
glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)wglGetProcAddress("glBlitFramebuffer");
|
|
glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)wglGetProcAddress("glRenderbufferStorageMultisample");
|
|
glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)wglGetProcAddress("glGenerateMipmap");
|
|
glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)wglGetProcAddress("glFramebufferTextureLayer");
|
|
|
|
if (glIsRenderbuffer == NULL ||
|
|
glBindRenderbuffer == NULL ||
|
|
glDeleteRenderbuffers == NULL ||
|
|
glGenRenderbuffers == NULL ||
|
|
glRenderbufferStorage == NULL ||
|
|
glGetRenderbufferParameteriv == NULL ||
|
|
glIsFramebuffer == NULL ||
|
|
glBindFramebuffer == NULL ||
|
|
glDeleteFramebuffers == NULL ||
|
|
glGenFramebuffers == NULL ||
|
|
glCheckFramebufferStatus == NULL ||
|
|
glFramebufferTexture1D == NULL ||
|
|
glFramebufferTexture2D == NULL ||
|
|
glFramebufferTexture3D == NULL ||
|
|
glFramebufferRenderbuffer == NULL ||
|
|
glGetFramebufferAttachmentParameteriv == NULL ||
|
|
glBlitFramebuffer == NULL ||
|
|
glRenderbufferStorageMultisample == NULL ||
|
|
glGenerateMipmap == NULL ||
|
|
glFramebufferTextureLayer == NULL)
|
|
{
|
|
ok = false;
|
|
}
|
|
|
|
|
|
glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC)wglGetProcAddress("glGetUniformIndices");
|
|
glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)wglGetProcAddress("glGetActiveUniformsiv");
|
|
glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC)wglGetProcAddress("glGetActiveUniformName");
|
|
glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)wglGetProcAddress("glGetUniformBlockIndex");
|
|
glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)wglGetProcAddress("glGetActiveUniformBlockiv");
|
|
glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)wglGetProcAddress("glGetActiveUniformBlockName");
|
|
glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)wglGetProcAddress("glUniformBlockBinding");
|
|
glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)wglGetProcAddress("glBindBufferBase");
|
|
|
|
if (glGetUniformIndices == NULL ||
|
|
glGetActiveUniformsiv == NULL ||
|
|
glGetActiveUniformName == NULL ||
|
|
glGetUniformBlockIndex == NULL ||
|
|
glGetActiveUniformBlockiv == NULL ||
|
|
glGetActiveUniformBlockName == NULL ||
|
|
glUniformBlockBinding == NULL ||
|
|
glBindBufferBase == NULL)
|
|
{
|
|
ok = false;
|
|
}
|
|
|
|
|
|
glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)wglGetProcAddress("glGenVertexArrays");
|
|
glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)wglGetProcAddress("glBindVertexArray");
|
|
glDeleteVertexArray = (PFNGLDELETEVERTEXARRAYSPROC)wglGetProcAddress("glBindVertexArray");
|
|
|
|
if (glGenVertexArrays == NULL ||
|
|
glBindVertexArray == NULL ||
|
|
glDeleteVertexArray == NULL)
|
|
{
|
|
ok = false;
|
|
}
|
|
|
|
|
|
return ok;
|
|
#else
|
|
return true;
|
|
#endif
|
|
}
|
|
|
|
void CheckGlError()
|
|
{
|
|
size_t error = glGetError();
|
|
if (error != GL_NO_ERROR)
|
|
{
|
|
throw std::runtime_error("Gl error");
|
|
}
|
|
}
|
|
}
|