From dbaf50cb6ea29160c3a4e1cbda7cfb3b83f38814 Mon Sep 17 00:00:00 2001 From: omigamedev Date: Tue, 2 Jun 2026 08:43:42 +0200 Subject: [PATCH] Move GL state utility mapping to renderer gl --- docs/modernization/build-inventory.md | 3 ++ docs/modernization/roadmap.md | 3 ++ src/renderer_gl/opengl_capabilities.cpp | 61 ++++++++++++++++++++++++ src/renderer_gl/opengl_capabilities.h | 7 +++ src/util.cpp | 56 ++++++++++------------ tests/renderer_gl/capabilities_tests.cpp | 14 ++++++ 6 files changed, 112 insertions(+), 32 deletions(-) diff --git a/docs/modernization/build-inventory.md b/docs/modernization/build-inventory.md index f48536c..1f00530 100644 --- a/docs/modernization/build-inventory.md +++ b/docs/modernization/build-inventory.md @@ -186,6 +186,9 @@ Known local toolchain state: backend-owned texture readback formats, sampler filters, depth/blend state, depth clears, viewport queries, color-mask booleans, active texture units, and float render-target formats. + Legacy `util.cpp` OpenGL error naming and `gl_state` save/restore also + consume backend-owned error codes, state queries, framebuffer targets, + texture binding targets, and active texture units. - `windows-msvc-vcpkg-headless` validates manifest install/configure/build/test for the current headless component matrix; see DEBT-0007 for remaining app and platform triplet migration. diff --git a/docs/modernization/roadmap.md b/docs/modernization/roadmap.md index a015ede..700b0ab 100644 --- a/docs/modernization/roadmap.md +++ b/docs/modernization/roadmap.md @@ -453,6 +453,9 @@ and RGBA8 read/write pixel mapping to `pp_renderer_gl`. readback formats, sampler filters, depth/blend state, depth clears, viewport queries, color-mask booleans, active texture units, and float render-target formats to `pp_renderer_gl`. +Legacy `util.cpp` OpenGL error naming and `gl_state` save/restore now delegate +error codes, state queries, framebuffer targets, texture binding targets, and +active texture units to `pp_renderer_gl`. The existing renderer classes are not yet fully behind the renderer interfaces. diff --git a/src/renderer_gl/opengl_capabilities.cpp b/src/renderer_gl/opengl_capabilities.cpp index a05c1e1..f7b85ef 100644 --- a/src/renderer_gl/opengl_capabilities.cpp +++ b/src/renderer_gl/opengl_capabilities.cpp @@ -11,6 +11,12 @@ constexpr std::uint32_t gl_unsigned_short = 0x1403U; constexpr std::uint32_t gl_unsigned_int = 0x1405U; constexpr std::uint32_t gl_float = 0x1406U; constexpr std::uint32_t gl_half_float = 0x140BU; +constexpr std::uint32_t gl_no_error = 0U; +constexpr std::uint32_t gl_invalid_enum = 0x0500U; +constexpr std::uint32_t gl_invalid_value = 0x0501U; +constexpr std::uint32_t gl_invalid_operation = 0x0502U; +constexpr std::uint32_t gl_out_of_memory = 0x0505U; +constexpr std::uint32_t gl_invalid_framebuffer_operation = 0x0506U; constexpr std::uint32_t gl_false = 0U; constexpr std::uint32_t gl_points = 0x0000U; constexpr std::uint32_t gl_lines = 0x0001U; @@ -40,6 +46,11 @@ constexpr std::uint32_t gl_blend = 0x0BE2U; constexpr std::uint32_t gl_color_clear_value = 0x0C22U; constexpr std::uint32_t gl_scissor_test = 0x0C11U; constexpr std::uint32_t gl_depth_test = 0x0B71U; +constexpr std::uint32_t gl_current_program = 0x8B8DU; +constexpr std::uint32_t gl_active_texture = 0x84E0U; +constexpr std::uint32_t gl_texture_binding_2d = 0x8069U; +constexpr std::uint32_t gl_texture_binding_cube_map = 0x8514U; +constexpr std::uint32_t gl_sampler_binding = 0x8919U; constexpr std::uint32_t gl_func_add = 0x8006U; constexpr std::uint32_t gl_max = 0x8008U; constexpr std::uint32_t gl_program_point_size = 0x8642U; @@ -159,6 +170,31 @@ std::uint32_t extension_string_name() noexcept return gl_extensions; } +std::uint32_t no_error_code() noexcept +{ + return gl_no_error; +} + +const char* opengl_error_name(std::uint32_t error_code) noexcept +{ + switch (error_code) { + case gl_no_error: + return "GL_NO_ERROR"; + case gl_invalid_enum: + return "GL_INVALID_ENUM"; + case gl_invalid_value: + return "GL_INVALID_VALUE"; + case gl_invalid_operation: + return "GL_INVALID_OPERATION"; + case gl_invalid_framebuffer_operation: + return "GL_INVALID_FRAMEBUFFER_OPERATION"; + case gl_out_of_memory: + return "GL_OUT_OF_MEMORY"; + default: + return "Unknown"; + } +} + std::uint32_t texture_upload_type_for_internal_format(std::uint32_t internal_format) noexcept { switch (internal_format) { @@ -496,6 +532,31 @@ std::uint32_t color_clear_value_query() noexcept return gl_color_clear_value; } +std::uint32_t current_program_query() noexcept +{ + return gl_current_program; +} + +std::uint32_t active_texture_query() noexcept +{ + return gl_active_texture; +} + +std::uint32_t texture_binding_2d_query() noexcept +{ + return gl_texture_binding_2d; +} + +std::uint32_t texture_binding_cube_map_query() noexcept +{ + return gl_texture_binding_cube_map; +} + +std::uint32_t sampler_binding_query() noexcept +{ + return gl_sampler_binding; +} + std::uint32_t blend_state() noexcept { return gl_blend; diff --git a/src/renderer_gl/opengl_capabilities.h b/src/renderer_gl/opengl_capabilities.h index 531571b..c16cfec 100644 --- a/src/renderer_gl/opengl_capabilities.h +++ b/src/renderer_gl/opengl_capabilities.h @@ -44,6 +44,8 @@ struct OpenGlReadbackFormat { [[nodiscard]] std::uint32_t extension_count_query() noexcept; [[nodiscard]] std::uint32_t extension_string_name() noexcept; +[[nodiscard]] std::uint32_t no_error_code() noexcept; +[[nodiscard]] const char* opengl_error_name(std::uint32_t error_code) noexcept; [[nodiscard]] std::uint32_t texture_upload_type_for_internal_format(std::uint32_t internal_format) noexcept; [[nodiscard]] std::uint32_t unsigned_byte_component_type() noexcept; [[nodiscard]] std::uint32_t rgba_pixel_format() noexcept; @@ -101,6 +103,11 @@ struct OpenGlReadbackFormat { [[nodiscard]] std::uint32_t shading_language_version_string_name() noexcept; [[nodiscard]] std::uint32_t viewport_query() noexcept; [[nodiscard]] std::uint32_t color_clear_value_query() noexcept; +[[nodiscard]] std::uint32_t current_program_query() noexcept; +[[nodiscard]] std::uint32_t active_texture_query() noexcept; +[[nodiscard]] std::uint32_t texture_binding_2d_query() noexcept; +[[nodiscard]] std::uint32_t texture_binding_cube_map_query() noexcept; +[[nodiscard]] std::uint32_t sampler_binding_query() noexcept; [[nodiscard]] std::uint32_t blend_state() noexcept; [[nodiscard]] std::uint32_t depth_test_state() noexcept; [[nodiscard]] std::uint32_t scissor_test_state() noexcept; diff --git a/src/util.cpp b/src/util.cpp index 36e2f74..1288f93 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -3,6 +3,7 @@ #include "util.h" #include #include "app.h" +#include "renderer_gl/opengl_capabilities.h" template<> std::vector poly_remove_duplicate(const std::vector& v, const float tollerance) @@ -628,16 +629,7 @@ std::string str_replace(const std::string& string, const std::string& search, co static const char* gl2str(GLenum err) { - switch (err) - { - case GL_NO_ERROR: return "GL_NO_ERROR"; - case GL_INVALID_ENUM: return "GL_INVALID_ENUM"; - case GL_INVALID_VALUE: return "GL_INVALID_VALUE"; - case GL_INVALID_OPERATION: return "GL_INVALID_OPERATION"; - case GL_INVALID_FRAMEBUFFER_OPERATION: return "GL_INVALID_FRAMEBUFFER_OPERATION"; - case GL_OUT_OF_MEMORY: return "GL_OUT_OF_MEMORY"; - default: return "Unknown"; - } + return pp::renderer::gl::opengl_error_name(err); } double now_seconds() @@ -657,7 +649,7 @@ double now_seconds() void check_OpenGLError(const char* stmt, const char* fname, int line) { GLenum err; - while ((err = glGetError()) != GL_NO_ERROR) + while ((err = glGetError()) != pp::renderer::gl::no_error_code()) { LOG("OpenGL error %08x (%s), at %s:%i - for %s", err, gl2str(err), fname, line, stmt); } @@ -735,41 +727,41 @@ void parallel_for(size_t nb_elements, std::function functor, boo void gl_state::save() { assert(App::I->is_render_thread()); - blend = glIsEnabled(GL_BLEND); - depth_test = glIsEnabled(GL_DEPTH_TEST); - scissor_test = glIsEnabled(GL_SCISSOR_TEST); - glGetIntegerv(GL_VIEWPORT, vp); - glGetFloatv(GL_COLOR_CLEAR_VALUE, cc); - glGetIntegerv(GL_CURRENT_PROGRAM, &program); - glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &fbd); - glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &fbr); - glGetIntegerv(GL_ACTIVE_TEXTURE, &active_tex); - glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP, &cube); + blend = glIsEnabled(pp::renderer::gl::blend_state()); + depth_test = glIsEnabled(pp::renderer::gl::depth_test_state()); + scissor_test = glIsEnabled(pp::renderer::gl::scissor_test_state()); + glGetIntegerv(pp::renderer::gl::viewport_query(), vp); + glGetFloatv(pp::renderer::gl::color_clear_value_query(), cc); + glGetIntegerv(pp::renderer::gl::current_program_query(), &program); + glGetIntegerv(pp::renderer::gl::draw_framebuffer_binding_query(), &fbd); + glGetIntegerv(pp::renderer::gl::read_framebuffer_binding_query(), &fbr); + glGetIntegerv(pp::renderer::gl::active_texture_query(), &active_tex); + glGetIntegerv(pp::renderer::gl::texture_binding_cube_map_query(), &cube); for (int i = 0; i < 10; ++i) { - glActiveTexture(GL_TEXTURE0 + i); - glGetIntegerv(GL_TEXTURE_BINDING_2D, tex + i); - glGetIntegerv(GL_SAMPLER_BINDING, sampler + i); + glActiveTexture(pp::renderer::gl::active_texture_unit(static_cast(i))); + glGetIntegerv(pp::renderer::gl::texture_binding_2d_query(), tex + i); + glGetIntegerv(pp::renderer::gl::sampler_binding_query(), sampler + i); } } void gl_state::restore() { assert(App::I->is_render_thread()); - blend ? glEnable(GL_BLEND) : glDisable(GL_BLEND); - depth_test ? glEnable(GL_DEPTH_TEST) : glDisable(GL_DEPTH_TEST); - scissor_test ? glEnable(GL_SCISSOR_TEST) : glDisable(GL_SCISSOR_TEST); + blend ? glEnable(pp::renderer::gl::blend_state()) : glDisable(pp::renderer::gl::blend_state()); + depth_test ? glEnable(pp::renderer::gl::depth_test_state()) : glDisable(pp::renderer::gl::depth_test_state()); + scissor_test ? glEnable(pp::renderer::gl::scissor_test_state()) : glDisable(pp::renderer::gl::scissor_test_state()); glViewport(vp[0], vp[1], vp[2], vp[3]); glClearColor(cc[0], cc[1], cc[2], cc[3]); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbd); - glBindFramebuffer(GL_READ_FRAMEBUFFER, fbr); + glBindFramebuffer(pp::renderer::gl::draw_framebuffer_target(), fbd); + glBindFramebuffer(pp::renderer::gl::read_framebuffer_target(), fbr); glUseProgram(program); for (int i = 0; i < 10; ++i) { - glActiveTexture(GL_TEXTURE0 + i); - glBindTexture(GL_TEXTURE_2D, tex[i]); + glActiveTexture(pp::renderer::gl::active_texture_unit(static_cast(i))); + glBindTexture(pp::renderer::gl::texture_2d_target(), tex[i]); glBindSampler(i, sampler[i]); } glActiveTexture(active_tex); - glBindTexture(GL_TEXTURE_CUBE_MAP, cube); + glBindTexture(pp::renderer::gl::texture_cube_map_target(), cube); } diff --git a/tests/renderer_gl/capabilities_tests.cpp b/tests/renderer_gl/capabilities_tests.cpp index 71eaf68..05e5273 100644 --- a/tests/renderer_gl/capabilities_tests.cpp +++ b/tests/renderer_gl/capabilities_tests.cpp @@ -18,6 +18,15 @@ void detects_common_extension_capabilities(pp::tests::Harness& h) PP_EXPECT(h, pp::renderer::gl::extension_count_query() == 0x821DU); PP_EXPECT(h, pp::renderer::gl::extension_string_name() == 0x1F03U); + PP_EXPECT(h, pp::renderer::gl::no_error_code() == 0U); + PP_EXPECT(h, pp::renderer::gl::opengl_error_name(0U) == std::string_view("GL_NO_ERROR")); + PP_EXPECT(h, pp::renderer::gl::opengl_error_name(0x0500U) == std::string_view("GL_INVALID_ENUM")); + PP_EXPECT(h, pp::renderer::gl::opengl_error_name(0x0501U) == std::string_view("GL_INVALID_VALUE")); + PP_EXPECT(h, pp::renderer::gl::opengl_error_name(0x0502U) == std::string_view("GL_INVALID_OPERATION")); + PP_EXPECT(h, pp::renderer::gl::opengl_error_name(0x0505U) == std::string_view("GL_OUT_OF_MEMORY")); + PP_EXPECT(h, pp::renderer::gl::opengl_error_name(0x0506U) + == std::string_view("GL_INVALID_FRAMEBUFFER_OPERATION")); + PP_EXPECT(h, pp::renderer::gl::opengl_error_name(0xffffffffU) == std::string_view("Unknown")); const auto capabilities = pp::renderer::gl::detect_opengl_capabilities( extensions, @@ -326,6 +335,11 @@ void maps_app_initialization_parameters(pp::tests::Harness& h) PP_EXPECT(h, pp::renderer::gl::viewport_query() == 0x0BA2U); PP_EXPECT(h, pp::renderer::gl::color_clear_value_query() == 0x0C22U); + PP_EXPECT(h, pp::renderer::gl::current_program_query() == 0x8B8DU); + PP_EXPECT(h, pp::renderer::gl::active_texture_query() == 0x84E0U); + PP_EXPECT(h, pp::renderer::gl::texture_binding_2d_query() == 0x8069U); + PP_EXPECT(h, pp::renderer::gl::texture_binding_cube_map_query() == 0x8514U); + PP_EXPECT(h, pp::renderer::gl::sampler_binding_query() == 0x8919U); PP_EXPECT(h, pp::renderer::gl::blend_state() == 0x0BE2U); PP_EXPECT(h, pp::renderer::gl::depth_test_state() == 0x0B71U); PP_EXPECT(h, pp::renderer::gl::scissor_test_state() == 0x0C11U);