Blue screen

This commit is contained in:
2026-08-06 21:48:37 +03:00
parent 1ed62b85bb
commit 69b09a7d7a
5 changed files with 174 additions and 86 deletions

View File

@@ -9,7 +9,7 @@ pltf_src = []
cargs = [ cargs = [
'-std=c99', '-std=c99',
'-DSHADERS_PATH="../src/shaders/"', '-DSHADERS_PATH="../src/shaders/"',
# '-DDEBUG=1' '-DDEBUG'
] ]
dependencies = [ dependencies = [
@@ -28,13 +28,14 @@ test_include_dirs = [
if host_machine.system() == 'linux' if host_machine.system() == 'linux'
pltf_src = [ pltf_src = [
'src/pltf/linux/gl_funcs.c' 'src/pltf/glx/gl_funcs.c'
] ]
dependencies += [ dependencies += [
dependency('x11'), dependency('x11'),
dependency('glx'), dependency('glx'),
dependency('libglvnd'), dependency('libglvnd'),
dependency('opengl'),
] ]
libcmocka = cc.find_library( libcmocka = cc.find_library(

View File

@@ -1,4 +1,3 @@
#include <X11/X.h>
#ifdef _WIN32 #ifdef _WIN32
#include <assert.h> #include <assert.h>
@@ -115,17 +114,20 @@ int main() {
#ifdef __linux__ #ifdef __linux__
#include <GL/glcorearb.h>
#include <GL/glx.h> #include <GL/glx.h>
#include <GL/glxext.h>
#include <X11/X.h>
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include <X11/Xutil.h> #include <X11/Xutil.h>
#include <X11/cursorfont.h> #include <X11/cursorfont.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "log.h"
#include "DynString.h" #include "DynString.h"
#include "log.h"
void print_pixmap_format_values(const XPixmapFormatValues* px) { void print_pixmap_format_values(const XPixmapFormatValues* px) {
puts("{"); puts("{");
@@ -344,51 +346,120 @@ int main() {
printf(" %s\n", DynString_c_str(glx_extensions + i)); printf(" %s\n", DynString_c_str(glx_extensions + i));
} }
// XVisualInfo visual_info = { 0 }; // clang-format off
// Status xstatus = XMatchVisualInfo(display, DefaultScreen(display), 32, TrueColor, &visual_info); int fb_cfg_attrib_list[] = {
// if (xstatus == 0) { GLX_BUFFER_SIZE, 32,
// LOG_FATAL("XMatchVisualInfo failed"); GLX_DOUBLEBUFFER, true,
// } GLX_DEPTH_SIZE, 24,
// printf("Matched visual:\n"); GLX_STENCIL_SIZE, 8,
// print_visual_info(&visual_info); GLX_RENDER_TYPE, GLX_RGBA_BIT,
// GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT,
// Cursor cursor = XCreateFontCursor(display, XC_iron_cross); None
// XSetWindowAttributes win_attr = { };
// .background_pixel = 0x00000000, // clang-format on
// .border_pixel = 0xFF000000, int fb_cfg_n = 0;
// .colormap = XCreateColormap(display, DefaultRootWindow(display), visual_info.visual, AllocNone), GLXFBConfig* fb_cfg = glXChooseFBConfig(display, DefaultScreen(display), fb_cfg_attrib_list, &fb_cfg_n);
// .event_mask = Expose, if (fb_cfg == NULL) {
// .backing_store = WhenMapped, LOG_FATAL("Invalid input to glXChooseFBConfig");
// .cursor = cursor, }
// }; if (fb_cfg_n == 0) {
// LOG_FATAL("Could not get a fitting GLXFBConfig");
// Window window = XCreateWindow( }
// display, printf("GLXFBConfig: ");
// DefaultRootWindow(display), print_glxfbconfig(display, fb_cfg);
// 0,
// 0, XVisualInfo* visual_info = glXGetVisualFromFBConfig(display, *fb_cfg);
// PLTF_DEFAULT_WINDOW_WIDTH,
// PLTF_DEFAULT_WINDOW_HEIGHT, XSetWindowAttributes win_attr = {
// 0, .colormap = XCreateColormap(
// visual_info.depth, display,
// InputOutput, RootWindowOfScreen(DefaultScreenOfDisplay(display)),
// visual_info.visual, visual_info->visual,
// CWBackPixel | AllocNone
// CWBorderPixel | )
// CWColormap | };
// CWEventMask |
// CWBackingStore | // clang-format off
// CWCursor, Window window = XCreateWindow(
// &win_attr display,
// ); RootWindowOfScreen(DefaultScreenOfDisplay(display)),
// 0, 0,
// XMapWindow(display, window); 800, 600,
// 0,
// XFlush(display); visual_info->depth,
// InputOutput,
// pause(); visual_info->visual,
// CWColormap,
// XDestroyWindow(display, window); &win_attr
);
// clang-format on
GLXWindow glx_window = glXCreateWindow(
display,
*fb_cfg,
window,
NULL
);
XStoreName(display, window, "GLX");
PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC) glXGetProcAddress((const GLubyte*) "glXCreateContextAttribsARB");
// clang-format off
GLXContext gl_ctx = glXCreateContextAttribsARB(
display,
*fb_cfg,
NULL,
true,
(int[]) {
GLX_CONTEXT_MAJOR_VERSION_ARB, 4,
GLX_CONTEXT_MINOR_VERSION_ARB, 6,
GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
None
}
);
// clang-format on
glXMakeCurrent(
display,
window,
gl_ctx
);
glXWaitX();
XSync(display, false);
XMapWindow(display, window);
printf("OpenGL %s\n", glGetString(GL_VERSION));
PFNGLGETINTEGERVPROC glGetIntegerv = (PFNGLGETINTEGERVPROC) glXGetProcAddress((const GLubyte*) "glGetIntegerv");
PFNGLCLEARPROC glClear = (PFNGLCLEARPROC) glXGetProcAddress((const GLubyte*) "glClear");
PFNGLCLEARCOLORPROC glClearColor = (PFNGLCLEARCOLORPROC) glXGetProcAddress((const GLubyte*) "glClearColor");
int gl_major = 0;
int gl_minor = 0;
int gl_ctx_profile_mask = 0;
glGetIntegerv(GL_MAJOR_VERSION, &gl_major);
glGetIntegerv(GL_MINOR_VERSION, &gl_minor);
glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &gl_ctx_profile_mask);
printf(
"OpenGL %d.%d %s\n",
gl_major,
gl_minor,
gl_ctx_profile_mask == GL_CONTEXT_CORE_PROFILE_BIT
? "Core"
: "Compatibility"
);
glClearColor(0.0, 0.0, 0.8, 1.0);
while (1) {
glClear(GL_COLOR_BUFFER_BIT);
glXSwapBuffers(display, window);
}
XFree(visual_info);
XCloseDisplay(display); XCloseDisplay(display);

View File

@@ -4,37 +4,43 @@
#include <GL/glcorearb.h> #include <GL/glcorearb.h>
#define PLTF_GL_FUNCS(X) \ #define PLTF_GL_FUNCS(X) \
X(PFNGLGETINTEGERVPROC, glGetIntegerv); \ X(PFNGLSHADERSOURCEPROC, glShaderSource); \
X(PFNGLGETFLOATVPROC, glGetFloatv); \ X(PFNGLCREATESHADERPROC, glCreateShader); \
X(PFNGLCLEARCOLORPROC, glClearColor); \ X(PFNGLCOMPILESHADERPROC, glCompileShader); \
X(PFNGLCLEARPROC, glClear); \ X(PFNGLGETSHADERIVPROC, glGetShaderiv); \
X(PFNGLGETERRORPROC, glGetError); \ X(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog); \
X(PFNGLCREATEPROGRAMPROC, glCreateProgram); \
X(PFNGLATTACHSHADERPROC, glAttachShader); \
X(PFNGLLINKPROGRAMPROC, glLinkProgram); \
X(PFNGLGETPROGRAMIVPROC, glGetProgramiv); \
X(PFNGLDELETESHADERPROC, glDeleteShader); \
X(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays); \ X(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays); \
X(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray); \ X(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray); \
X(PFNGLGENBUFFERSPROC, glGenBuffers); \ X(PFNGLGENBUFFERSPROC, glGenBuffers); \
X(PFNGLBINDBUFFERPROC, glBindBuffer); \ X(PFNGLBINDBUFFERPROC, glBindBuffer); \
X(PFNGLBUFFERDATAPROC, glBufferData); \ X(PFNGLBUFFERDATAPROC, glBufferData); \
X(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray); \
X(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer); \ X(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer); \
X(PFNGLCREATESHADERPROC, glCreateShader); \ X(PFNGLCLEARCOLORPROC, glClearColor); \
X(PFNGLSHADERSOURCEPROC, glShaderSource); \ X(PFNGLCLEARPROC, glClear); \
X(PFNGLCOMPILESHADERPROC, glCompileShader); \
X(PFNGLGETSHADERIVPROC, glGetShaderiv); \
X(PFNGLCREATEPROGRAMPROC, glCreateProgram); \
X(PFNGLATTACHSHADERPROC, glAttachShader); \
X(PFNGLLINKPROGRAMPROC, glLinkProgram); \
X(PFNGLGETPROGRAMIVPROC, glGetProgramiv); \
X(PFNGLUSEPROGRAMPROC, glUseProgram); \ X(PFNGLUSEPROGRAMPROC, glUseProgram); \
X(PFNGLDRAWARRAYSPROC, glDrawArrays); \ X(PFNGLDRAWARRAYSPROC, glDrawArrays); \
X(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog); \ X(PFNGLGETINTEGERVPROC, glGetIntegerv); \
X(PFNGLDELETESHADERPROC, glDeleteShader); \ X(PFNGLGETFLOATVPROC, glGetFloatv); \
X(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray); \ X(PFNGLGETERRORPROC, glGetError); \
#define X(type, name) extern type name #define X(type, name) \
extern type name;
PLTF_GL_FUNCS(X) PLTF_GL_FUNCS(X)
#undef X #undef X
#ifdef __linux__
void* pltf_gl_function_load(const unsigned char* name);
#else
void* pltf_gl_function_load(const char* name); void* pltf_gl_function_load(const char* name);
#endif // __linux__
void pltf_gl_funcs_load(); void pltf_gl_funcs_load();
#endif // GL_FUNCS_H_ #endif // GL_FUNCS_H_

23
src/pltf/glx/gl_funcs.c Normal file
View File

@@ -0,0 +1,23 @@
#ifdef __linux__
#include <stddef.h>
#include <GL/glcorearb.h>
#include "../gl_funcs.h"
#define X(type, name) \
type name = NULL
PLTF_GL_FUNCS(X)
#undef X
// #define X(type, name) \
// name = (type) pltf_gl_function_load((const GLubyte*) #name);
// void pltf_gl_funcs_load() {
// PLTF_GL_FUNCS(X)
// }
// #undef X
#endif // __linux__

View File

@@ -1,13 +0,0 @@
#ifdef __linux__
#include <stddef.h>
#include "../gl_funcs.h"
#define X(type, name) \
type name = NULL
PLTF_GL_FUNCS(X)
#undef X
#endif // __linux__