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