From 3fcf6e053ab8bcc20af39f77b3013a87aec1dba6 Mon Sep 17 00:00:00 2001 From: "andrey.zhirnov" Date: Mon, 5 Aug 2019 12:31:24 +0300 Subject: [PATCH 1/6] added opengl4 support (for debugging with RenderDoc) --- headers/enduro2d/core/render.hpp | 3 +- .../core/render_impl/render_opengl.cpp | 18 ++++- .../core/render_impl/render_opengl_base.cpp | 8 +- .../core/render_impl/render_opengl_base.hpp | 1 + .../core/render_impl/render_opengl_impl.cpp | 73 +++++++++++++++++++ .../core/render_impl/render_opengl_impl.hpp | 9 +++ 6 files changed, 108 insertions(+), 4 deletions(-) diff --git a/headers/enduro2d/core/render.hpp b/headers/enduro2d/core/render.hpp index ea0dacef..7208ecbe 100644 --- a/headers/enduro2d/core/render.hpp +++ b/headers/enduro2d/core/render.hpp @@ -871,7 +871,8 @@ namespace e2d unknown, opengles2, opengles3, - opengl_compat + opengl2_compat, + opengl4_compat }; struct device_caps { diff --git a/sources/enduro2d/core/render_impl/render_opengl.cpp b/sources/enduro2d/core/render_impl/render_opengl.cpp index d1005bc6..64e36a2b 100644 --- a/sources/enduro2d/core/render_impl/render_opengl.cpp +++ b/sources/enduro2d/core/render_impl/render_opengl.cpp @@ -25,13 +25,20 @@ namespace precision highp int; precision highp float; )glsl"; - case e2d::render::api_profile::opengl_compat: + case e2d::render::api_profile::opengl2_compat: return R"glsl( #version 120 #define highp #define mediump #define lowp )glsl"; + case e2d::render::api_profile::opengl4_compat: + return R"glsl( + #version 410 core + #define texture2D texture + #define varying out + #define attribute in + )glsl"; default: E2D_ASSERT_MSG(false, "unexpected render API profile"); return ""; @@ -48,13 +55,20 @@ namespace precision mediump int; precision mediump float; )glsl"; - case e2d::render::api_profile::opengl_compat: + case e2d::render::api_profile::opengl2_compat: return R"glsl( #version 120 #define highp #define mediump #define lowp )glsl"; + case e2d::render::api_profile::opengl4_compat: + return R"glsl( + #version 410 core + #define texture2D texture + #define varying in + layout(location=0) out vec4 gl_FragColor; + )glsl"; default: E2D_ASSERT_MSG(false, "unexpected render API profile"); return ""; diff --git a/sources/enduro2d/core/render_impl/render_opengl_base.cpp b/sources/enduro2d/core/render_impl/render_opengl_base.cpp index ecab1d62..a4b89106 100644 --- a/sources/enduro2d/core/render_impl/render_opengl_base.cpp +++ b/sources/enduro2d/core/render_impl/render_opengl_base.cpp @@ -127,6 +127,7 @@ namespace gl_210 = 210 | gl_bit_, gl_300 = 300 | gl_bit_, + gl_410 = 410 | gl_bit_, gles_200 = 200 | gles_bit_, gles_300 = 300 | gles_bit_ }; @@ -1367,7 +1368,8 @@ namespace e2d::opengl caps.profile = version >= gl_version::gles_300 ? render::api_profile::opengles3 : version >= gl_version::gles_200 ? render::api_profile::opengles2 : - render::api_profile::opengl_compat; + version >= gl_version::gl_410 ? render::api_profile::opengl4_compat : + render::api_profile::opengl2_compat; caps.npot_texture_supported = version >= gl_version::gl_210 || @@ -1430,6 +1432,10 @@ namespace e2d::opengl gl_has_any_extension(debug, "GL_IMG_texture_compression_pvrtc2"); } + + bool gl_has_extension(debug& debug, str_view name) noexcept { + return gl_has_any_extension(debug, name); + } gl_shader_id gl_compile_shader( debug& debug, diff --git a/sources/enduro2d/core/render_impl/render_opengl_base.hpp b/sources/enduro2d/core/render_impl/render_opengl_base.hpp index aaaf1b83..8732f1f1 100644 --- a/sources/enduro2d/core/render_impl/render_opengl_base.hpp +++ b/sources/enduro2d/core/render_impl/render_opengl_base.hpp @@ -295,6 +295,7 @@ namespace e2d::opengl void gl_trace_info(debug& debug) noexcept; void gl_trace_limits(debug& debug) noexcept; void gl_fill_device_caps(debug& debug, render::device_caps& caps) noexcept; + bool gl_has_extension(debug& debug, str_view name) noexcept; gl_shader_id gl_compile_shader( debug& debug, diff --git a/sources/enduro2d/core/render_impl/render_opengl_impl.cpp b/sources/enduro2d/core/render_impl/render_opengl_impl.cpp index 3065a7e4..0da858a1 100644 --- a/sources/enduro2d/core/render_impl/render_opengl_impl.cpp +++ b/sources/enduro2d/core/render_impl/render_opengl_impl.cpp @@ -219,6 +219,7 @@ namespace e2d GL_CHECK_CODE(debug_, glPixelStorei(GL_PACK_ALIGNMENT, 1)); GL_CHECK_CODE(debug_, glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); + create_debug_output_(); reset_states(); reset_shader_program(); reset_render_target(); @@ -395,6 +396,78 @@ namespace e2d GL_CHECK_CODE(debug_, enable_or_disable(GL_DEPTH_TEST, cs.depth_test())); GL_CHECK_CODE(debug_, enable_or_disable(GL_STENCIL_TEST, cs.stencil_test())); } + + void render::internal_state::create_debug_output_() noexcept { + if ( !gl_has_extension(debug_, "GL_ARB_debug_output") ) { + return; + } + + GL_CHECK_CODE(debug_, glDebugMessageCallbackARB(debug_output_callback_, this)); + + // disable notifications + GL_CHECK_CODE(debug_, glDebugMessageControlARB( + GL_DONT_CARE, + GL_DONT_CARE, + GL_DEBUG_SEVERITY_NOTIFICATION, + 0, + nullptr, + GL_FALSE)); + } + + void render::internal_state::debug_output_callback_( + GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const GLchar* message, + const void* userParam) + { + if ( !userParam ) { + return; + } + + str msg; + switch ( severity ) { + case GL_DEBUG_SEVERITY_HIGH : msg += "[High]"; break; + case GL_DEBUG_SEVERITY_MEDIUM : msg += "[Medium]"; break; + case GL_DEBUG_SEVERITY_LOW : msg += "[Low]"; break; + case GL_DEBUG_SEVERITY_NOTIFICATION : msg += "[Notification]"; break; + } + + msg += " src: "; + switch ( source ) { + case GL_DEBUG_SOURCE_API : msg += "OpenGL"; break; + case GL_DEBUG_SOURCE_WINDOW_SYSTEM : msg += "OS"; break; + case GL_DEBUG_SOURCE_SHADER_COMPILER : msg += "GL_Compiler"; break; + case GL_DEBUG_SOURCE_THIRD_PARTY : msg += "Third_Party"; break; + case GL_DEBUG_SOURCE_APPLICATION : msg += "Application"; break; + case GL_DEBUG_SOURCE_OTHER : + default : msg += "Other"; break; + } + + msg += ", type: "; + switch ( type ) { + case GL_DEBUG_TYPE_ERROR : msg += "Error"; break; + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR : msg += "Deprecated"; break; + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR : msg += "Undefined_Behavior"; break; + case GL_DEBUG_TYPE_PORTABILITY : msg += "Portability"; break; + case GL_DEBUG_TYPE_PERFORMANCE : msg += "Performance"; break; + case GL_DEBUG_TYPE_MARKER : msg += "Marker"; break; + case GL_DEBUG_TYPE_PUSH_GROUP : msg += "Push_Group"; break; + case GL_DEBUG_TYPE_POP_GROUP : msg += "Pop_Group"; break; + case GL_DEBUG_TYPE_OTHER : + default : msg += "Other"; break; + } + + msg += "\n"; + + if ( message && length ) { + msg += str_view(message, length); + } + + static_cast(userParam)->debug_.trace(msg); + } } #endif diff --git a/sources/enduro2d/core/render_impl/render_opengl_impl.hpp b/sources/enduro2d/core/render_impl/render_opengl_impl.hpp index 8889f5cf..dd4112ba 100644 --- a/sources/enduro2d/core/render_impl/render_opengl_impl.hpp +++ b/sources/enduro2d/core/render_impl/render_opengl_impl.hpp @@ -190,6 +190,15 @@ namespace e2d void set_culling_state_(const culling_state& cs) noexcept; void set_blending_state_(const blending_state& bs) noexcept; void set_capabilities_state_(const capabilities_state& cs) noexcept; + void create_debug_output_() noexcept; + static void GLAPIENTRY debug_output_callback_( + GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const GLchar* message, + const void* userParam); private: debug& debug_; window& window_; From cff16a5cfa39e752a4f5afa19489a48d9570f8a9 Mon Sep 17 00:00:00 2001 From: "andrey.zhirnov" Date: Mon, 5 Aug 2019 12:32:51 +0300 Subject: [PATCH 2/6] removed index type unsigned_byte --- headers/enduro2d/core/render.hpp | 1 - samples/sources/sample_00/sample_00.cpp | 4 ++-- samples/sources/sample_01/sample_01.cpp | 4 ++-- samples/sources/sample_02/sample_02.cpp | 4 ++-- sources/enduro2d/core/render.cpp | 2 -- sources/enduro2d/core/render_impl/render_opengl.cpp | 1 - .../enduro2d/core/render_impl/render_opengl_base.cpp | 1 - .../systems/render_system_impl/render_system_base.hpp | 7 ------- untests/sources/untests_core/render.cpp | 10 ---------- 9 files changed, 6 insertions(+), 28 deletions(-) diff --git a/headers/enduro2d/core/render.hpp b/headers/enduro2d/core/render.hpp index 7208ecbe..3cfd7627 100644 --- a/headers/enduro2d/core/render.hpp +++ b/headers/enduro2d/core/render.hpp @@ -102,7 +102,6 @@ namespace e2d class index_declaration final { public: enum class index_type : u8 { - unsigned_byte, unsigned_short, unsigned_int }; diff --git a/samples/sources/sample_00/sample_00.cpp b/samples/sources/sample_00/sample_00.cpp index 2b57fd4f..c0fdfe8a 100644 --- a/samples/sources/sample_00/sample_00.cpp +++ b/samples/sources/sample_00/sample_00.cpp @@ -64,7 +64,7 @@ namespace } }; - std::array generate_quad_indices() noexcept { + std::array generate_quad_indices() noexcept { return {0, 1, 2, 2, 1, 3}; } @@ -111,7 +111,7 @@ namespace const auto indices = generate_quad_indices(); index_buffer_ = the().create_index_buffer( indices, - index_declaration::index_type::unsigned_byte, + index_declaration::index_type::unsigned_short, index_buffer::usage::static_draw); const auto vertices1 = generate_quad_vertices(texture1_->size()); diff --git a/samples/sources/sample_01/sample_01.cpp b/samples/sources/sample_01/sample_01.cpp index fd477224..ad548431 100644 --- a/samples/sources/sample_01/sample_01.cpp +++ b/samples/sources/sample_01/sample_01.cpp @@ -56,7 +56,7 @@ namespace } }; - std::array generate_cube_indices() noexcept { + std::array generate_cube_indices() noexcept { return { 0, 1, 2, 2, 3, 0, @@ -170,7 +170,7 @@ namespace const auto indices = generate_cube_indices(); index_buffer_ = the().create_index_buffer( indices, - index_declaration::index_type::unsigned_byte, + index_declaration::index_type::unsigned_short, index_buffer::usage::static_draw); const auto vertices1 = generate_cube_vertices(make_vec3(1.f)); diff --git a/samples/sources/sample_02/sample_02.cpp b/samples/sources/sample_02/sample_02.cpp index 0d9f11cc..749093fb 100644 --- a/samples/sources/sample_02/sample_02.cpp +++ b/samples/sources/sample_02/sample_02.cpp @@ -44,7 +44,7 @@ namespace } }; - std::array generate_cube_indices() noexcept { + std::array generate_cube_indices() noexcept { return { 0, 1, 2, 2, 3, 0, @@ -125,7 +125,7 @@ namespace const auto indices = generate_cube_indices(); index_buffer_ = the().create_index_buffer( indices, - index_declaration::index_type::unsigned_byte, + index_declaration::index_type::unsigned_short, index_buffer::usage::static_draw); const auto vertices = generate_cube_vertices(make_vec3(1.f)); diff --git a/sources/enduro2d/core/render.cpp b/sources/enduro2d/core/render.cpp index fa4c72f9..6acd0b12 100644 --- a/sources/enduro2d/core/render.cpp +++ b/sources/enduro2d/core/render.cpp @@ -59,7 +59,6 @@ namespace const char* index_element_cstr(index_declaration::index_type it) noexcept { #define DEFINE_CASE(x) case index_declaration::index_type::x: return #x; switch ( it ) { - DEFINE_CASE(unsigned_byte); DEFINE_CASE(unsigned_short); DEFINE_CASE(unsigned_int); default: @@ -72,7 +71,6 @@ namespace std::size_t index_element_size(index_declaration::index_type it) noexcept { #define DEFINE_CASE(x,y) case index_declaration::index_type::x: return y; switch ( it ) { - DEFINE_CASE(unsigned_byte, sizeof(u8)); DEFINE_CASE(unsigned_short, sizeof(u16)); DEFINE_CASE(unsigned_int, sizeof(u32)); default: diff --git a/sources/enduro2d/core/render_impl/render_opengl.cpp b/sources/enduro2d/core/render_impl/render_opengl.cpp index 64e36a2b..d45de142 100644 --- a/sources/enduro2d/core/render_impl/render_opengl.cpp +++ b/sources/enduro2d/core/render_impl/render_opengl.cpp @@ -1194,7 +1194,6 @@ namespace e2d E2D_ASSERT(is_in_main_thread()); const device_caps& caps = device_capabilities(); switch ( decl.type() ) { - case index_declaration::index_type::unsigned_byte: case index_declaration::index_type::unsigned_short: return true; case index_declaration::index_type::unsigned_int: diff --git a/sources/enduro2d/core/render_impl/render_opengl_base.cpp b/sources/enduro2d/core/render_impl/render_opengl_base.cpp index a4b89106..94ecba40 100644 --- a/sources/enduro2d/core/render_impl/render_opengl_base.cpp +++ b/sources/enduro2d/core/render_impl/render_opengl_base.cpp @@ -885,7 +885,6 @@ namespace e2d::opengl GLenum convert_index_type(index_declaration::index_type it) noexcept { #define DEFINE_CASE(x,y) case index_declaration::index_type::x: return y; switch ( it ) { - DEFINE_CASE(unsigned_byte, GL_UNSIGNED_BYTE); DEFINE_CASE(unsigned_short, GL_UNSIGNED_SHORT); DEFINE_CASE(unsigned_int, GL_UNSIGNED_INT); default: diff --git a/sources/enduro2d/high/systems/render_system_impl/render_system_base.hpp b/sources/enduro2d/high/systems/render_system_impl/render_system_base.hpp index 81900f63..90e447c6 100644 --- a/sources/enduro2d/high/systems/render_system_impl/render_system_base.hpp +++ b/sources/enduro2d/high/systems/render_system_impl/render_system_base.hpp @@ -10,13 +10,6 @@ namespace e2d::render_system_impl { - struct index_u8 { - using type = u8; - static index_declaration decl() noexcept { - return index_declaration::index_type::unsigned_byte; - } - }; - struct index_u16 { using type = u16; static index_declaration decl() noexcept { diff --git a/untests/sources/untests_core/render.cpp b/untests/sources/untests_core/render.cpp index 317024ae..93c0d55c 100644 --- a/untests/sources/untests_core/render.cpp +++ b/untests/sources/untests_core/render.cpp @@ -114,21 +114,11 @@ TEST_CASE("render"){ REQUIRE(id2.type() == index_declaration::index_type::unsigned_short); REQUIRE(id2.bytes_per_index() == 2); - index_declaration id3(index_declaration::index_type::unsigned_byte); - REQUIRE(id3.type() == index_declaration::index_type::unsigned_byte); - REQUIRE(id3.bytes_per_index() == 1); - REQUIRE(id == id2); - REQUIRE_FALSE(id == id3); - REQUIRE_FALSE(id != id2); - REQUIRE(id != id3); index_declaration id4 = id; REQUIRE(id4 == id2); - id4 = id3; - REQUIRE(id4 != id2); - REQUIRE(id4 == id3); } SECTION("vertex_declaration"){ vertex_declaration vd; From 1d6e770cda41aad46e43ac3748616a5fa02cc629 Mon Sep 17 00:00:00 2001 From: azhirnov Date: Wed, 25 Sep 2019 18:57:18 +0300 Subject: [PATCH 3/6] fixed warning with unnecessary gl_FragColor declaration, removed program validation --- sources/enduro2d/core/render_impl/render_opengl.cpp | 1 - sources/enduro2d/core/render_impl/render_opengl_base.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/sources/enduro2d/core/render_impl/render_opengl.cpp b/sources/enduro2d/core/render_impl/render_opengl.cpp index d45de142..0d79435d 100644 --- a/sources/enduro2d/core/render_impl/render_opengl.cpp +++ b/sources/enduro2d/core/render_impl/render_opengl.cpp @@ -67,7 +67,6 @@ namespace #version 410 core #define texture2D texture #define varying in - layout(location=0) out vec4 gl_FragColor; )glsl"; default: E2D_ASSERT_MSG(false, "unexpected render API profile"); diff --git a/sources/enduro2d/core/render_impl/render_opengl_base.cpp b/sources/enduro2d/core/render_impl/render_opengl_base.cpp index 94ecba40..2dde3afc 100644 --- a/sources/enduro2d/core/render_impl/render_opengl_base.cpp +++ b/sources/enduro2d/core/render_impl/render_opengl_base.cpp @@ -1479,7 +1479,6 @@ namespace e2d::opengl GL_CHECK_CODE(debug, glLinkProgram(*id)); return process_program_linking_result(debug, *id) - && process_program_validation_result(debug, *id) ? std::move(id) : gl_program_id(debug); } From 46c5c1b9b7504c8bcb33516401efccbd800350c7 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Mon, 30 Sep 2019 22:08:55 +0700 Subject: [PATCH 4/6] opengl debug output refactoring --- .clang_complete | 10 ++ .../core/render_impl/render_opengl_base.cpp | 8 +- .../core/render_impl/render_opengl_base.hpp | 2 +- .../core/render_impl/render_opengl_impl.cpp | 158 +++++++++--------- .../core/render_impl/render_opengl_impl.hpp | 9 - 5 files changed, 98 insertions(+), 89 deletions(-) diff --git a/.clang_complete b/.clang_complete index 286ed8ce..f7822fca 100644 --- a/.clang_complete +++ b/.clang_complete @@ -1,4 +1,14 @@ -Iheaders -Isources + +-Imodules/ecs.hpp/headers +-Imodules/flat.hpp/headers +-Imodules/curly.hpp/headers +-Imodules/promise.hpp/headers + +-Imodules/glew/include +-Imodules/glfw/include +-Imodules/spine/spine-c/spine-c/include + -std=c++17 -stdlib=libc++ diff --git a/sources/enduro2d/core/render_impl/render_opengl_base.cpp b/sources/enduro2d/core/render_impl/render_opengl_base.cpp index 498e60ae..5d6c65d5 100644 --- a/sources/enduro2d/core/render_impl/render_opengl_base.cpp +++ b/sources/enduro2d/core/render_impl/render_opengl_base.cpp @@ -1334,6 +1334,10 @@ namespace e2d::opengl max_combined_texture_image_units); } + bool gl_has_extension(debug& debug, str_view name) noexcept { + return gl_has_any_extension(debug, name); + } + void gl_fill_device_caps(debug& debug, render::device_caps& caps) noexcept { GLint max_texture_size = 0; GLint max_renderbuffer_size = 0; @@ -1472,10 +1476,6 @@ namespace e2d::opengl gl_has_any_extension(debug, "GL_IMG_texture_compression_pvrtc2"); } - - bool gl_has_extension(debug& debug, str_view name) noexcept { - return gl_has_any_extension(debug, name); - } gl_shader_id gl_compile_shader( debug& debug, diff --git a/sources/enduro2d/core/render_impl/render_opengl_base.hpp b/sources/enduro2d/core/render_impl/render_opengl_base.hpp index f81b9c03..0f42de90 100644 --- a/sources/enduro2d/core/render_impl/render_opengl_base.hpp +++ b/sources/enduro2d/core/render_impl/render_opengl_base.hpp @@ -294,8 +294,8 @@ namespace e2d::opengl { void gl_trace_info(debug& debug) noexcept; void gl_trace_limits(debug& debug) noexcept; - void gl_fill_device_caps(debug& debug, render::device_caps& caps) noexcept; bool gl_has_extension(debug& debug, str_view name) noexcept; + void gl_fill_device_caps(debug& debug, render::device_caps& caps) noexcept; gl_shader_id gl_compile_shader( debug& debug, diff --git a/sources/enduro2d/core/render_impl/render_opengl_impl.cpp b/sources/enduro2d/core/render_impl/render_opengl_impl.cpp index 0da858a1..14d8d002 100644 --- a/sources/enduro2d/core/render_impl/render_opengl_impl.cpp +++ b/sources/enduro2d/core/render_impl/render_opengl_impl.cpp @@ -13,6 +13,86 @@ namespace { using namespace e2d; using namespace e2d::opengl; + + const char* debug_output_severity_to_cstr(GLenum severity) noexcept { + switch ( severity ) { + case GL_DEBUG_SEVERITY_HIGH: return "high"; + case GL_DEBUG_SEVERITY_MEDIUM: return "medium"; + case GL_DEBUG_SEVERITY_LOW: return "low"; + case GL_DEBUG_SEVERITY_NOTIFICATION: return "notification"; + default: return "unknown"; + } + } + + const char* debug_output_source_to_cstr(GLenum source) noexcept { + switch (source) { + case GL_DEBUG_SOURCE_API: return "API"; + case GL_DEBUG_SOURCE_WINDOW_SYSTEM: return "window system"; + case GL_DEBUG_SOURCE_SHADER_COMPILER: return "shader compiler"; + case GL_DEBUG_SOURCE_THIRD_PARTY: return "third party"; + case GL_DEBUG_SOURCE_APPLICATION: return "application"; + case GL_DEBUG_SOURCE_OTHER: return "other"; + default: return "unknown"; + } + } + + const char* debug_output_type_to_cstr(GLenum type) noexcept { + switch ( type ) { + case GL_DEBUG_TYPE_ERROR: return "error"; + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: return "deprecated behavior"; + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: return "undefined behavior"; + case GL_DEBUG_TYPE_PORTABILITY: return "portability"; + case GL_DEBUG_TYPE_PERFORMANCE: return "performance"; + case GL_DEBUG_TYPE_OTHER: return "other"; + case GL_DEBUG_TYPE_MARKER: return "marker"; + case GL_DEBUG_TYPE_PUSH_GROUP: return "push group"; + case GL_DEBUG_TYPE_POP_GROUP: return "pop group"; + default: return "unknown"; + } + } + + void debug_output_callback( + GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const GLchar* message, + const void* user_param) noexcept + { + if ( !length || !message || !user_param ) { + return; + } + + const_cast(static_cast(user_param))->trace( + "RENDER: Debug output message:\n" + "--> Id: %0\n" + "--> Severity: %1\n" + "--> Source: %2\n" + "--> Type: %3\n" + "--> Message: %4\n", + id, + debug_output_severity_to_cstr(severity), + debug_output_source_to_cstr(source), + debug_output_type_to_cstr(type), + str_view(message, length)); + } + + void setup_debug_output(debug& debug) noexcept { + if ( !gl_has_extension(debug, "GL_KHR_debug") ) { + return; + } + + GL_CHECK_CODE(debug, glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS)); + GL_CHECK_CODE(debug, glDebugMessageCallback(debug_output_callback, &debug)); + GL_CHECK_CODE(debug, glDebugMessageControl( + GL_DONT_CARE, + GL_DONT_CARE, + GL_DEBUG_SEVERITY_NOTIFICATION, + 0, + nullptr, + GL_FALSE)); + } } namespace e2d @@ -216,10 +296,10 @@ namespace e2d gl_trace_limits(debug_); gl_fill_device_caps(debug_, device_caps_); + setup_debug_output(debug_); GL_CHECK_CODE(debug_, glPixelStorei(GL_PACK_ALIGNMENT, 1)); GL_CHECK_CODE(debug_, glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); - create_debug_output_(); reset_states(); reset_shader_program(); reset_render_target(); @@ -240,7 +320,7 @@ namespace e2d const render_target_ptr& render::internal_state::render_target() const noexcept { return render_target_; } - + render::internal_state& render::internal_state::reset_states() noexcept { set_depth_state_(state_block_.depth()); set_stencil_state_(state_block_.stencil()); @@ -308,7 +388,7 @@ namespace e2d GL_CHECK_CODE(debug_, glBindFramebuffer(rt_id.target(), *rt_id)); return *this; } - + render::internal_state& render::internal_state::set_render_target(const render_target_ptr& rt) noexcept { if ( rt == render_target_ ) { return *this; @@ -396,78 +476,6 @@ namespace e2d GL_CHECK_CODE(debug_, enable_or_disable(GL_DEPTH_TEST, cs.depth_test())); GL_CHECK_CODE(debug_, enable_or_disable(GL_STENCIL_TEST, cs.stencil_test())); } - - void render::internal_state::create_debug_output_() noexcept { - if ( !gl_has_extension(debug_, "GL_ARB_debug_output") ) { - return; - } - - GL_CHECK_CODE(debug_, glDebugMessageCallbackARB(debug_output_callback_, this)); - - // disable notifications - GL_CHECK_CODE(debug_, glDebugMessageControlARB( - GL_DONT_CARE, - GL_DONT_CARE, - GL_DEBUG_SEVERITY_NOTIFICATION, - 0, - nullptr, - GL_FALSE)); - } - - void render::internal_state::debug_output_callback_( - GLenum source, - GLenum type, - GLuint id, - GLenum severity, - GLsizei length, - const GLchar* message, - const void* userParam) - { - if ( !userParam ) { - return; - } - - str msg; - switch ( severity ) { - case GL_DEBUG_SEVERITY_HIGH : msg += "[High]"; break; - case GL_DEBUG_SEVERITY_MEDIUM : msg += "[Medium]"; break; - case GL_DEBUG_SEVERITY_LOW : msg += "[Low]"; break; - case GL_DEBUG_SEVERITY_NOTIFICATION : msg += "[Notification]"; break; - } - - msg += " src: "; - switch ( source ) { - case GL_DEBUG_SOURCE_API : msg += "OpenGL"; break; - case GL_DEBUG_SOURCE_WINDOW_SYSTEM : msg += "OS"; break; - case GL_DEBUG_SOURCE_SHADER_COMPILER : msg += "GL_Compiler"; break; - case GL_DEBUG_SOURCE_THIRD_PARTY : msg += "Third_Party"; break; - case GL_DEBUG_SOURCE_APPLICATION : msg += "Application"; break; - case GL_DEBUG_SOURCE_OTHER : - default : msg += "Other"; break; - } - - msg += ", type: "; - switch ( type ) { - case GL_DEBUG_TYPE_ERROR : msg += "Error"; break; - case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR : msg += "Deprecated"; break; - case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR : msg += "Undefined_Behavior"; break; - case GL_DEBUG_TYPE_PORTABILITY : msg += "Portability"; break; - case GL_DEBUG_TYPE_PERFORMANCE : msg += "Performance"; break; - case GL_DEBUG_TYPE_MARKER : msg += "Marker"; break; - case GL_DEBUG_TYPE_PUSH_GROUP : msg += "Push_Group"; break; - case GL_DEBUG_TYPE_POP_GROUP : msg += "Pop_Group"; break; - case GL_DEBUG_TYPE_OTHER : - default : msg += "Other"; break; - } - - msg += "\n"; - - if ( message && length ) { - msg += str_view(message, length); - } - - static_cast(userParam)->debug_.trace(msg); - } } #endif diff --git a/sources/enduro2d/core/render_impl/render_opengl_impl.hpp b/sources/enduro2d/core/render_impl/render_opengl_impl.hpp index 428cac4b..2baf3d5f 100644 --- a/sources/enduro2d/core/render_impl/render_opengl_impl.hpp +++ b/sources/enduro2d/core/render_impl/render_opengl_impl.hpp @@ -190,15 +190,6 @@ namespace e2d void set_culling_state_(const culling_state& cs) noexcept; void set_blending_state_(const blending_state& bs) noexcept; void set_capabilities_state_(const capabilities_state& cs) noexcept; - void create_debug_output_() noexcept; - static void GLAPIENTRY debug_output_callback_( - GLenum source, - GLenum type, - GLuint id, - GLenum severity, - GLsizei length, - const GLchar* message, - const void* userParam); private: debug& debug_; window& window_; From 75431254343615824ba28a86912b87cc8f221a9c Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Tue, 1 Oct 2019 06:57:16 +0700 Subject: [PATCH 5/6] use 3.2 opengl instead 4.1 for renderdoc debugging --- headers/enduro2d/core/render.hpp | 8 +- .../core/render_impl/render_opengl.cpp | 20 ++--- .../core/render_impl/render_opengl_base.cpp | 74 ++++++++++++------- .../core/render_impl/render_opengl_impl.cpp | 2 +- 4 files changed, 64 insertions(+), 40 deletions(-) diff --git a/headers/enduro2d/core/render.hpp b/headers/enduro2d/core/render.hpp index df40d660..92ba76a8 100644 --- a/headers/enduro2d/core/render.hpp +++ b/headers/enduro2d/core/render.hpp @@ -880,10 +880,10 @@ namespace e2d enum class api_profile { unknown, - opengles2, - opengles3, - opengl2_compat, - opengl4_compat + gles_2_0, + gles_3_0, + gl_2_1_compat, + gl_3_2_compat }; struct device_caps { diff --git a/sources/enduro2d/core/render_impl/render_opengl.cpp b/sources/enduro2d/core/render_impl/render_opengl.cpp index afa27961..ffee255c 100644 --- a/sources/enduro2d/core/render_impl/render_opengl.cpp +++ b/sources/enduro2d/core/render_impl/render_opengl.cpp @@ -19,22 +19,22 @@ namespace switch ( profile ) { case e2d::render::api_profile::unknown: return ""; - case e2d::render::api_profile::opengles2: - case e2d::render::api_profile::opengles3: + case e2d::render::api_profile::gles_2_0: + case e2d::render::api_profile::gles_3_0: return R"glsl( precision highp int; precision highp float; )glsl"; - case e2d::render::api_profile::opengl2_compat: + case e2d::render::api_profile::gl_2_1_compat: return R"glsl( #version 120 #define highp #define mediump #define lowp )glsl"; - case e2d::render::api_profile::opengl4_compat: + case e2d::render::api_profile::gl_3_2_compat: return R"glsl( - #version 410 core + #version 150 #define texture2D texture #define varying out #define attribute in @@ -49,22 +49,22 @@ namespace switch ( profile ) { case e2d::render::api_profile::unknown: return ""; - case e2d::render::api_profile::opengles2: - case e2d::render::api_profile::opengles3: + case e2d::render::api_profile::gles_2_0: + case e2d::render::api_profile::gles_3_0: return R"glsl( precision mediump int; precision mediump float; )glsl"; - case e2d::render::api_profile::opengl2_compat: + case e2d::render::api_profile::gl_2_1_compat: return R"glsl( #version 120 #define highp #define mediump #define lowp )glsl"; - case e2d::render::api_profile::opengl4_compat: + case e2d::render::api_profile::gl_3_2_compat: return R"glsl( - #version 410 core + #version 150 #define texture2D texture #define varying in )glsl"; diff --git a/sources/enduro2d/core/render_impl/render_opengl_base.cpp b/sources/enduro2d/core/render_impl/render_opengl_base.cpp index 5d6c65d5..33001bf9 100644 --- a/sources/enduro2d/core/render_impl/render_opengl_base.cpp +++ b/sources/enduro2d/core/render_impl/render_opengl_base.cpp @@ -125,11 +125,34 @@ namespace gl_bit_ = 1 << 28, gles_bit_ = 2 << 28, - gl_210 = 210 | gl_bit_, - gl_300 = 300 | gl_bit_, - gl_410 = 410 | gl_bit_, - gles_200 = 200 | gles_bit_, - gles_300 = 300 | gles_bit_ + gl_1_0 = 100 | gl_bit_, + gl_1_1 = 110 | gl_bit_, + gl_1_2 = 120 | gl_bit_, + gl_1_3 = 130 | gl_bit_, + gl_1_4 = 140 | gl_bit_, + gl_1_5 = 150 | gl_bit_, + + gl_2_0 = 200 | gl_bit_, + gl_2_1 = 210 | gl_bit_, + + gl_3_0 = 300 | gl_bit_, + gl_3_1 = 310 | gl_bit_, + gl_3_2 = 320 | gl_bit_, + gl_3_3 = 330 | gl_bit_, + + gl_4_0 = 400 | gl_bit_, + gl_4_1 = 410 | gl_bit_, + gl_4_2 = 420 | gl_bit_, + gl_4_3 = 430 | gl_bit_, + gl_4_4 = 440 | gl_bit_, + gl_4_5 = 450 | gl_bit_, + gl_4_6 = 460 | gl_bit_, + + gles_2_0 = 200 | gles_bit_, + + gles_3_0 = 300 | gles_bit_, + gles_3_1 = 310 | gles_bit_, + gles_3_2 = 320 | gles_bit_ }; bool operator>=(gl_version lhs, gl_version rhs) noexcept { @@ -1395,56 +1418,56 @@ namespace e2d::opengl const gl_version version = gl_get_version(debug); caps.profile = - version >= gl_version::gles_300 ? render::api_profile::opengles3 : - version >= gl_version::gles_200 ? render::api_profile::opengles2 : - version >= gl_version::gl_410 ? render::api_profile::opengl4_compat : - render::api_profile::opengl2_compat; + version >= gl_version::gles_3_0 ? render::api_profile::gles_3_0 : + version >= gl_version::gles_2_0 ? render::api_profile::gles_2_0 : + version >= gl_version::gl_3_2 ? render::api_profile::gl_3_2_compat : + render::api_profile::gl_2_1_compat; caps.npot_texture_supported = - version >= gl_version::gl_210 || // gl_200 - version >= gl_version::gles_300 || + version >= gl_version::gl_2_0 || + version >= gl_version::gles_3_0 || gl_has_any_extension(debug, "GL_OES_texture_npot", "GL_ARB_texture_non_power_of_two"); caps.depth_texture_supported = - version >= gl_version::gl_210 || - version >= gl_version::gles_300 || + version >= gl_version::gl_1_4 || + version >= gl_version::gles_3_0 || gl_has_any_extension(debug, "GL_OES_depth_texture", - "GL_ARB_depth_texture"); // gl_140 + "GL_ARB_depth_texture"); caps.render_target_supported = - version >= gl_version::gl_300 || // gl_300 - version >= gl_version::gles_200 || + version >= gl_version::gl_3_0 || + version >= gl_version::gles_2_0 || gl_has_any_extension(debug, "GL_OES_framebuffer_object", "GL_EXT_framebuffer_object", "GL_ARB_framebuffer_object"); caps.element_index_uint = - version >= gl_version::gl_210 || // gl_100 - version >= gl_version::gles_300 || + version >= gl_version::gl_1_1 || + version >= gl_version::gles_3_0 || gl_has_any_extension(debug, "GL_OES_element_index_uint"); caps.depth16_supported = - version >= gl_version::gl_210 || // gl_140 - version >= gl_version::gles_300 || + version >= gl_version::gl_1_4 || + version >= gl_version::gles_3_0 || gl_has_any_extension(debug, "GL_OES_depth_texture", "GL_ARB_depth_texture"); caps.depth24_supported = - version >= gl_version::gl_210 || // gl_140 - version >= gl_version::gles_300 || + version >= gl_version::gl_1_4 || + version >= gl_version::gles_3_0 || gl_has_any_extension(debug, "GL_OES_depth24", "GL_ARB_depth_texture"); caps.depth24_stencil8_supported = - version >= gl_version::gl_300 || // gl_300 - version >= gl_version::gles_300 || + version >= gl_version::gl_3_0 || + version >= gl_version::gles_3_0 || gl_has_any_extension(debug, "GL_OES_packed_depth_stencil", "GL_EXT_packed_depth_stencil"); @@ -1458,7 +1481,8 @@ namespace e2d::opengl "GL_OES_compressed_ETC1_RGB8_texture"); caps.etc2_compression_supported = - version >= gl_version::gles_300 || + version >= gl_version::gl_4_3 || + version >= gl_version::gles_3_0 || gl_has_any_extension(debug, "GL_ARB_ES3_compatibility"); diff --git a/sources/enduro2d/core/render_impl/render_opengl_impl.cpp b/sources/enduro2d/core/render_impl/render_opengl_impl.cpp index 14d8d002..d6f0acd7 100644 --- a/sources/enduro2d/core/render_impl/render_opengl_impl.cpp +++ b/sources/enduro2d/core/render_impl/render_opengl_impl.cpp @@ -70,7 +70,7 @@ namespace "--> Severity: %1\n" "--> Source: %2\n" "--> Type: %3\n" - "--> Message: %4\n", + "--> Message: %4", id, debug_output_severity_to_cstr(severity), debug_output_source_to_cstr(source), From 6f5fbad449905986157813a077d4d900162302eb Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Tue, 1 Oct 2019 06:58:17 +0700 Subject: [PATCH 6/6] fix few MSVC warnings --- .appveyor.yml | 2 +- samples/CMakeLists.txt | 8 ++++ scripts/gen_msvc2019_project.bat | 12 ++++++ .../core/render_impl/render_opengl_base.cpp | 18 --------- .../core/render_impl/render_opengl_impl.cpp | 2 +- .../enduro2d/high/systems/label_system.cpp | 2 +- untests/CMakeLists.txt | 38 +++++++------------ untests/sources/untests_utils/strings.cpp | 4 +- 8 files changed, 38 insertions(+), 48 deletions(-) create mode 100644 scripts/gen_msvc2019_project.bat diff --git a/.appveyor.yml b/.appveyor.yml index 5dd1c2d7..ef3c5c3e 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -5,7 +5,7 @@ environment: E2D_WITHOUT_GRAPHICS: true image: - Visual Studio 2017 - - Visual Studio 2019 Preview + - Visual Studio 2019 platform: - Win32 - x64 diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt index c44205a6..ff26c8b8 100644 --- a/samples/CMakeLists.txt +++ b/samples/CMakeLists.txt @@ -19,6 +19,14 @@ function(add_e2d_sample NAME) target_link_libraries(${SAMPLE_NAME} enduro2d) set_target_properties(${SAMPLE_NAME} PROPERTIES FOLDER samples) + target_compile_options(${SAMPLE_NAME} + PRIVATE + $<$: + /W3 /MP /bigobj> + PRIVATE + $<$,$,$>: + -Wall -Wextra -Wpedantic>) + # # resources # diff --git a/scripts/gen_msvc2019_project.bat b/scripts/gen_msvc2019_project.bat new file mode 100644 index 00000000..8991dea5 --- /dev/null +++ b/scripts/gen_msvc2019_project.bat @@ -0,0 +1,12 @@ +@echo off +set BUILD_DIR=%~dp0%\..\build +mkdir %BUILD_DIR%\msvc2019 || goto :error +cd %BUILD_DIR%\msvc2019 || goto :error +cmake -G "Visual Studio 16 2019" ..\.. || goto :error +start enduro2d.sln || goto :error + +goto :EOF + +:error +echo Failed with error #%errorlevel%. +exit /b %errorlevel% diff --git a/sources/enduro2d/core/render_impl/render_opengl_base.cpp b/sources/enduro2d/core/render_impl/render_opengl_base.cpp index 33001bf9..e7889380 100644 --- a/sources/enduro2d/core/render_impl/render_opengl_base.cpp +++ b/sources/enduro2d/core/render_impl/render_opengl_base.cpp @@ -78,24 +78,6 @@ namespace return success == GL_TRUE; } - bool process_program_validation_result(debug& debug, GLuint program) noexcept { - E2D_ASSERT(glIsProgram(program)); - GL_CHECK_CODE(debug, glValidateProgram(program)); - GLint success = GL_FALSE; - GL_CHECK_CODE(debug, glGetProgramiv(program, GL_VALIDATE_STATUS, &success)); - GLint log_len = 0; - GL_CHECK_CODE(debug, glGetProgramiv(program, GL_INFO_LOG_LENGTH, &log_len)); - if ( log_len > 0 ) { - GLchar* log_buffer = static_cast(E2D_ALLOCA( - sizeof(GLchar) * math::numeric_cast(log_len))); - GL_CHECK_CODE(debug, glGetProgramInfoLog( - program, log_len, nullptr, log_buffer)); - debug.log(success ? debug::level::warning : debug::level::error, - "RENDER: program validation info:\n--> %0", log_buffer); - } - return success == GL_TRUE; - } - template < typename... Ext > bool gl_has_any_extension(debug& debug, Ext... required) noexcept { const GLubyte* all_extensions = nullptr; diff --git a/sources/enduro2d/core/render_impl/render_opengl_impl.cpp b/sources/enduro2d/core/render_impl/render_opengl_impl.cpp index d6f0acd7..73b80778 100644 --- a/sources/enduro2d/core/render_impl/render_opengl_impl.cpp +++ b/sources/enduro2d/core/render_impl/render_opengl_impl.cpp @@ -51,7 +51,7 @@ namespace } } - void debug_output_callback( + void GLAPIENTRY debug_output_callback( GLenum source, GLenum type, GLuint id, diff --git a/sources/enduro2d/high/systems/label_system.cpp b/sources/enduro2d/high/systems/label_system.cpp index a0276ed1..2be21be9 100644 --- a/sources/enduro2d/high/systems/label_system.cpp +++ b/sources/enduro2d/high/systems/label_system.cpp @@ -26,7 +26,7 @@ namespace const b2f& texrect, const color32& color) { - const std::size_t start_vertex = vertices_.size(); + const u32 start_vertex = math::numeric_cast(vertices_.size()); // Y // ^ diff --git a/untests/CMakeLists.txt b/untests/CMakeLists.txt index 751707d9..31c07061 100644 --- a/untests/CMakeLists.txt +++ b/untests/CMakeLists.txt @@ -19,6 +19,14 @@ function(add_e2d_tests NAME) target_link_libraries(${TESTS_NAME} enduro2d) set_target_properties(${TESTS_NAME} PROPERTIES FOLDER untests) + target_compile_options(${TESTS_NAME} + PRIVATE + $<$: + /W3 /MP /bigobj> + PRIVATE + $<$,$,$>: + -Wall -Wextra -Wpedantic>) + # # resources # @@ -36,28 +44,8 @@ function(add_e2d_tests NAME) add_test(${TESTS_NAME} ${TESTS_NAME}) endfunction(add_e2d_tests) -option(E2D_BUILD_BASE_UNTESTS "Build base untests" ON) -option(E2D_BUILD_CORE_UNTESTS "Build core untests" ON) -option(E2D_BUILD_HIGH_UNTESTS "Build high untests" ON) -option(E2D_BUILD_MATH_UNTESTS "Build math untests" ON) -option(E2D_BUILD_UTILS_UNTESTS "Build utils untests" ON) - -if(E2D_BUILD_BASE_UNTESTS) - add_e2d_tests(base) -endif() - -if(E2D_BUILD_CORE_UNTESTS) - add_e2d_tests(core) -endif() - -if(E2D_BUILD_HIGH_UNTESTS) - add_e2d_tests(high) -endif() - -if(E2D_BUILD_MATH_UNTESTS) - add_e2d_tests(math) -endif() - -if(E2D_BUILD_UTILS_UNTESTS) - add_e2d_tests(utils) -endif() +add_e2d_tests(base) +add_e2d_tests(core) +add_e2d_tests(high) +add_e2d_tests(math) +add_e2d_tests(utils) diff --git a/untests/sources/untests_utils/strings.cpp b/untests/sources/untests_utils/strings.cpp index b8be3a53..cb32ff23 100644 --- a/untests/sources/untests_utils/strings.cpp +++ b/untests/sources/untests_utils/strings.cpp @@ -212,9 +212,9 @@ TEST_CASE("strings") { REQUIRE(wildcard_match( // 你好你好你好你好世界世界世界世界世界世界世界世界彡ಠ - mark_string("\u4F60\u597D\u4F60\u597D\u4F60\u597D\u4F60\u597D\u4E16\u754C\u4E16\u754C\u4E16\u754C\u4E16\u754C\u4E16\u754C\u4E16\u754C\u4E16\u754C\u4E16\u754C\u5F61\u0CA0"), + mark_string(u8"\u4F60\u597D\u4F60\u597D\u4F60\u597D\u4F60\u597D\u4E16\u754C\u4E16\u754C\u4E16\u754C\u4E16\u754C\u4E16\u754C\u4E16\u754C\u4E16\u754C\u4E16\u754C\u5F61\u0CA0"), // 你好你好你好你好*世界世界彡*ಠ - mark_pattern("\u4F60\u597D\u4F60\u597D\u4F60\u597D\u4F60\u597D*\u4E16\u754C\u4E16\u754C\u5F61*\u0CA0")) == true); + mark_pattern(u8"\u4F60\u597D\u4F60\u597D\u4F60\u597D\u4F60\u597D*\u4E16\u754C\u4E16\u754C\u5F61*\u0CA0")) == true); REQUIRE(wildcard_match("", "") == true); REQUIRE(wildcard_match("a", "") == false);