From aa32c47e188e649ae5cefe33f3f734b9f880f1e0 Mon Sep 17 00:00:00 2001 From: omigamedev Date: Mon, 1 Jun 2026 17:50:51 +0200 Subject: [PATCH] Move OpenGL framebuffer diagnostics --- docs/modernization/build-inventory.md | 3 ++- docs/modernization/roadmap.md | 10 +++++--- src/renderer_gl/opengl_capabilities.cpp | 32 ++++++++++++++++++++++++ src/renderer_gl/opengl_capabilities.h | 1 + src/rtt.cpp | 15 ++--------- tests/renderer_gl/capabilities_tests.cpp | 20 +++++++++++++++ 6 files changed, 63 insertions(+), 18 deletions(-) diff --git a/docs/modernization/build-inventory.md b/docs/modernization/build-inventory.md index 60b5278..56a96fb 100644 --- a/docs/modernization/build-inventory.md +++ b/docs/modernization/build-inventory.md @@ -129,7 +129,8 @@ Known local toolchain state: GLES float/half-float extensions, WebGL exclusion behavior, and the upload-type mapping used by legacy `Texture2D` and `RTT` creation. It also validates image channel-count to OpenGL texture format mapping, including - invalid channel counts rejected by `Texture2D::create(Image)`. + invalid channel counts rejected by `Texture2D::create(Image)`, and + framebuffer status naming used by `RTT` diagnostics. - `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 9bb3f71..12b644b 100644 --- a/docs/modernization/roadmap.md +++ b/docs/modernization/roadmap.md @@ -389,9 +389,10 @@ catalog now consumed by the legacy OpenGL app initialization path. OpenGL capability detection for framebuffer fetch, map-buffer alignment, and float texture support. It also owns the OpenGL texture upload-type mapping used by legacy `Texture2D` and `RTT` creation, plus image channel-count to texture -format mapping for `Texture2D` image uploads. The legacy app delegates -extension and upload-format interpretation to that backend library, but the -existing renderer classes are not yet fully behind the renderer interfaces. +format mapping for `Texture2D` image uploads and framebuffer status naming for +`RTT` diagnostics. The legacy app delegates extension, upload-format, and +framebuffer diagnostic interpretation to that backend library, but the existing +renderer classes are not yet fully behind the renderer interfaces. Implementation tasks: @@ -631,7 +632,8 @@ Results: and Android arm64 configure/build, covering framebuffer fetch, map-buffer alignment, desktop GL core float support, GLES float/half-float extensions, WebGL exclusion behavior, upload types for RGBA8/RGBA16F/RGBA32F internal - formats, and image channel-count format mapping including invalid counts. + formats, image channel-count format mapping including invalid counts, and + framebuffer status names. - PowerShell analyze automation returns JSON summaries and includes the shader validation target. - `windows-msvc-vcpkg-headless` configured through the Visual Studio bundled diff --git a/src/renderer_gl/opengl_capabilities.cpp b/src/renderer_gl/opengl_capabilities.cpp index aefe7a5..1aedf3c 100644 --- a/src/renderer_gl/opengl_capabilities.cpp +++ b/src/renderer_gl/opengl_capabilities.cpp @@ -17,6 +17,14 @@ constexpr std::uint32_t gl_rgb8 = 0x8051U; constexpr std::uint32_t gl_rgba8 = 0x8058U; constexpr std::uint32_t gl_rgba32f = 0x8814U; constexpr std::uint32_t gl_rgba16f = 0x881AU; +constexpr std::uint32_t gl_framebuffer_complete = 0x8CD5U; +constexpr std::uint32_t gl_framebuffer_incomplete_attachment = 0x8CD6U; +constexpr std::uint32_t gl_framebuffer_incomplete_missing_attachment = 0x8CD7U; +constexpr std::uint32_t gl_framebuffer_incomplete_draw_buffer = 0x8CDBU; +constexpr std::uint32_t gl_framebuffer_incomplete_read_buffer = 0x8CDCU; +constexpr std::uint32_t gl_framebuffer_unsupported = 0x8CDDU; +constexpr std::uint32_t gl_framebuffer_undefined = 0x8219U; +constexpr std::uint32_t gl_framebuffer_incomplete_multisample = 0x8D56U; [[nodiscard]] bool contains(std::string_view text, std::string_view needle) noexcept { @@ -92,4 +100,28 @@ OpenGlPixelFormat texture_format_for_channel_count(std::uint32_t channel_count) } } +const char* framebuffer_status_name(std::uint32_t status) noexcept +{ + switch (status) { + case gl_framebuffer_complete: + return "GL_FRAMEBUFFER_COMPLETE"; + case gl_framebuffer_undefined: + return "GL_FRAMEBUFFER_UNDEFINED"; + case gl_framebuffer_incomplete_attachment: + return "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT"; + case gl_framebuffer_incomplete_missing_attachment: + return "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"; + case gl_framebuffer_incomplete_draw_buffer: + return "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER"; + case gl_framebuffer_incomplete_read_buffer: + return "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER"; + case gl_framebuffer_unsupported: + return "GL_FRAMEBUFFER_UNSUPPORTED"; + case gl_framebuffer_incomplete_multisample: + return "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE"; + default: + return "UNKNOWN"; + } +} + } diff --git a/src/renderer_gl/opengl_capabilities.h b/src/renderer_gl/opengl_capabilities.h index 1e8b896..847d4a0 100644 --- a/src/renderer_gl/opengl_capabilities.h +++ b/src/renderer_gl/opengl_capabilities.h @@ -32,5 +32,6 @@ struct OpenGlPixelFormat { [[nodiscard]] std::uint32_t texture_upload_type_for_internal_format(std::uint32_t internal_format) noexcept; [[nodiscard]] OpenGlPixelFormat texture_format_for_channel_count(std::uint32_t channel_count) noexcept; +[[nodiscard]] const char* framebuffer_status_name(std::uint32_t status) noexcept; } diff --git a/src/rtt.cpp b/src/rtt.cpp index 8384a41..537df31 100644 --- a/src/rtt.cpp +++ b/src/rtt.cpp @@ -244,22 +244,11 @@ bool RTT::create(int width, int height, int tex/* = -1*/, GLint internal_format, glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboID); } - auto err2str = [](GLenum err) { - switch (err) - { - case GL_FRAMEBUFFER_UNDEFINED: return "GL_FRAMEBUFFER_UNDEFINED"; - case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: return "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT"; - case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: return "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"; - case GL_FRAMEBUFFER_UNSUPPORTED: return "GL_FRAMEBUFFER_UNSUPPORTED"; - case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: return "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE"; - default: return "UNKNOWN"; - } - }; - // Check FBO status status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if (status != GL_FRAMEBUFFER_COMPLETE) - LOG("RTT::create failed because: %s", err2str(status)); + LOG("RTT::create failed because: %s", + pp::renderer::gl::framebuffer_status_name(static_cast(status))); // Switch back to window-system-provided framebuffer glBindFramebuffer(GL_FRAMEBUFFER, oldFboID); diff --git a/tests/renderer_gl/capabilities_tests.cpp b/tests/renderer_gl/capabilities_tests.cpp index 58eab31..6e248c1 100644 --- a/tests/renderer_gl/capabilities_tests.cpp +++ b/tests/renderer_gl/capabilities_tests.cpp @@ -114,6 +114,25 @@ void maps_image_channel_count_to_texture_format(pp::tests::Harness& h) PP_EXPECT(h, invalid.pixel_format == 0U); } +void names_framebuffer_status_codes(pp::tests::Harness& h) +{ + PP_EXPECT(h, pp::renderer::gl::framebuffer_status_name(0x8CD5U) == std::string_view("GL_FRAMEBUFFER_COMPLETE")); + PP_EXPECT(h, pp::renderer::gl::framebuffer_status_name(0x8219U) == std::string_view("GL_FRAMEBUFFER_UNDEFINED")); + PP_EXPECT(h, pp::renderer::gl::framebuffer_status_name(0x8CD6U) + == std::string_view("GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT")); + PP_EXPECT(h, pp::renderer::gl::framebuffer_status_name(0x8CD7U) + == std::string_view("GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT")); + PP_EXPECT(h, pp::renderer::gl::framebuffer_status_name(0x8CDBU) + == std::string_view("GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER")); + PP_EXPECT(h, pp::renderer::gl::framebuffer_status_name(0x8CDCU) + == std::string_view("GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER")); + PP_EXPECT(h, pp::renderer::gl::framebuffer_status_name(0x8CDDU) + == std::string_view("GL_FRAMEBUFFER_UNSUPPORTED")); + PP_EXPECT(h, pp::renderer::gl::framebuffer_status_name(0x8D56U) + == std::string_view("GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE")); + PP_EXPECT(h, pp::renderer::gl::framebuffer_status_name(0U) == std::string_view("UNKNOWN")); +} + } int main() @@ -125,5 +144,6 @@ int main() harness.run("ignores_gles_texture_extensions_for_webgl_runtime", ignores_gles_texture_extensions_for_webgl_runtime); harness.run("selects_texture_upload_type_from_internal_format", selects_texture_upload_type_from_internal_format); harness.run("maps_image_channel_count_to_texture_format", maps_image_channel_count_to_texture_format); + harness.run("names_framebuffer_status_codes", names_framebuffer_status_codes); return harness.finish(); }