diff options
author | dec05eba <dec05eba@protonmail.com> | 2024-09-26 17:47:43 +0200 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2024-09-26 17:47:43 +0200 |
commit | 51ee40f85db3dbf47421e2a7e4916ef76f2ca260 (patch) | |
tree | 6009492eeace11149b492a31975786cf81fb64c7 | |
parent | 77fea88fe63cbe7a2551b3a2a16d851e1b448add (diff) |
Revert "Better glx config selection"
This reverts commit 69c3102465e1d0246d2f78073b517e2779733054.
-rw-r--r-- | include/egl.h | 7 | ||||
-rw-r--r-- | src/egl.c | 106 |
2 files changed, 29 insertions, 84 deletions
diff --git a/include/egl.h b/include/egl.h index 5a2efb4..3fdbf48 100644 --- a/include/egl.h +++ b/include/egl.h @@ -213,8 +213,7 @@ struct gsr_egl { const char *dri_card_path; void *glx_context; - GLXFBConfig *glx_fb_configs; - GLXFBConfig glx_fb_config; + void *glx_fb_config; gsr_gpu_info gpu_info; @@ -247,9 +246,7 @@ struct gsr_egl { FUNC_eglQueryDmaBufModifiersEXT eglQueryDmaBufModifiersEXT; __GLXextFuncPtr (*glXGetProcAddress)(const unsigned char *procName); - int (*glXGetFBConfigAttrib)(Display *dpy, GLXFBConfig config, int attribute, int *value); - GLXFBConfig* (*glXGetFBConfigs)(Display *dpy, int screen, int *nelements); - XVisualInfo* (*glXGetVisualFromFBConfig)(Display *dpy, GLXFBConfig config); + GLXFBConfig* (*glXChooseFBConfig)(Display *dpy, int screen, const int *attribList, int *nitems); Bool (*glXMakeContextCurrent)(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); // TODO: Remove GLXContext (*glXCreateNewContext)(Display *dpy, GLXFBConfig config, int renderType, GLXContext shareList, Bool direct); @@ -2,7 +2,6 @@ #include "../include/library_loader.h" #include "../include/utils.h" -#include <X11/Xlib.h> #include <string.h> #include <stdio.h> #include <stdlib.h> @@ -162,7 +161,6 @@ static void store_x11_monitor(const gsr_monitor *monitor, void *userdata) { #define GLX_RGBA_BIT 0x00000001 #define GLX_WINDOW_BIT 0x00000001 #define GLX_PIXMAP_BIT 0x00000002 -#define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0 #define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1 #define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3 #define GLX_TEXTURE_2D_BIT_EXT 0x00000002 @@ -179,69 +177,29 @@ static void store_x11_monitor(const gsr_monitor *monitor, void *userdata) { #define GLX_CONTEXT_PRIORITY_MEDIUM_EXT 0x3102 #define GLX_CONTEXT_PRIORITY_LOW_EXT 0x3103 -static GLXFBConfig glx_fb_config_choose(gsr_egl *self, GLXFBConfig **fb_configs) { - XWindowAttributes win_attr = {0}; - if(!XGetWindowAttributes(self->x11.dpy, self->x11.window, &win_attr)) { - fprintf(stderr, "gsr error: glx_fb_config_choose: XGetWindowAttributes failed\n"); - return NULL; - } - const VisualID visual_id = XVisualIDFromVisual(win_attr.visual); - - GLXFBConfig selected_fb_config = NULL; - int num_fb_configs = 0; - *fb_configs = self->glXGetFBConfigs(self->x11.dpy, DefaultScreen(self->x11.dpy), &num_fb_configs); - for(int i = 0; i < num_fb_configs; ++i) { - GLXFBConfig fb_config = (*fb_configs)[i]; - XVisualInfo *visinfo = self->glXGetVisualFromFBConfig(self->x11.dpy, fb_config); - if(!visinfo || visinfo->visualid != visual_id) - continue; - - int render_type = 0; - self->glXGetFBConfigAttrib(self->x11.dpy, fb_config, GLX_RENDER_TYPE, &render_type); - if(!(render_type & GLX_RGBA_BIT)) - continue; - - int red_size = 0; - self->glXGetFBConfigAttrib(self->x11.dpy, fb_config, GLX_RED_SIZE, &red_size); - - int green_size = 0; - self->glXGetFBConfigAttrib(self->x11.dpy, fb_config, GLX_GREEN_SIZE, &green_size); - - int blue_size = 0; - self->glXGetFBConfigAttrib(self->x11.dpy, fb_config, GLX_BLUE_SIZE, &blue_size); - - if(red_size != 8 || green_size != 8 || blue_size != 8) - continue; - - int drawable_type = 0; - self->glXGetFBConfigAttrib(self->x11.dpy, fb_config, GLX_DRAWABLE_TYPE, &drawable_type); - if(!(drawable_type & GLX_PIXMAP_BIT) || !(drawable_type & GLX_WINDOW_BIT)) - continue; - - int bind_to_texture_targets = 0; - self->glXGetFBConfigAttrib(self->x11.dpy, fb_config, GLX_BIND_TO_TEXTURE_TARGETS_EXT, &bind_to_texture_targets); - if(!(bind_to_texture_targets & GLX_TEXTURE_2D_BIT_EXT)) - continue; - - int bind_to_texture_rgba = 0; - self->glXGetFBConfigAttrib(self->x11.dpy, fb_config, GLX_BIND_TO_TEXTURE_RGBA_EXT, &bind_to_texture_rgba); - if(!bind_to_texture_rgba) { - int bind_to_texture_rgb = 0; - self->glXGetFBConfigAttrib(self->x11.dpy, fb_config, GLX_BIND_TO_TEXTURE_RGB_EXT, &bind_to_texture_rgb); - if(!bind_to_texture_rgb) - continue; - } - - selected_fb_config = fb_config; - break; - } +static GLXFBConfig glx_fb_config_choose(gsr_egl *self) { + const int glx_visual_attribs[] = { + GLX_RENDER_TYPE, GLX_RGBA_BIT, + GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT, + // TODO: + GLX_BIND_TO_TEXTURE_RGBA_EXT, 1, + GLX_BIND_TO_TEXTURE_TARGETS_EXT, GLX_TEXTURE_2D_BIT_EXT, + GLX_DOUBLEBUFFER, True, + GLX_RED_SIZE, 8, + GLX_GREEN_SIZE, 8, + GLX_BLUE_SIZE, 8, + GLX_ALPHA_SIZE, 0, + GLX_DEPTH_SIZE, 0, + None, None + }; - if(!selected_fb_config) { - XFree(*fb_configs); - *fb_configs = NULL; - } + // TODO: Cleanup + int c = 0; + GLXFBConfig *fb_configs = self->glXChooseFBConfig(self->x11.dpy, DefaultScreen(self->x11.dpy), glx_visual_attribs, &c); + if(c == 0 || !fb_configs) + return NULL; - return selected_fb_config; + return fb_configs[0]; } // TODO: Create egl context without surface (in other words, x11/wayland agnostic, doesn't require x11/wayland dependency) @@ -350,6 +308,8 @@ static bool gsr_egl_create_window(gsr_egl *self, bool wayland) { } static bool gsr_egl_switch_to_glx_context(gsr_egl *self) { + // TODO: Cleanup + if(self->egl_context) { self->eglMakeCurrent(self->egl_display, NULL, NULL, NULL); self->eglDestroyContext(self->egl_display, self->egl_context); @@ -366,7 +326,7 @@ static bool gsr_egl_switch_to_glx_context(gsr_egl *self) { self->egl_display = NULL; } - self->glx_fb_config = glx_fb_config_choose(self, &self->glx_fb_configs); + self->glx_fb_config = glx_fb_config_choose(self); if(!self->glx_fb_config) { fprintf(stderr, "gsr error: gsr_egl_create_window failed: failed to find a suitable fb config\n"); goto fail; @@ -388,16 +348,12 @@ static bool gsr_egl_switch_to_glx_context(gsr_egl *self) { return true; fail: - if(!self->glx_fb_configs) { - XFree(self->glx_fb_configs); - self->glx_fb_configs = NULL; - } if(self->glx_context) { self->glXMakeContextCurrent(self->x11.dpy, None, None, NULL); self->glXDestroyContext(self->x11.dpy, self->glx_context); self->glx_context = NULL; + self->glx_fb_config = NULL; } - self->glx_fb_config = NULL; return false; } @@ -460,9 +416,7 @@ static bool gsr_egl_proc_load_egl(gsr_egl *self) { static bool gsr_egl_load_glx(gsr_egl *self, void *library) { const dlsym_assign required_dlsym[] = { { (void**)&self->glXGetProcAddress, "glXGetProcAddress" }, - { (void**)&self->glXGetFBConfigAttrib, "glXGetFBConfigAttrib" }, - { (void**)&self->glXGetFBConfigs, "glXGetFBConfigs" }, - { (void**)&self->glXGetVisualFromFBConfig, "glXGetVisualFromFBConfig" }, + { (void**)&self->glXChooseFBConfig, "glXChooseFBConfig" }, { (void**)&self->glXMakeContextCurrent, "glXMakeContextCurrent" }, { (void**)&self->glXCreateNewContext, "glXCreateNewContext" }, { (void**)&self->glXDestroyContext, "glXDestroyContext" }, @@ -658,17 +612,11 @@ void gsr_egl_unload(gsr_egl *self) { self->egl_display = NULL; } - if(!self->glx_fb_configs) { - XFree(self->glx_fb_configs); - self->glx_fb_configs = NULL; - } - - self->glx_fb_config = NULL; - if(self->glx_context) { self->glXMakeContextCurrent(self->x11.dpy, None, None, NULL); self->glXDestroyContext(self->x11.dpy, self->glx_context); self->glx_context = NULL; + self->glx_fb_config = NULL; } if(self->x11.window) { |