summaryrefslogtreecommitdiff
path: root/include/mbgl/platform
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2015-05-12 14:35:26 -0700
committerJohn Firebaugh <john.firebaugh@gmail.com>2015-05-13 19:01:58 -0700
commita2344c36c372445ee230832a0b742ac5ee739eb1 (patch)
treec733e1fff4d4b7e7a914d19f0838aeaaf1ca3aa7 /include/mbgl/platform
parent0f7c6b0b52ac76db3bb0064b4230229d9def62a8 (diff)
downloadqtlocation-mapboxgl-a2344c36c372445ee230832a0b742ac5ee739eb1.tar.gz
Extensible GL extension support
Diffstat (limited to 'include/mbgl/platform')
-rw-r--r--include/mbgl/platform/gl.hpp147
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 *));
+
}
}