summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/OGL/Src/GLFunctions.cpp
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2013-09-10 23:12:54 -0400
committerJasper St. Pierre <jstpierre@mecheye.net>2013-10-07 10:37:01 -0400
commita7c72081039ca1c6bee6b18db44fe4e9ffaf4fb5 (patch)
tree70e3c53d290bf5f0e76a2f3295b4ff01e07e2127 /Source/Core/VideoBackends/OGL/Src/GLFunctions.cpp
parentd6f0ecebb4742f6b41397420f7d58ab7a05a03cc (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.cpp138
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);
+ }
+}