2022-05-21 19:58:09 +02:00

69 lines
2.5 KiB
C++

#include "stdafx.h"
#include "Mangler.h"
// Link against OpenGL
#pragma comment(lib, "opengl32.lib")
#define INITIALIZE_ROUTINE(fn, proc) proc = (fn)Mangler::LoadOpenGLProc(#proc)
namespace MGL
{
bool Mangler::Initalize()
{
// Initialize the APIs
INITIALIZE_ROUTINE(FnDeleteBuffers, glDeleteBuffers);
INITIALIZE_ROUTINE(FnGenBuffers, glGenBuffers);
INITIALIZE_ROUTINE(FnBindBuffer, glBindBuffer);
INITIALIZE_ROUTINE(FnBindBufferBase, glBindBufferBase);
INITIALIZE_ROUTINE(FnBufferData, glBufferData);
INITIALIZE_ROUTINE(FnBindVertexArray, glBindVertexArray);
INITIALIZE_ROUTINE(FnDeleteVertexArrays, glDeleteVertexArrays);
INITIALIZE_ROUTINE(FnGenVertexArrays, glGenVertexArrays);
INITIALIZE_ROUTINE(FnCompileShader, glCompileShader);
INITIALIZE_ROUTINE(FnCreateProgram, glCreateProgram);
INITIALIZE_ROUTINE(FnCreateShader, glCreateShader);
INITIALIZE_ROUTINE(FnActiveTexture, glActiveTexture);
INITIALIZE_ROUTINE(FnDeleteProgram, glDeleteProgram);
INITIALIZE_ROUTINE(FnDeleteShader, glDeleteShader);
INITIALIZE_ROUTINE(FnDetachShader, glDetachShader);
INITIALIZE_ROUTINE(FnUseProgram, glUseProgram);
INITIALIZE_ROUTINE(FnShaderSource, glShaderSource);
INITIALIZE_ROUTINE(FnAttachShader, glAttachShader);
INITIALIZE_ROUTINE(FnGetUniformLocation, glGetUniformLocation);
INITIALIZE_ROUTINE(FnLinkProgram, glLinkProgram);
INITIALIZE_ROUTINE(FnUniformMatrix4fv, glUniformMatrix4fv);
INITIALIZE_ROUTINE(FnVertexAttribPointer, glVertexAttribPointer);
INITIALIZE_ROUTINE(FnEnableVertexAttribArray, glEnableVertexAttribArray);
INITIALIZE_ROUTINE(FnDisableVertexAttribArray, glDisableVertexAttribArray);
INITIALIZE_ROUTINE(FnGetShaderiv, glGetShaderiv);
INITIALIZE_ROUTINE(FnGetShaderInfoLog, glGetShaderInfoLog);
INITIALIZE_ROUTINE(FnUniform3fv, glUniform3fv);
INITIALIZE_ROUTINE(FnUniform1iv, glUniform1iv);
INITIALIZE_ROUTINE(FnCompressedTexImage2D, glCompressedTexImage2D);
// Initialize the WGL APIs
INITIALIZE_ROUTINE(WFnSwapIntervalEXT, wglSwapIntervalEXT);
INITIALIZE_ROUTINE(WFnChoosePixelFormatARB, wglChoosePixelFormatARB);
// Success
return true;
}
uintptr_t Mangler::LoadOpenGLProc(const char* Name)
{
// Try extensions first
auto Proc = (void*)wglGetProcAddress(Name);
// Check for errors during load
if (Proc == 0 || (Proc == (void*)0x1) || (Proc == (void*)0x2) || (Proc == (void*)0x3) || (Proc == (void*)-1))
{
// This is a built-in, not an extension
auto Module = LoadLibraryA("opengl32.dll");
Proc = (void*)GetProcAddress(Module, Name);
}
// Return address
return (uintptr_t)Proc;
}
}