139 lines
4.7 KiB
C++
139 lines
4.7 KiB
C++
// 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);
|
|
}
|
|
}
|