*/}}
Browse Source

provide gl version selection when init

YimingWu 1 year ago
parent
commit
f294f067d1
2 changed files with 28 additions and 19 deletions
  1. 2 0
      la_interface.h
  2. 26 19
      la_kernel.c

+ 2 - 0
la_interface.h

@@ -318,6 +318,7 @@ STRUCTURE(LA){
     Atom wmstate,wmfullscr,wmfullscroff;
     laSafeString* CopyPending;
 
+    int GLMajor,GLMinor,BufferSamples;
     Display* dpy;
     XVisualInfo* xvi;
     GLXFBConfig BestFBC;
@@ -1755,6 +1756,7 @@ void la_ScanWacomDevices(Display *display, int deviceid);
 
 void laSetFontFolderPath(char* absolute);
 int laGetReady();
+int laGetReadyWith(int GLMajor, int GLMinor, int BufferSamples);
 void laShutoff(int SavePreferences);
 void laSaveUserPreferences();
 void laEnsureUserPreferences();

+ 26 - 19
la_kernel.c

@@ -174,7 +174,7 @@ Window la_CreateWindowX11(int x, int y, int w, int h, char *title, int SyncToVBl
         XSetNormalHints(MAIN.dpy, win, &my_hints);
     }
 
-    int attribs[] = { GLX_CONTEXT_MAJOR_VERSION_ARB, 4, GLX_CONTEXT_MINOR_VERSION_ARB, 6, 0};
+    int attribs[] = { GLX_CONTEXT_MAJOR_VERSION_ARB, MAIN.GLMajor, GLX_CONTEXT_MINOR_VERSION_ARB, MAIN.GLMinor, 0};
     if (((*r_glc) = glXCreateContextAttribsF(MAIN.dpy, MAIN.BestFBC, MAIN.glc, GL_TRUE, attribs)) == NULL){
         printf("\n\tcannot create gl context\n\n"); exit(0);
     }
@@ -387,7 +387,8 @@ void laSetFontFolderPath(char* absolute){
     strcpy(MAIN.SysFontDir,absolute); int len=strlen(MAIN.SysFontDir);
     if(MAIN.SysFontDir[len-1]!='/'){ MAIN.SysFontDir[len]='/'; MAIN.SysFontDir[len+1]=0; }
 }
-int laGetReady(){
+
+int laGetReadyWith(int GLMajor, int GLMinor, int BufferSamples){
     Window root, win;
     GLint att[] = {GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None};
     XSetWindowAttributes swa={0};
@@ -410,22 +411,23 @@ int laGetReady(){
 
     la_ScanWacomDevices(MAIN.dpy,XIAllDevices);
 
-    static int visual_attribs[] =
-    {
-      GLX_X_RENDERABLE    , True,
-      GLX_DRAWABLE_TYPE   , GLX_WINDOW_BIT,
-      GLX_RENDER_TYPE     , GLX_RGBA_BIT,
-      GLX_X_VISUAL_TYPE   , GLX_TRUE_COLOR,
-      GLX_RED_SIZE        , 8,
-      GLX_GREEN_SIZE      , 8,
-      GLX_BLUE_SIZE       , 8,
-      GLX_ALPHA_SIZE      , 8,
-      GLX_DEPTH_SIZE      , 24,
-      //GLX_STENCIL_SIZE    , 8,
-      GLX_DOUBLEBUFFER    , True,
-      GLX_SAMPLE_BUFFERS  , 1,
-      GLX_SAMPLES         , 4,
-      None
+    MAIN.GLMajor=GLMajor; MAIN.GLMinor=GLMinor; MAIN.BufferSamples=BufferSamples;
+
+    int visual_attribs[] = {
+        GLX_X_RENDERABLE    , True,
+        GLX_DRAWABLE_TYPE   , GLX_WINDOW_BIT,
+        GLX_RENDER_TYPE     , GLX_RGBA_BIT,
+        GLX_X_VISUAL_TYPE   , GLX_TRUE_COLOR,
+        GLX_RED_SIZE        , 8,
+        GLX_GREEN_SIZE      , 8,
+        GLX_BLUE_SIZE       , 8,
+        GLX_ALPHA_SIZE      , 8,
+        GLX_DEPTH_SIZE      , 24,
+        //GLX_STENCIL_SIZE    , 8,
+        GLX_DOUBLEBUFFER    , True,
+        GLX_SAMPLE_BUFFERS  , MAIN.BufferSamples?1:0,
+        GLX_SAMPLES         , MAIN.BufferSamples?MAIN.BufferSamples:0,
+        None
     };
 
     int fbcount = -1;
@@ -454,7 +456,7 @@ int laGetReady(){
     root = DefaultRootWindow(MAIN.dpy);
     win = XCreateWindow(MAIN.dpy, root, 0, 0, 100, 100, 0, MAIN.xvi->depth, InputOutput, MAIN.xvi->visual, CWColormap | CWEventMask, &swa);
 
-    int attribs[] = { GLX_CONTEXT_MAJOR_VERSION_ARB, 4, GLX_CONTEXT_MINOR_VERSION_ARB, 6, 0};
+    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){
         printf("\n\tcannot create gl context\n\n"); exit(0);
@@ -585,6 +587,11 @@ int laGetReady(){
 
     logPrintNew("Initialization Completed\n");
     MAIN.InitDone=1;
+
+    return 1;
+}
+int laGetReady(){
+    return laGetReadyWith(3,3,0);
 }
 
 void laShutoff(int SavePrefereces){