|  | @@ -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; }
 |