Clear glErrors instead of crashing when initializing GLES3

This commit is contained in:
Marcel Admiraal 2021-06-21 10:11:33 +01:00
parent 296608460b
commit 8788472b8c
9 changed files with 84 additions and 81 deletions

View file

@ -829,8 +829,6 @@ public:
virtual bool is_low_end() const { return true; } virtual bool is_low_end() const { return true; }
virtual const char *gl_check_for_error(bool p_print_error = true) { return nullptr; }
RasterizerDummy() {} RasterizerDummy() {}
~RasterizerDummy() {} ~RasterizerDummy() {}
}; };

View file

@ -32,6 +32,7 @@
#include "core/os/os.h" #include "core/os/os.h"
#include "core/project_settings.h" #include "core/project_settings.h"
#include "drivers/gles2/rasterizer_gles2.h"
#include "drivers/gles_common/rasterizer_asserts.h" #include "drivers/gles_common/rasterizer_asserts.h"
#include "rasterizer_scene_gles2.h" #include "rasterizer_scene_gles2.h"
#include "servers/visual/visual_server_raster.h" #include "servers/visual/visual_server_raster.h"
@ -2320,6 +2321,7 @@ void RasterizerCanvasGLES2::gl_disable_scissor() const {
} }
void RasterizerCanvasGLES2::initialize() { void RasterizerCanvasGLES2::initialize() {
RasterizerGLES2::gl_check_errors();
RasterizerCanvasBaseGLES2::initialize(); RasterizerCanvasBaseGLES2::initialize();
batch_initialize(); batch_initialize();
@ -2359,6 +2361,7 @@ void RasterizerCanvasGLES2::initialize() {
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
} // only if there is a vertex buffer (batching is on) } // only if there is a vertex buffer (batching is on)
RasterizerGLES2::gl_check_errors();
} }
RasterizerCanvasGLES2::RasterizerCanvasGLES2() { RasterizerCanvasGLES2::RasterizerCanvasGLES2() {

View file

@ -475,40 +475,46 @@ void RasterizerGLES2::make_current() {
void RasterizerGLES2::register_config() { void RasterizerGLES2::register_config() {
} }
// returns NULL if no error, or an error string bool RasterizerGLES2::gl_check_errors() {
const char *RasterizerGLES2::gl_check_for_error(bool p_print_error) { bool error_found = false;
GLenum err = glGetError(); GLenum error = glGetError();
while (error != GL_NO_ERROR) {
const char *err_string = nullptr; switch (error) {
#ifdef DEBUG_ENABLED
switch (err) {
default: {
// not recognised
} break;
case GL_NO_ERROR: {
} break;
case GL_INVALID_ENUM: { case GL_INVALID_ENUM: {
err_string = "GL_INVALID_ENUM"; WARN_PRINT("GL_INVALID_ENUM: An unacceptable value is specified for an enumerated argument.");
} break; } break;
case GL_INVALID_VALUE: { case GL_INVALID_VALUE: {
err_string = "GL_INVALID_VALUE"; WARN_PRINT("GL_INVALID_VALUE: A numeric argument is out of range.");
} break; } break;
case GL_INVALID_OPERATION: { case GL_INVALID_OPERATION: {
err_string = "GL_INVALID_OPERATION"; WARN_PRINT("GL_INVALID_OPERATION: The specified operation is not allowed in the current state.");
} break; } break;
case GL_INVALID_FRAMEBUFFER_OPERATION: { case GL_INVALID_FRAMEBUFFER_OPERATION: {
err_string = "GL_INVALID_FRAMEBUFFER_OPERATION"; WARN_PRINT("GL_INVALID_FRAMEBUFFER_OPERATION: The framebuffer object is not complete.");
} break; } break;
#endif // DEBUG_ENABLED
case GL_OUT_OF_MEMORY: { case GL_OUT_OF_MEMORY: {
err_string = "GL_OUT_OF_MEMORY"; ERR_PRINT("GL_OUT_OF_MEMORY: There is not enough memory left to execute the command. The state of the GL is undefined.");
} break;
// GL_STACK_UNDERFLOW and GL_STACK_OVERFLOW are undefined in GLES2/gl2.h, which is used when not using GLAD.
//case GL_STACK_UNDERFLOW: {
// ERR_PRINT("GL_STACK_UNDERFLOW: An attempt has been made to perform an operation that would cause an internal stack to underflow.");
//} break;
//case GL_STACK_OVERFLOW: {
// ERR_PRINT("GL_STACK_OVERFLOW: An attempt has been made to perform an operation that would cause an internal stack to overflow.");
//} break;
default: {
#ifdef DEBUG_ENABLED
ERR_PRINT("Unrecognized GLError");
#endif // DEBUG_ENABLED
} break; } break;
} }
error_found = true;
if (p_print_error && err_string) { error = glGetError();
print_line(err_string);
} }
return err_string; return error_found;
} }
RasterizerGLES2::RasterizerGLES2() { RasterizerGLES2::RasterizerGLES2() {

View file

@ -70,7 +70,7 @@ public:
virtual bool is_low_end() const { return true; } virtual bool is_low_end() const { return true; }
virtual const char *gl_check_for_error(bool p_print_error = true); static bool gl_check_errors();
RasterizerGLES2(); RasterizerGLES2();
~RasterizerGLES2(); ~RasterizerGLES2();

View file

@ -30,6 +30,7 @@
#include "rasterizer_canvas_gles3.h" #include "rasterizer_canvas_gles3.h"
#include "drivers/gles3/rasterizer_gles3.h"
#include "drivers/gles_common/rasterizer_asserts.h" #include "drivers/gles_common/rasterizer_asserts.h"
#include "servers/visual/visual_server_raster.h" #include "servers/visual/visual_server_raster.h"
@ -65,11 +66,6 @@ void RasterizerCanvasGLES3::canvas_render_items(Item *p_item_list, int p_z, cons
batch_canvas_render_items(p_item_list, p_z, p_modulate, p_light, p_base_transform); batch_canvas_render_items(p_item_list, p_z, p_modulate, p_light, p_base_transform);
} }
void RasterizerCanvasGLES3::gl_checkerror() {
GLenum e = glGetError();
CRASH_COND(e != GL_NO_ERROR);
}
void RasterizerCanvasGLES3::gl_enable_scissor(int p_x, int p_y, int p_width, int p_height) const { void RasterizerCanvasGLES3::gl_enable_scissor(int p_x, int p_y, int p_width, int p_height) const {
glEnable(GL_SCISSOR_TEST); glEnable(GL_SCISSOR_TEST);
glScissor(p_x, p_y, p_width, p_height); glScissor(p_x, p_y, p_width, p_height);
@ -2127,8 +2123,6 @@ void RasterizerCanvasGLES3::_batch_render_generic(const Batch &p_batch, Rasteriz
glBindVertexArray(0); glBindVertexArray(0);
// gl_checkerror();
switch (tex.tile_mode) { switch (tex.tile_mode) {
case BatchTex::TILE_NORMAL: { case BatchTex::TILE_NORMAL: {
// if the texture is imported as tiled, no need to revert GL state // if the texture is imported as tiled, no need to revert GL state
@ -2149,7 +2143,7 @@ void RasterizerCanvasGLES3::_batch_render_generic(const Batch &p_batch, Rasteriz
} }
void RasterizerCanvasGLES3::initialize() { void RasterizerCanvasGLES3::initialize() {
gl_checkerror(); RasterizerGLES3::gl_check_errors();
RasterizerCanvasBaseGLES3::initialize(); RasterizerCanvasBaseGLES3::initialize();
batch_initialize(); batch_initialize();
@ -2280,7 +2274,7 @@ void RasterizerCanvasGLES3::initialize() {
state.canvas_shader.add_custom_define("#define USE_NINEPATCH_SCALING\n"); state.canvas_shader.add_custom_define("#define USE_NINEPATCH_SCALING\n");
} }
gl_checkerror(); RasterizerGLES3::gl_check_errors();
} }
RasterizerCanvasGLES3::RasterizerCanvasGLES3() { RasterizerCanvasGLES3::RasterizerCanvasGLES3() {

View file

@ -70,8 +70,6 @@ private:
void gl_enable_scissor(int p_x, int p_y, int p_width, int p_height) const; void gl_enable_scissor(int p_x, int p_y, int p_width, int p_height) const;
void gl_disable_scissor() const; void gl_disable_scissor() const;
void gl_checkerror();
public: public:
void initialize(); void initialize();
RasterizerCanvasGLES3(); RasterizerCanvasGLES3();

View file

@ -399,40 +399,46 @@ void RasterizerGLES3::make_current() {
void RasterizerGLES3::register_config() { void RasterizerGLES3::register_config() {
} }
// returns NULL if no error, or an error string bool RasterizerGLES3::gl_check_errors() {
const char *RasterizerGLES3::gl_check_for_error(bool p_print_error) { bool error_found = false;
GLenum err = glGetError(); GLenum error = glGetError();
while (error != GL_NO_ERROR) {
const char *err_string = nullptr; switch (error) {
#ifdef DEBUG_ENABLED
switch (err) {
default: {
// not recognised
} break;
case GL_NO_ERROR: {
} break;
case GL_INVALID_ENUM: { case GL_INVALID_ENUM: {
err_string = "GL_INVALID_ENUM"; WARN_PRINT("GL_INVALID_ENUM: An unacceptable value is specified for an enumerated argument.");
} break; } break;
case GL_INVALID_VALUE: { case GL_INVALID_VALUE: {
err_string = "GL_INVALID_VALUE"; WARN_PRINT("GL_INVALID_VALUE: A numeric argument is out of range.");
} break; } break;
case GL_INVALID_OPERATION: { case GL_INVALID_OPERATION: {
err_string = "GL_INVALID_OPERATION"; WARN_PRINT("GL_INVALID_OPERATION: The specified operation is not allowed in the current state.");
} break; } break;
case GL_INVALID_FRAMEBUFFER_OPERATION: { case GL_INVALID_FRAMEBUFFER_OPERATION: {
err_string = "GL_INVALID_FRAMEBUFFER_OPERATION"; WARN_PRINT("GL_INVALID_FRAMEBUFFER_OPERATION: The framebuffer object is not complete.");
} break; } break;
#endif // DEBUG_ENABLED
case GL_OUT_OF_MEMORY: { case GL_OUT_OF_MEMORY: {
err_string = "GL_OUT_OF_MEMORY"; ERR_PRINT("GL_OUT_OF_MEMORY: There is not enough memory left to execute the command. The state of the GL is undefined.");
} break;
// GL_STACK_UNDERFLOW and GL_STACK_OVERFLOW are undefined in GLES2/gl2.h, which is used when not using GLAD.
//case GL_STACK_UNDERFLOW: {
// ERR_PRINT("GL_STACK_UNDERFLOW: An attempt has been made to perform an operation that would cause an internal stack to underflow.");
//} break;
//case GL_STACK_OVERFLOW: {
// ERR_PRINT("GL_STACK_OVERFLOW: An attempt has been made to perform an operation that would cause an internal stack to overflow.");
//} break;
default: {
#ifdef DEBUG_ENABLED
ERR_PRINT("Unrecognized GLError");
#endif // DEBUG_ENABLED
} break; } break;
} }
error_found = true;
if (p_print_error && err_string) { error = glGetError();
print_line(err_string);
} }
return err_string; return error_found;
} }
RasterizerGLES3::RasterizerGLES3() { RasterizerGLES3::RasterizerGLES3() {

View file

@ -70,7 +70,7 @@ public:
virtual bool is_low_end() const { return false; } virtual bool is_low_end() const { return false; }
virtual const char *gl_check_for_error(bool p_print_error = true); static bool gl_check_errors();
RasterizerGLES3(); RasterizerGLES3();
~RasterizerGLES3(); ~RasterizerGLES3();

View file

@ -1157,8 +1157,6 @@ public:
virtual bool is_low_end() const = 0; virtual bool is_low_end() const = 0;
virtual const char *gl_check_for_error(bool p_print_error = true) = 0;
virtual ~Rasterizer() {} virtual ~Rasterizer() {}
}; };