*/}}
Explorar o código

GL debug option user interface

YimingWu hai 1 ano
pai
achega
2fd6a8724b
Modificáronse 4 ficheiros con 115 adicións e 40 borrados
  1. 10 0
      la_interface.h
  2. 73 40
      la_kernel.c
  3. 17 0
      resources/la_properties.c
  4. 15 0
      resources/la_templates.c

+ 10 - 0
la_interface.h

@@ -294,6 +294,7 @@ STRUCTURE(laInitArguments){
     int HasHistories;
     int HasTerminal;
     int HasAudio;
+    int GLDebug;
 };
 
 NEED_STRUCTURE(laAnimation);
@@ -351,6 +352,7 @@ STRUCTURE(LA){
     int WinTabAvailable, WinTabOpened, WinTabMaxPenPressure, WinTabMaxEraserPressure;
 #endif
 #ifdef __linux__
+    Window* win;
     XVisualInfo* xvi;
     GLXFBConfig BestFBC;
     Colormap cmap;
@@ -367,6 +369,11 @@ STRUCTURE(LA){
 
     int EnableColorManagement;
 
+    int EnableGLDebug;
+    int GLDebugSync;
+    int GLDebugLevel;
+    int GLDebugNeedsUpdate;
+
     laWindow *CurrentWindow;
     laPanel *CurrentPanel;
 
@@ -587,6 +594,7 @@ STRUCTURE(laWindow){
 
     SYSWINDOW* win;
     SYSGLCONTEXT glc;
+    int GLDebugNeedsUpdate;
     GLuint vao;
 #ifdef _WIN32
     HDC hdc;
@@ -1956,6 +1964,8 @@ laPropContainer* laUiHasExtraProps(laUiType *ut, int size, int Hyper);
 laPropContainer* laCanvasHasExtraProps(laCanvasTemplate *ct, int size, int Hyper);
 laUiType *la_RegisterUiType(const char *Identifer, int ForType, const char *UseOperator, laBoxedTheme **bt, laUiDrawFunc *Draw, laUiGetHeightFunc GetHeight, laUiInitFunc Init, laUiDestroyFunc Destroy);
 
+void la_NotifyGLDebugChanges();
+
 void laSetWindowCursor(int id);
 void laRenameWindow(laWindow* wnd, char* name);
 

+ 73 - 40
la_kernel.c

@@ -378,56 +378,77 @@ void la_DestroySystemWindowWin32(laWindow* w) {
 #endif
 
 
-void glDebugOutput(GLenum source, GLenum type, unsigned int id,
+void la_glDebugOutput(GLenum source, GLenum type, unsigned int id,
     GLenum severity, GLsizei length, const char* message, const void* userParam) {
     // ignore non-significant error/warning codes
-    if (id == 131169 || id == 131185 || id == 131218 || id == 131204) return;
+    if (id==131169 || id==131185 || id==131218 || id==131204 || id==131076) return;
 
-    printf("---------------\n");
-    printf("Debug message (%d): %s\n", id, message);
+    printf("GL %d: %s\n", id, message);
 
-    char* strsource = "";
+    char* strsource="",*strtype="",*strseverity="";
 
     switch (source) {
-    case GL_DEBUG_SOURCE_API:             strsource = "Source: API"; break;
-    case GL_DEBUG_SOURCE_WINDOW_SYSTEM:   strsource = "Source: Window System"; break;
-    case GL_DEBUG_SOURCE_SHADER_COMPILER: strsource = "Source: Shader Compiler"; break;
-    case GL_DEBUG_SOURCE_THIRD_PARTY:     strsource = "Source: Third Party"; break;
-    case GL_DEBUG_SOURCE_APPLICATION:     strsource = "Source: Application"; break;
-    case GL_DEBUG_SOURCE_OTHER:           strsource = "Source: Other"; break;
-    }printf("%s\n", strsource);
-
-    strsource = "";
+    case GL_DEBUG_SOURCE_API:             strsource = "API"; break;
+    case GL_DEBUG_SOURCE_WINDOW_SYSTEM:   strsource = "Window System"; break;
+    case GL_DEBUG_SOURCE_SHADER_COMPILER: strsource = "Shader Compiler"; break;
+    case GL_DEBUG_SOURCE_THIRD_PARTY:     strsource = "Third Party"; break;
+    case GL_DEBUG_SOURCE_APPLICATION:     strsource = "Application"; break;
+    case GL_DEBUG_SOURCE_OTHER:           strsource = "Other"; break;
+    }
+
     switch (type) {
-    case GL_DEBUG_TYPE_ERROR:               strsource = "Type: Error"; break;
-    case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: return; strsource = "Type: Deprecated Behaviour"; break;
-    case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:  strsource = "Type: Undefined Behaviour"; break;
-    case GL_DEBUG_TYPE_PORTABILITY:         strsource = "Type: Portability"; break;
-    case GL_DEBUG_TYPE_PERFORMANCE:         strsource = "Type: Performance"; break;
-    case GL_DEBUG_TYPE_MARKER:              strsource = "Type: Marker"; break;
-    case GL_DEBUG_TYPE_PUSH_GROUP:          strsource = "Type: Push Group"; break;
-    case GL_DEBUG_TYPE_POP_GROUP:           strsource = "Type: Pop Group"; break;
-    case GL_DEBUG_TYPE_OTHER:               strsource = "Type: Other"; break;
-    }printf("%s\n", strsource);
-
-    strsource = "";
+    case GL_DEBUG_TYPE_ERROR:               strtype = "Error"; break;
+    case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: strtype = "Deprecated Behaviour"; break;
+    case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:  strtype = "Undefined Behaviour"; break;
+    case GL_DEBUG_TYPE_PORTABILITY:         strtype = "Portability"; break;
+    case GL_DEBUG_TYPE_PERFORMANCE:         strtype = "Performance"; break;
+    case GL_DEBUG_TYPE_MARKER:              strtype = "Marker"; break;
+    case GL_DEBUG_TYPE_PUSH_GROUP:          strtype = "Push Group"; break;
+    case GL_DEBUG_TYPE_POP_GROUP:           strtype = "Pop Group"; break;
+    case GL_DEBUG_TYPE_OTHER:               strtype = "Other"; break;
+    }
+
     switch (severity) {
-    case GL_DEBUG_SEVERITY_HIGH:         strsource = "Severity: high"; break;
-    case GL_DEBUG_SEVERITY_MEDIUM:       strsource = "Severity: medium"; break;
-    case GL_DEBUG_SEVERITY_LOW:          strsource = "Severity: low"; break;
-    case GL_DEBUG_SEVERITY_NOTIFICATION: strsource = "Severity: notification"; break;
-    }printf("%s\n\n", strsource);
+    case GL_DEBUG_SEVERITY_HIGH:         strseverity = "High"; break;
+    case GL_DEBUG_SEVERITY_MEDIUM:       strseverity = "Medium"; break;
+    case GL_DEBUG_SEVERITY_LOW:          strseverity = "Low"; break;
+    case GL_DEBUG_SEVERITY_NOTIFICATION: strseverity = "Notification"; break;
+    }
+    printf("%s | %s | %s\n\n", strsource,strtype,strseverity);
 }
 
 void la_SetCurrentGLContextDebug(){
-    glEnable(GL_DEBUG_OUTPUT);
-    glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
-    glDebugMessageCallback(glDebugOutput, 0);
-    glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH|GL_DEBUG_SEVERITY_MEDIUM, 0, 0, GL_TRUE);
+    int force=MAIN.InitArgs.GLDebug;
+    if(MAIN.EnableGLDebug || force){ glEnable(GL_DEBUG_OUTPUT); }else{ glDisable(GL_DEBUG_OUTPUT); }
+    if(MAIN.GLDebugSync || force){ glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); }else{ glDisable(GL_DEBUG_OUTPUT_SYNCHRONOUS); }
+    glDebugMessageCallback(la_glDebugOutput, 0);
+    int sev=GL_DONT_CARE;
+    if(!force){
+        switch(MAIN.GLDebugLevel){ 
+        default: sev=GL_DONT_CARE; break;
+        case 1: sev=GL_DEBUG_SEVERITY_NOTIFICATION; break;
+        case 2: sev=GL_DEBUG_SEVERITY_LOW; break;
+        case 3: sev=GL_DEBUG_SEVERITY_MEDIUM; break;
+        case 4: sev=GL_DEBUG_SEVERITY_HIGH; break;
+        }
+    }
+    glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, sev, 0, 0, GL_TRUE);
+}
+void la_NotifyGLDebugChanges(){
+    MAIN.GLDebugNeedsUpdate=1; for(laWindow* w=MAIN.Windows.pFirst;w;w=w->Item.pNext){ w->GLDebugNeedsUpdate=1; }
 }
 
 void la_SetupWindowGLStates(laWindow* w){
     tnsBindVertexArray(w->vao); tnsUnbindTexture(); tnsUseImmShader(); tnsEnableShaderv(T->immShader);
+    if(w->GLDebugNeedsUpdate){
+#ifdef __linux__
+        tnsContextMakeCurrent(w->glc,w->win);
+#endif
+#ifdef _WIN32
+        tnsContextMakeCurrent(w->glc,w->hdc);
+#endif
+        la_SetCurrentGLContextDebug(); w->GLDebugNeedsUpdate=0;
+    }
 }
 
 int la_CreateSystemWindow(laWindow *window, int SyncToVBlank){
@@ -729,10 +750,12 @@ void laProcessInitArguments(int argc, char* argv[],laInitArguments* ia) {
     for(int i=0;i<argc;i++){
         if(strstr(argv[i], "--gl-version=")==argv[i]){ arg=&argv[i][strlen(argv[i])-3];
             if(arg[0]>='2'&&arg[0]<='4'&&arg[1]=='.'&&arg[2]>='0'&&arg[2]<='9'){
-                MAIN.InitArgs.GLMajor=arg[0]-'0'; MAIN.InitArgs.GLMinor=arg[2]-'0';
-                printf("Set gl-version = %d.%d\n",MAIN.GLMajor,MAIN.GLMinor);
+                ia->GLMajor=arg[0]-'0'; ia->GLMinor=arg[2]-'0';
+                printf("Set gl-version = %d.%d\n",ia->GLMajor,ia->GLMinor);
             }
+            continue;
         }
+        if(strSame(argv[i], "--gl-debug")){ ia->GLDebug=1; }
     }
 }
 int laGetReadyWith(laInitArguments* ia){
@@ -811,7 +834,7 @@ int laGetReadyWith(laInitArguments* ia){
     swa.colormap = MAIN.cmap;
     root = DefaultRootWindow(MAIN.dpy);
     win = XCreateWindow(MAIN.dpy, root, 0, 0, 100, 100, 0, MAIN.xvi->depth, InputOutput, MAIN.xvi->visual, CWColormap | CWEventMask, &swa);
-
+    MAIN.win=win;
     int attribs[] = { GLX_CONTEXT_MAJOR_VERSION_ARB, MAIN.GLMajor, GLX_CONTEXT_MINOR_VERSION_ARB, MAIN.GLMinor, 0};
     glXCreateContextAttribsF = (glXCreateContextAttribsARBProc) glXGetProcAddressARB( (const GLubyte *) "glXCreateContextAttribsARB" );
     if ((MAIN.glc = glXCreateContextAttribsF(MAIN.dpy, MAIN.BestFBC, NULL, GL_TRUE, attribs)) == NULL){
@@ -2424,8 +2447,8 @@ laWindow *laDesignWindow(int X, int Y, int W, int H){
 
     strSafeSet(&n->Title, "Empty SYSWINDOW");
     n->X = X; n->Y = Y; n->W = W; n->H = H;
-    n->OutputShowStripes=1;
-    n->Redraw=1;
+    n->OutputShowStripes=1; n->Redraw=1;
+    n->GLDebugNeedsUpdate=1;
 
     la_CreateSystemWindow(n, MAIN.Windows.pFirst!=0);
 
@@ -7308,6 +7331,16 @@ void laMainLoop(){
     while (1){
         laRecordTime(&FrameStartTime);
 
+        if(MAIN.GLDebugNeedsUpdate){
+#ifdef __linux__
+            tnsContextMakeCurrent(MAIN.glc,MAIN.win);
+#endif
+#ifdef _WIN32
+            tnsContextMakeCurrent(MAIN.glc,MAIN.hdc);
+#endif
+            la_SetCurrentGLContextDebug(); MAIN.GLDebugNeedsUpdate=0;
+        }
+
         la_PreFrame();
 
         if(!la_ProcessSysMessage()){ return; }

+ 17 - 0
resources/la_properties.c

@@ -689,6 +689,10 @@ void laset_ColorPickerGamma(void* unused, real gamma){
     MAIN.ColorPickerGamma=gamma; laRedrawCurrentWindow();
 }
 
+void laset_EnableGLDebug(void* unused, int e){ MAIN.EnableGLDebug=e; la_NotifyGLDebugChanges(); }
+void laset_GLDebugSync(void* unused, int e){ MAIN.GLDebugSync=e; la_NotifyGLDebugChanges(); }
+void laset_GLDebugLevel(void* unused, int e){  MAIN.GLDebugLevel=e; la_NotifyGLDebugChanges(); }
+
 //void laget_DetachedPropContainerID(laProp* p, char * result) {
 //	strcpy(result, p->Detached->Container->Identifier);
 //}
@@ -1373,6 +1377,19 @@ void la_RegisterInternalProps(){
                 laAddEnumItemAs(ep, "16", "16X", "16X multisample", 16, 0);
             }
             
+            ep=laAddEnumProperty(p, "enable_gl_debug", "Enable OpenGL Debug", "Enable OpenGL debug output in the system terminal", LA_WIDGET_ENUM_HIGHLIGHT,0,0,0,0,offsetof(LA, EnableGLDebug),0,laset_EnableGLDebug,0,0,0,0,0,0,0,0);
+            laAddEnumItemAs(ep, "DISABLED", "Disabled", "OpenGL debug output is disabled", 0, 0);
+            laAddEnumItemAs(ep, "ENABLED", "Enabled", "Will print OpenGL debug information to the system terminal", 1, 0);
+            ep=laAddEnumProperty(p, "gl_debug_sync", "Debug Sync", "Whether OpenGL debug output should be in sync with the caller", LA_WIDGET_ENUM_HIGHLIGHT,0,0,0,0,offsetof(LA, GLDebugSync),0,laset_GLDebugSync,0,0,0,0,0,0,0,0);
+            laAddEnumItemAs(ep, "DISABLED", "Disabled", "OpenGL debug output will be printing freely", 0, 0);
+            laAddEnumItemAs(ep, "ENABLED", "Enabled", "OpenGL debug output will hold the gl-call until return", 1, 0);
+            ep=laAddEnumProperty(p, "gl_debug_level", "Debug Level", "OpenGL debug message level", 0,"Note,Low,Med,High",0,0,0,offsetof(LA, GLDebugLevel),0,laset_GLDebugLevel,0,0,0,0,0,0,0,0);
+            laAddEnumItemAs(ep, "ALL", "ALL", "Show all debug messages", 0, 0);
+            laAddEnumItemAs(ep, "NOTE", "Note", "Show notifications", 1, 0);
+            laAddEnumItemAs(ep, "LOW", "Low", "Show low severity messages", 2, 0);
+            laAddEnumItemAs(ep, "MEDIUM", "Medium", "Show low severity messages", 3, 0);
+            laAddEnumItemAs(ep, "HIGH", "High", "Show high severity messages", 4, 0);
+            
             ep=laAddEnumProperty(p, "enable_color_management", "Enable Color Management", "Whether to enable color management or not", LA_WIDGET_ENUM_HIGHLIGHT,0,0,0,0,offsetof(LA, EnableColorManagement),0,0,0,0,0,0,0,0,0,0);
             laAddEnumItemAs(ep, "NONE", "None", "Do not do color management on the window", 0, 0);
             laAddEnumItemAs(ep, "ENABLED", "Enabled", "Enable color management on the window", 1, 0);

+ 15 - 0
resources/la_templates.c

@@ -1324,6 +1324,21 @@ void laui_UserPreference(laUiList *uil, laPropPack *Base, laPropPack *OperatorIn
             laShowItemFull(muil, mc, 0, "la.themes", LA_WIDGET_COLLECTION_SELECTOR, 0,laui_ThemeListItem,0);
             laShowItemFull(muil, mc, 0, "la.themes", LA_WIDGET_COLLECTION_SINGLE, 0 ,0,0)->Flags|=LA_UI_FLAGS_NO_DECAL;
         }
+
+        muil = laAddTabPage(bracket, "System");{
+            mc = laFirstColumn(muil); laSplitColumn(muil, mc, 0.5);
+            mcl = laLeftColumn(mc, 0); mcr = laRightColumn(mc, 0);
+            laShowLabel(muil,mcl,"OpenGL Debugging:",0,0);
+            if(MAIN.InitArgs.GLDebug){
+                laShowLabel(muil,mc,"OpenGL debugging is force enabled with `--gl-debug`",0,0)->Flags|=LA_UI_FLAGS_DISABLED;
+            }else{
+                laShowItem(muil,mcr,0,"la.user_preferences.enable_gl_debug");
+                laUiItem* b=laOnConditionThat(muil,mc,laPropExpression(0,"la.user_preferences.enable_gl_debug"));{
+                    laShowItem(muil,mcl,0,"la.user_preferences.gl_debug_sync");
+                    laShowItem(muil,mcr,0,"la.user_preferences.gl_debug_level")->Flags|=LA_UI_FLAGS_EXPAND;
+                }laEndCondition(muil,b);
+            }
+        }
     }
 }
 void laui_About(laUiList *uil, laPropPack *Base, laPropPack *OperatorInst, laColumn *ExtraColumns, int context){