diff options
Diffstat (limited to 'drivers/gles3/rasterizer_gles3.cpp')
-rw-r--r-- | drivers/gles3/rasterizer_gles3.cpp | 144 |
1 files changed, 95 insertions, 49 deletions
diff --git a/drivers/gles3/rasterizer_gles3.cpp b/drivers/gles3/rasterizer_gles3.cpp index cc35ea72e2..c048e9bf37 100644 --- a/drivers/gles3/rasterizer_gles3.cpp +++ b/drivers/gles3/rasterizer_gles3.cpp @@ -76,19 +76,14 @@ #define CAN_DEBUG #endif -#if !defined(GLES_OVER_GL) && defined(CAN_DEBUG) -#include <GLES3/gl3.h> -#include <GLES3/gl3ext.h> -#include <GLES3/gl3platform.h> - -#include <EGL/egl.h> -#include <EGL/eglext.h> -#endif +#include "platform_gl.h" #if defined(MINGW_ENABLED) || defined(_MSC_VER) #define strcpy strcpy_s #endif +bool RasterizerGLES3::gles_over_gl = true; + void RasterizerGLES3::begin_frame(double frame_step) { frame++; delta = frame_step; @@ -115,6 +110,19 @@ void RasterizerGLES3::end_frame(bool p_swap_buffers) { } } +void RasterizerGLES3::clear_depth(float p_depth) { +#ifdef GL_API_ENABLED + if (is_gles_over_gl()) { + glClearDepth(p_depth); + } +#endif // GL_API_ENABLED +#ifdef GLES_API_ENABLED + if (!is_gles_over_gl()) { + glClearDepthf(p_depth); + } +#endif // GLES_API_ENABLED +} + #ifdef CAN_DEBUG static void GLAPIENTRY _gl_debug_print(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const GLvoid *userParam) { if (type == _EXT_DEBUG_TYPE_OTHER_ARB) { @@ -169,7 +177,7 @@ static void GLAPIENTRY _gl_debug_print(GLenum source, GLenum type, GLuint id, GL } #endif -typedef void (*DEBUGPROCARB)(GLenum source, +typedef void(GLAPIENTRY *DEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, @@ -177,7 +185,7 @@ typedef void (*DEBUGPROCARB)(GLenum source, const char *message, const void *userParam); -typedef void (*DebugMessageCallbackARB)(DEBUGPROCARB callback, const void *userParam); +typedef void(GLAPIENTRY *DebugMessageCallbackARB)(DEBUGPROCARB callback, const void *userParam); void RasterizerGLES3::initialize() { print_line(vformat("OpenGL API %s - Compatibility - Using Device: %s - %s", RS::get_singleton()->get_video_adapter_api_version(), RS::get_singleton()->get_video_adapter_vendor(), RS::get_singleton()->get_video_adapter_name())); @@ -200,61 +208,99 @@ void RasterizerGLES3::finalize() { RasterizerGLES3 *RasterizerGLES3::singleton = nullptr; +#ifdef EGL_ENABLED +void *_egl_load_function_wrapper(const char *p_name) { + return (void *)eglGetProcAddress(p_name); +} +#endif + RasterizerGLES3::RasterizerGLES3() { singleton = this; #ifdef GLAD_ENABLED - if (!gladLoaderLoadGL()) { - ERR_PRINT("Error initializing GLAD"); - // FIXME this is an early return from a constructor. Any other code using this instance will crash or the finalizer will crash, because none of - // the members of this instance are initialized, so this just makes debugging harder. It should either crash here intentionally, - // or we need to actually test for this situation before constructing this. - return; - } + bool glad_loaded = false; + +#ifdef EGL_ENABLED + // There should be a more flexible system for getting the GL pointer, as + // different DisplayServers can have different ways. We can just use the GLAD + // version global to see if it loaded for now though, otherwise we fall back to + // the generic loader below. +#if defined(EGL_STATIC) + bool has_egl = true; +#else + bool has_egl = (eglGetProcAddress != nullptr); #endif -#ifdef GLAD_ENABLED - if (OS::get_singleton()->is_stdout_verbose()) { - if (GLAD_GL_ARB_debug_output) { - glEnable(_EXT_DEBUG_OUTPUT_SYNCHRONOUS_ARB); - glDebugMessageCallbackARB(_gl_debug_print, nullptr); - glEnable(_EXT_DEBUG_OUTPUT); - } else { - print_line("OpenGL debugging not supported!"); + if (gles_over_gl) { + if (has_egl && !glad_loaded && gladLoadGL((GLADloadfunc)&_egl_load_function_wrapper)) { + glad_loaded = true; + } + } else { + if (has_egl && !glad_loaded && gladLoadGLES2((GLADloadfunc)&_egl_load_function_wrapper)) { + glad_loaded = true; + } + } +#endif // EGL_ENABLED + + if (gles_over_gl) { + if (!glad_loaded && gladLoaderLoadGL()) { + glad_loaded = true; + } + } else { + if (!glad_loaded && gladLoaderLoadGLES2()) { + glad_loaded = true; + } + } + + // FIXME this is an early return from a constructor. Any other code using this instance will crash or the finalizer will crash, because none of + // the members of this instance are initialized, so this just makes debugging harder. It should either crash here intentionally, + // or we need to actually test for this situation before constructing this. + ERR_FAIL_COND_MSG(!glad_loaded, "Error initializing GLAD."); + + if (gles_over_gl) { + if (OS::get_singleton()->is_stdout_verbose()) { + if (GLAD_GL_ARB_debug_output) { + glEnable(_EXT_DEBUG_OUTPUT_SYNCHRONOUS_ARB); + glDebugMessageCallbackARB((GLDEBUGPROCARB)_gl_debug_print, nullptr); + glEnable(_EXT_DEBUG_OUTPUT); + } else { + print_line("OpenGL debugging not supported!"); + } } } #endif // GLAD_ENABLED // For debugging #ifdef CAN_DEBUG -#ifdef GLES_OVER_GL - if (OS::get_singleton()->is_stdout_verbose() && GLAD_GL_ARB_debug_output) { - glDebugMessageControlARB(_EXT_DEBUG_SOURCE_API_ARB, _EXT_DEBUG_TYPE_ERROR_ARB, _EXT_DEBUG_SEVERITY_HIGH_ARB, 0, nullptr, GL_TRUE); - glDebugMessageControlARB(_EXT_DEBUG_SOURCE_API_ARB, _EXT_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB, _EXT_DEBUG_SEVERITY_HIGH_ARB, 0, nullptr, GL_TRUE); - glDebugMessageControlARB(_EXT_DEBUG_SOURCE_API_ARB, _EXT_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB, _EXT_DEBUG_SEVERITY_HIGH_ARB, 0, nullptr, GL_TRUE); - glDebugMessageControlARB(_EXT_DEBUG_SOURCE_API_ARB, _EXT_DEBUG_TYPE_PORTABILITY_ARB, _EXT_DEBUG_SEVERITY_HIGH_ARB, 0, nullptr, GL_TRUE); - glDebugMessageControlARB(_EXT_DEBUG_SOURCE_API_ARB, _EXT_DEBUG_TYPE_PERFORMANCE_ARB, _EXT_DEBUG_SEVERITY_HIGH_ARB, 0, nullptr, GL_TRUE); - glDebugMessageControlARB(_EXT_DEBUG_SOURCE_API_ARB, _EXT_DEBUG_TYPE_OTHER_ARB, _EXT_DEBUG_SEVERITY_HIGH_ARB, 0, nullptr, GL_TRUE); - // glDebugMessageInsertARB( - // GL_DEBUG_SOURCE_API_ARB, - // GL_DEBUG_TYPE_OTHER_ARB, 1, - // GL_DEBUG_SEVERITY_HIGH_ARB, 5, "hello"); - } -#else - if (OS::get_singleton()->is_stdout_verbose()) { - DebugMessageCallbackARB callback = (DebugMessageCallbackARB)eglGetProcAddress("glDebugMessageCallback"); - if (!callback) { - callback = (DebugMessageCallbackARB)eglGetProcAddress("glDebugMessageCallbackKHR"); +#ifdef GL_API_ENABLED + if (gles_over_gl) { + if (OS::get_singleton()->is_stdout_verbose() && GLAD_GL_ARB_debug_output) { + glDebugMessageControlARB(_EXT_DEBUG_SOURCE_API_ARB, _EXT_DEBUG_TYPE_ERROR_ARB, _EXT_DEBUG_SEVERITY_HIGH_ARB, 0, nullptr, GL_TRUE); + glDebugMessageControlARB(_EXT_DEBUG_SOURCE_API_ARB, _EXT_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB, _EXT_DEBUG_SEVERITY_HIGH_ARB, 0, nullptr, GL_TRUE); + glDebugMessageControlARB(_EXT_DEBUG_SOURCE_API_ARB, _EXT_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB, _EXT_DEBUG_SEVERITY_HIGH_ARB, 0, nullptr, GL_TRUE); + glDebugMessageControlARB(_EXT_DEBUG_SOURCE_API_ARB, _EXT_DEBUG_TYPE_PORTABILITY_ARB, _EXT_DEBUG_SEVERITY_HIGH_ARB, 0, nullptr, GL_TRUE); + glDebugMessageControlARB(_EXT_DEBUG_SOURCE_API_ARB, _EXT_DEBUG_TYPE_PERFORMANCE_ARB, _EXT_DEBUG_SEVERITY_HIGH_ARB, 0, nullptr, GL_TRUE); + glDebugMessageControlARB(_EXT_DEBUG_SOURCE_API_ARB, _EXT_DEBUG_TYPE_OTHER_ARB, _EXT_DEBUG_SEVERITY_HIGH_ARB, 0, nullptr, GL_TRUE); } + } +#endif // GL_API_ENABLED +#ifdef GLES_API_ENABLED + if (!gles_over_gl) { + if (OS::get_singleton()->is_stdout_verbose()) { + DebugMessageCallbackARB callback = (DebugMessageCallbackARB)eglGetProcAddress("glDebugMessageCallback"); + if (!callback) { + callback = (DebugMessageCallbackARB)eglGetProcAddress("glDebugMessageCallbackKHR"); + } - if (callback) { - print_line("godot: ENABLING GL DEBUG"); - glEnable(_EXT_DEBUG_OUTPUT_SYNCHRONOUS_ARB); - callback(_gl_debug_print, NULL); - glEnable(_EXT_DEBUG_OUTPUT); + if (callback) { + print_line("godot: ENABLING GL DEBUG"); + glEnable(_EXT_DEBUG_OUTPUT_SYNCHRONOUS_ARB); + callback((DEBUGPROCARB)_gl_debug_print, NULL); + glEnable(_EXT_DEBUG_OUTPUT); + } } } -#endif // GLES_OVER_GL +#endif // GLES_API_ENABLED #endif // CAN_DEBUG { |