Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

glDebugMessageCallback not working #128

Open
cone-forest opened this issue Nov 26, 2024 · 3 comments
Open

glDebugMessageCallback not working #128

cone-forest opened this issue Nov 26, 2024 · 3 comments

Comments

@cone-forest
Copy link

Hi there!

I've been implementing simple 2D graphics editor using OpenGL and encountered a problem when using glDebugMessageCallback.
On linux calling glDebugMessageCallback causes linker errors since GLAD lib is located both in ImmVision and HelloImGui.
On windows calling glDebugMessageCallback causes segfault since glDebugMessageCallback is nullptr.

It is called in PostInit callback.
Everything else OpenGL-related works fine, only the glDebugMessageCallback causes troubles.
Is there a convenient way of enabling it?

The code can be found here: https://github.com/2b1g1c/my-paint/blob/core/rnd/src/app/app.cpp

@pthom
Copy link
Owner

pthom commented Dec 2, 2024

On linux calling glDebugMessageCallback causes linker errors since GLAD lib is located both in ImmVision and HelloImGui.

This is solved with this commit which changes the way glad is build (and now built only once. My bad!):

See

@pthom
Copy link
Owner

pthom commented Dec 2, 2024

Please please, when submitting issues, do include a minimal reproducible example. I had to do it for you in this case:

#include "imgui.h"
#include "hello_imgui/hello_imgui.h"
#include "immapp/immapp.h"
#include "hello_imgui/hello_imgui_include_opengl.h"

void glDebugOutput(
    std::uint32_t source, std::uint32_t type,
    std::uint32_t id, std::uint32_t severity,
    int length, const char *message,
    const void *userparam);

void gui()
{
    ImGui::Text("Hello, world!");
}


int main(int, char **)
{
    ImmApp::AddOnsParams addonsParams;
    HelloImGui::RunnerParams _runner_params;

    _runner_params.fpsIdling.enableIdling = false; // disable idling so that the shader runs at full speed
    _runner_params.appWindowParams.windowGeometry.size = {4000, 2000};
    _runner_params.appWindowParams.windowTitle = "CGSGFOREVER";
    // Do not create a default ImGui window, so that the shader occupies the whole display
    _runner_params.imGuiWindowParams.defaultImGuiWindowType = HelloImGui::DefaultImGuiWindowType::NoDefaultWindow;
    // PostInit is called after the ImGui context is created, and after OpenGL is initialized
    _runner_params.callbacks.PostInit = [&]() {
        glEnable(GL_SCISSOR_TEST);
        glClearColor(1, 1, 1, 1);
        glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
        glDebugMessageCallback(glDebugOutput, NULL);
    };
    _runner_params.callbacks.ShowGui = [&]() { gui(); }; // ShowGui is called every frame, and is used to display the ImGui widgets

    addonsParams.withMarkdown = true;

    ImmApp::Run(_runner_params, addonsParams);
}


// Disable sprintf warnings on MSVC, clang, and GCC
#pragma warning(disable : 4996)
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#pragma clang diagnostic ignored "-Wdeprecated-declarations"

void glDebugOutput(std::uint32_t source, std::uint32_t type,
                            std::uint32_t id, std::uint32_t severity,
                            int length, const char *message,
                            const void *userparam)
{
    int len = 0;
    static char Buf[10'000];

    len += sprintf(Buf + len, "Debug message (%i) %s\n", id, message);
    switch (source)
    {
        case GL_DEBUG_SOURCE_API:
            len += sprintf(Buf + len, "Source: API\n");
            break;
        case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
            len += sprintf(Buf + len, "Source: Window System\n");
            break;
        case GL_DEBUG_SOURCE_SHADER_COMPILER:
            len += sprintf(Buf + len, "Source: Shader Compiler\n");
            break;
        case GL_DEBUG_SOURCE_THIRD_PARTY:
            len += sprintf(Buf + len, "Source: Third Party\n");
            break;
        case GL_DEBUG_SOURCE_APPLICATION:
            len += sprintf(Buf + len, "Source: Application");
            break;
        case GL_DEBUG_SOURCE_OTHER:
            len += sprintf(Buf + len, "Source: Other");
            break;
    }
    len += sprintf(Buf + len, "\n");

    switch (type)
    {
        case GL_DEBUG_TYPE_ERROR:
            len += sprintf(Buf + len, "Type: Error");
            break;
        case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
            len += sprintf(Buf + len, "Type: Deprecated Behaviour");
            break;
        case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
            len += sprintf(Buf + len, "Type: Undefined Behaviour");
            break;
        case GL_DEBUG_TYPE_PORTABILITY:
            len += sprintf(Buf + len, "Type: Portability");
            break;
        case GL_DEBUG_TYPE_PERFORMANCE:
            len += sprintf(Buf + len, "Type: Performance");
            break;
        case GL_DEBUG_TYPE_MARKER:
            len += sprintf(Buf + len, "Type: Marker");
            break;
        case GL_DEBUG_TYPE_PUSH_GROUP:
            len += sprintf(Buf + len, "Type: Push Group");
            break;
        case GL_DEBUG_TYPE_POP_GROUP:
            len += sprintf(Buf + len, "Type: Pop Group");
            break;
        case GL_DEBUG_TYPE_OTHER:
            len += sprintf(Buf + len, "Type: Other");
            break;
    }
    len += sprintf(Buf + len, "\n");

    switch (severity)
    {
        case GL_DEBUG_SEVERITY_HIGH:
            len += sprintf(Buf + len, "Severity: high");
            break;
        case GL_DEBUG_SEVERITY_MEDIUM:
            len += sprintf(Buf + len, "Severity: medium");
            break;
        case GL_DEBUG_SEVERITY_LOW:
            len += sprintf(Buf + len, "Severity: low");
            break;
        case GL_DEBUG_SEVERITY_NOTIFICATION:
            len += sprintf(Buf + len, "Severity: notification");
            break;
    }
    len += sprintf(Buf + len, "\n\n");

    std::cout << Buf;
}

@pthom
Copy link
Owner

pthom commented Dec 2, 2024

Concerning your issue where glDebugMessageCallback is not available, you may have to regenerate the glad bindings:
https://glad.dav1d.de/

.. and activate the required debug extension and place them in hello_imgui/external/OpenGL_Loaders/glad

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants