diff options
| author | Jasper St. Pierre <jstpierre@mecheye.net> | 2013-09-10 23:12:54 -0400 |
|---|---|---|
| committer | Jasper St. Pierre <jstpierre@mecheye.net> | 2013-10-07 10:37:01 -0400 |
| commit | a7c72081039ca1c6bee6b18db44fe4e9ffaf4fb5 (patch) | |
| tree | 70e3c53d290bf5f0e76a2f3295b4ff01e07e2127 /Source/Core/VideoBackends/OGL/Src/GLFunctions.cpp | |
| parent | d6f0ecebb4742f6b41397420f7d58ab7a05a03cc (diff) | |
Put Plugins/ in Core/, rename to VideoBackends
Diffstat (limited to 'Source/Core/VideoBackends/OGL/Src/GLFunctions.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/OGL/Src/GLFunctions.cpp | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/Source/Core/VideoBackends/OGL/Src/GLFunctions.cpp b/Source/Core/VideoBackends/OGL/Src/GLFunctions.cpp new file mode 100644 index 0000000000..598f336036 --- /dev/null +++ b/Source/Core/VideoBackends/OGL/Src/GLFunctions.cpp @@ -0,0 +1,138 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#include "DriverDetails.h" +#include "GLFunctions.h" +#include "Log.h" +#include <dlfcn.h> + +#ifdef USE_GLES3 +PFNGLMAPBUFFERRANGEPROC glMapBufferRange; +PFNGLUNMAPBUFFERPROC glUnmapBuffer; +PFNGLBINDBUFFERRANGEPROC glBindBufferRange; + +PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer; + +PFNGLGENVERTEXARRAYSPROC glGenVertexArrays; +PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays; +PFNGLBINDVERTEXARRAYPROC glBindVertexArray; + +PFNGLCLIENTWAITSYNCPROC glClientWaitSync; +PFNGLDELETESYNCPROC glDeleteSync; +PFNGLFENCESYNCPROC glFenceSync; + +PFNGLSAMPLERPARAMETERFPROC glSamplerParameterf; +PFNGLSAMPLERPARAMETERIPROC glSamplerParameteri; +PFNGLSAMPLERPARAMETERFVPROC glSamplerParameterfv; +PFNGLBINDSAMPLERPROC glBindSampler; +PFNGLDELETESAMPLERSPROC glDeleteSamplers; +PFNGLGENSAMPLERSPROC glGenSamplers; + +PFNGLGETPROGRAMBINARYPROC glGetProgramBinary; +PFNGLPROGRAMBINARYPROC glProgramBinary; +PFNGLPROGRAMPARAMETERIPROC glProgramParameteri; + +PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements; + +PFNGLRENDERBUFFERSTORAGEMULTISAMPLE glRenderbufferStorageMultisample; + +PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex; +PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding; + +PFNGLBEGINQUERYPROC glBeginQuery; +PFNGLENDQUERYPROC glEndQuery; +PFNGLGETQUERYOBJECTUIVPROC glGetQueryObjectuiv; +PFNGLDELETEQUERIESPROC glDeleteQueries; +PFNGLGENQUERIESPROC glGenQueries; +#endif +namespace GLFunc +{ + void *self; + void LoadFunction(const char *name, void **func) + { +#ifdef USE_GLES3 + *func = (void*)eglGetProcAddress(name); + if (*func == NULL) + { + // Fall back to trying dlsym + if (self) // Just in case dlopen fails + *func = dlsym(self, name); + if (*func == NULL) + { + ERROR_LOG(VIDEO, "Couldn't load function %s", name); + exit(0); + } + } +#endif + } + + void Init() + { + self = dlopen(NULL, RTLD_LAZY); + + LoadFunction("glUnmapBuffer", (void**)&glUnmapBuffer); + + if (DriverDetails::HasBug(DriverDetails::BUG_ISTEGRA)) + { + LoadFunction("glBeginQueryEXT", (void**)&glBeginQuery); + LoadFunction("glEndQueryEXT", (void**)&glEndQuery); + LoadFunction("glGetQueryObjectuivEXT", (void**)&glGetQueryObjectuiv); + LoadFunction("glDeleteQueriesEXT", (void**)&glDeleteQueries); + LoadFunction("glGenQueriesEXT", (void**)&glGenQueries); + + LoadFunction("glMapBufferRangeNV", (void**)&glMapBufferRange); + LoadFunction("glBindBufferRangeNV", (void**)&glBindBufferRange); + LoadFunction("glBlitFramebufferNV", (void**)&glBlitFramebuffer); + + LoadFunction("glGenVertexArraysOES", (void**)&glGenVertexArrays); + LoadFunction("glDeleteVertexArraysOES", (void**)&glDeleteVertexArrays); + LoadFunction("glBindVertexArrayOES", (void**)&glBindVertexArray); + + LoadFunction("glRenderbufferStorageMultisampleNV", (void**)&glRenderbufferStorageMultisample); + + LoadFunction("glGetUniformBlockIndexNV", (void**)&glGetUniformBlockIndex); + LoadFunction("glUniformBlockBindingNV", (void**)&glUniformBlockBinding); + } + else + { + LoadFunction("glBeginQuery", (void**)&glBeginQuery); + LoadFunction("glEndQuery", (void**)&glEndQuery); + LoadFunction("glGetQueryObjectuiv", (void**)&glGetQueryObjectuiv); + LoadFunction("glDeleteQueries", (void**)&glDeleteQueries); + LoadFunction("glGenQueries", (void**)&glGenQueries); + + LoadFunction("glMapBufferRange", (void**)&glMapBufferRange); + LoadFunction("glBindBufferRange", (void**)&glBindBufferRange); + LoadFunction("glBlitFramebuffer", (void**)&glBlitFramebuffer); + + LoadFunction("glGenVertexArrays", (void**)&glGenVertexArrays); + LoadFunction("glDeleteVertexArrays", (void**)&glDeleteVertexArrays); + LoadFunction("glBindVertexArray", (void**)&glBindVertexArray); + + LoadFunction("glClientWaitSync", (void**)&glClientWaitSync); + LoadFunction("glDeleteSync", (void**)&glDeleteSync); + LoadFunction("glFenceSync", (void**)&glFenceSync); + + LoadFunction("glSamplerParameterf", (void**)&glSamplerParameterf); + LoadFunction("glSamplerParameteri", (void**)&glSamplerParameteri); + LoadFunction("glSamplerParameterfv", (void**)&glSamplerParameterfv); + LoadFunction("glBindSampler", (void**)&glBindSampler); + LoadFunction("glDeleteSamplers", (void**)&glDeleteSamplers); + LoadFunction("glGenSamplers", (void**)&glGenSamplers); + + LoadFunction("glGetProgramBinary", (void**)&glGetProgramBinary); + LoadFunction("glProgramBinary", (void**)&glProgramBinary); + LoadFunction("glProgramParameteri", (void**)&glProgramParameteri); + + LoadFunction("glDrawRangeElements", (void**)&glDrawRangeElements); + + LoadFunction("glRenderbufferStorageMultisample", (void**)&glRenderbufferStorageMultisample); + + LoadFunction("glGetUniformBlockIndex", (void**)&glGetUniformBlockIndex); + LoadFunction("glUniformBlockBinding", (void**)&glUniformBlockBinding); + + } + dlclose(self); + } +} |
