diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2015-05-12 14:35:26 -0700 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2015-05-13 19:01:58 -0700 |
commit | a2344c36c372445ee230832a0b742ac5ee739eb1 (patch) | |
tree | c733e1fff4d4b7e7a914d19f0838aeaaf1ca3aa7 /include/mbgl/platform | |
parent | 0f7c6b0b52ac76db3bb0064b4230229d9def62a8 (diff) | |
download | qtlocation-mapboxgl-a2344c36c372445ee230832a0b742ac5ee739eb1.tar.gz |
Extensible GL extension support
Diffstat (limited to 'include/mbgl/platform')
-rw-r--r-- | include/mbgl/platform/gl.hpp | 147 |
1 files changed, 24 insertions, 123 deletions
diff --git a/include/mbgl/platform/gl.hpp b/include/mbgl/platform/gl.hpp index 1b842b0804..73f0801fa5 100644 --- a/include/mbgl/platform/gl.hpp +++ b/include/mbgl/platform/gl.hpp @@ -3,6 +3,7 @@ #include <string> #include <stdexcept> +#include <vector> #if __APPLE__ #include "TargetConditionals.h" @@ -44,137 +45,37 @@ void checkError(const char *cmd, const char *file, int line); #define MBGL_CHECK_ERROR(cmd) (cmd) #endif -// GL_KHR_debug / GL_ARB_debug_output -#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 -#define GL_DEBUG_SOURCE_API 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION 0x824A -#define GL_DEBUG_SOURCE_OTHER 0x824B -#define GL_DEBUG_TYPE_ERROR 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E -#define GL_DEBUG_TYPE_PORTABILITY 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 -#define GL_DEBUG_TYPE_OTHER 0x8251 -#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES 0x9145 -#define GL_DEBUG_SEVERITY_HIGH 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 -#define GL_DEBUG_SEVERITY_LOW 0x9148 -#define GL_DEBUG_TYPE_MARKER 0x8268 -#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 -#define GL_DEBUG_TYPE_POP_GROUP 0x826A -#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B -#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C -#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D -#define GL_BUFFER 0x82E0 -#define GL_SHADER 0x82E1 -#define GL_PROGRAM 0x82E2 -#define GL_QUERY 0x82E3 -#define GL_PROGRAM_PIPELINE 0x82E4 -#define GL_SAMPLER 0x82E6 -#define GL_MAX_LABEL_LENGTH 0x82E8 -#define GL_DEBUG_OUTPUT 0x92E0 -#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 -#define GL_DISPLAY_LIST 0x82E7 -#define GL_VERTEX_ARRAY 0x8074 -#define GL_TRANSFORM_FEEDBACK 0x8E22 -#define GL_TEXTURE 0x1702 -#define GL_RENDERBUFFER 0x8D41 -#define GL_FRAMEBUFFER 0x8D40 -typedef void (* GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam); -typedef void (* PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -typedef void (* PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -typedef void (* PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); -typedef GLuint (* PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -typedef void (* PFNGLGETPOINTERVPROC) (GLenum pname, void **params); -typedef void (* PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); -typedef void (* PFNGLPOPDEBUGGROUPPROC) (void); -typedef void (* PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); -typedef void (* PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); -typedef void (* PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label); -typedef void (* PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); -extern PFNGLDEBUGMESSAGECONTROLPROC DebugMessageControl; -extern PFNGLDEBUGMESSAGEINSERTPROC DebugMessageInsert; -extern PFNGLDEBUGMESSAGECALLBACKPROC DebugMessageCallback; -extern PFNGLGETDEBUGMESSAGELOGPROC GetDebugMessageLog; -extern PFNGLGETPOINTERVPROC GetPointerv; -extern PFNGLPUSHDEBUGGROUPPROC PushDebugGroup; -extern PFNGLPOPDEBUGGROUPPROC PopDebugGroup; -extern PFNGLOBJECTLABELPROC ObjectLabel; -extern PFNGLGETOBJECTLABELPROC GetObjectLabel; -extern PFNGLOBJECTPTRLABELPROC ObjectPtrLabel; -extern PFNGLGETOBJECTPTRLABELPROC GetObjectPtrLabel; -void debug_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam); - -// GL_EXT_debug_marker -typedef void (* PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); -typedef void (* PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); -typedef void (* PFNGLPOPGROUPMARKEREXTPROC) (void); -extern PFNGLINSERTEVENTMARKEREXTPROC InsertEventMarkerEXT; -extern PFNGLPUSHGROUPMARKEREXTPROC PushGroupMarkerEXT; -extern PFNGLPOPGROUPMARKEREXTPROC PopGroupMarkerEXT; - -// GL_EXT_debug_label -#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F -#define GL_PROGRAM_OBJECT_EXT 0x8B40 -#define GL_SHADER_OBJECT_EXT 0x8B48 -#define GL_BUFFER_OBJECT_EXT 0x9151 -#define GL_QUERY_OBJECT_EXT 0x9153 -#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 -typedef void (* PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); -typedef void (* PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); -extern PFNGLLABELOBJECTEXTPROC LabelObjectEXT; -extern PFNGLGETOBJECTLABELEXTPROC GetObjectLabelEXT; +class ExtensionFunctionBase { +public: + static std::vector<ExtensionFunctionBase*>& functions(); + typedef std::pair<const char *, const char *> Probe; + std::vector<Probe> probes; + void (*ptr)(); +}; -// GL_ARB_vertex_array_object / GL_OES_vertex_array_object -#define GL_VERTEX_ARRAY_BINDING 0x85B5 -typedef void (* PFNGLBINDVERTEXARRAYPROC) (GLuint array); -typedef void (* PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint* arrays); -typedef void (* PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays); -typedef GLboolean (* PFNGLISVERTEXARRAYPROC) (GLuint array); -extern PFNGLBINDVERTEXARRAYPROC BindVertexArray; -extern PFNGLDELETEVERTEXARRAYSPROC DeleteVertexArrays; -extern PFNGLGENVERTEXARRAYSPROC GenVertexArrays; -extern PFNGLISVERTEXARRAYPROC IsVertexArray; +template <class> +class ExtensionFunction; -// Debug group markers, useful for debugging on iOS -#if defined(DEBUG) -// static int indent = 0; -inline void start_group(const std::string &str) { - if (gl::PushDebugGroup != nullptr) { - MBGL_CHECK_ERROR(gl::PushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, GLsizei(str.size()), str.c_str())); - } else if (gl::PushGroupMarkerEXT != nullptr) { - MBGL_CHECK_ERROR(gl::PushGroupMarkerEXT(GLsizei(str.size() + 1), str.c_str())); +template <class R, class... Args> +class ExtensionFunction<R (Args...)> : protected ExtensionFunctionBase { +public: + ExtensionFunction(std::initializer_list<Probe> probes_) { + probes = probes_; + ExtensionFunctionBase::functions().push_back(this); } - // fprintf(stderr, "%s%s\n", std::string(indent * 4, ' ').c_str(), str.c_str()); - // indent++; -} -inline void end_group() { - if (gl::PopDebugGroup != nullptr) { - MBGL_CHECK_ERROR(gl::PopDebugGroup()); - } else if (gl::PopGroupMarkerEXT != nullptr) { - MBGL_CHECK_ERROR(gl::PopGroupMarkerEXT()); + explicit operator bool() const { + return ptr; } - // indent--; -} -#else -inline void start_group(const std::string &) {} -inline void end_group() {} -#endif -struct group { - inline group(const std::string &str) { start_group(str); } - ~group() { end_group(); }; + R operator()(Args... args) const { + return (*reinterpret_cast<R (*)(Args...)>(ptr))(std::forward<Args>(args)...); + } }; +using glProc = void (*)(); +void InitializeExtensions(glProc (*getProcAddress)(const char *)); + } } |