mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-05 13:28:40 +00:00
egl backend for linux backend of opengl backend of render
This commit is contained in:
@@ -33,7 +33,7 @@ gcc_out="-o"
|
|||||||
# --- Per-Build Settings ------------------------------------------------------
|
# --- Per-Build Settings ------------------------------------------------------
|
||||||
link_dll="-fPIC"
|
link_dll="-fPIC"
|
||||||
link_os_gfx="-lX11 -lXext"
|
link_os_gfx="-lX11 -lXext"
|
||||||
link_render="-lGL"
|
link_render="-lGL -lEGL"
|
||||||
|
|
||||||
# --- Choose Compile/Link Lines -----------------------------------------------
|
# --- Choose Compile/Link Lines -----------------------------------------------
|
||||||
if [ -v gcc ]; then compile_debug="$gcc_debug"; fi
|
if [ -v gcc ]; then compile_debug="$gcc_debug"; fi
|
||||||
|
|||||||
+1
-1
@@ -60,7 +60,7 @@ commands =
|
|||||||
//- rjf: running target
|
//- rjf: running target
|
||||||
// .f3 = { .win = "raddbg_stable --ipc run", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
// .f3 = { .win = "raddbg_stable --ipc run", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
||||||
// .f3 = { .win = "C:/devel/raddebugger/build/raddbg.exe --capture --user:C:/devel/raddebugger/build/local_dev.raddbg_user --project:C:/devel/raddebugger/build/local_dev.raddbg_project", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
// .f3 = { .win = "C:/devel/raddebugger/build/raddbg.exe --capture --user:C:/devel/raddebugger/build/local_dev.raddbg_user --project:C:/devel/raddebugger/build/local_dev.raddbg_project", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
||||||
.f3 = { .win = "wsl /mnt/c/devel/raddebugger/build/ryan_scratch", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
.f3 = { .win = "wsl_launch /mnt/c/devel/raddebugger/build/ryan_scratch", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
||||||
|
|
||||||
//- rjf: local target builds
|
//- rjf: local target builds
|
||||||
.build_raddbg = { .win = "build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
.build_raddbg = { .win = "build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
||||||
|
|||||||
@@ -497,7 +497,12 @@ os_set_cursor(OS_Cursor cursor)
|
|||||||
internal void
|
internal void
|
||||||
os_graphical_message(B32 error, String8 title, String8 message)
|
os_graphical_message(B32 error, String8 title, String8 message)
|
||||||
{
|
{
|
||||||
|
if(error)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "[X] ");
|
||||||
|
}
|
||||||
|
fprintf(stderr, "%.*s\n", str8_varg(title));
|
||||||
|
fprintf(stderr, "%.*s\n\n", str8_varg(message));
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|||||||
@@ -0,0 +1,160 @@
|
|||||||
|
// Copyright (c) 2024 Epic Games Tools
|
||||||
|
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||||
|
|
||||||
|
internal VoidProc *
|
||||||
|
r_ogl_os_load_procedure(char *name)
|
||||||
|
{
|
||||||
|
VoidProc *result = (VoidProc *)eglGetProcAddress(name);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
r_ogl_os_init(CmdLine *cmdln)
|
||||||
|
{
|
||||||
|
//- rjf: set up state
|
||||||
|
{
|
||||||
|
Arena *arena = arena_alloc();
|
||||||
|
r_ogl_lnx_state = push_array(arena, R_OGL_LNX_State, 1);
|
||||||
|
r_ogl_lnx_state->arena = arena;
|
||||||
|
}
|
||||||
|
|
||||||
|
//- rjf: get EGL display
|
||||||
|
{
|
||||||
|
r_ogl_lnx_state->display = eglGetDisplay((EGLNativeDisplayType)os_lnx_gfx_state->display);
|
||||||
|
if(r_ogl_lnx_state->display == EGL_NO_DISPLAY)
|
||||||
|
{
|
||||||
|
os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Failed to get EGL display."));
|
||||||
|
os_abort(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//- rjf: initialize GL version
|
||||||
|
EGLint egl_version_major = 0;
|
||||||
|
EGLint egl_version_minor = 0;
|
||||||
|
if(!eglInitialize(r_ogl_lnx_state->display, &egl_version_major, &egl_version_minor))
|
||||||
|
{
|
||||||
|
os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't initialize EGL display."));
|
||||||
|
os_abort(1);
|
||||||
|
}
|
||||||
|
if(egl_version_major < 1 || (egl_version_major == 1 && egl_version_minor < 5))
|
||||||
|
{
|
||||||
|
Temp scratch = scratch_begin(0, 0);
|
||||||
|
String8 message = push_str8f(scratch.arena, "Unsupported EGL version (%i.%i, need at least 1.5)", egl_version_major, egl_version_minor);
|
||||||
|
os_graphical_message(1, str8_lit("Fatal Error"), message);
|
||||||
|
os_abort(1);
|
||||||
|
scratch_end(scratch);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- rjf: pick GL API
|
||||||
|
if(!eglBindAPI(EGL_OPENGL_API))
|
||||||
|
{
|
||||||
|
os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't initialize EGL API to OpenGL."));
|
||||||
|
os_abort(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- rjf: set up EGL config
|
||||||
|
{
|
||||||
|
EGLint options[] =
|
||||||
|
{
|
||||||
|
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
|
||||||
|
EGL_CONFORMANT, EGL_OPENGL_BIT,
|
||||||
|
EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
|
||||||
|
EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER,
|
||||||
|
|
||||||
|
EGL_RED_SIZE, 8,
|
||||||
|
EGL_GREEN_SIZE, 8,
|
||||||
|
EGL_BLUE_SIZE, 8,
|
||||||
|
EGL_DEPTH_SIZE, 24,
|
||||||
|
EGL_STENCIL_SIZE, 8,
|
||||||
|
|
||||||
|
EGL_NONE,
|
||||||
|
};
|
||||||
|
EGLint config_count = 0;
|
||||||
|
if(!eglChooseConfig(r_ogl_lnx_state->display, options, &r_ogl_lnx_state->config, 1, &config_count) || config_count != 1)
|
||||||
|
{
|
||||||
|
os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't choose EGL configuration."));
|
||||||
|
os_abort(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//- rjf: construct context
|
||||||
|
{
|
||||||
|
B32 debug_mode = cmd_line_has_flag(cmdln, str8_lit("opengl_debug"));
|
||||||
|
#if BUILD_DEBUG
|
||||||
|
debug_mode = 1;
|
||||||
|
#endif
|
||||||
|
EGLint options[] =
|
||||||
|
{
|
||||||
|
EGL_CONTEXT_MAJOR_VERSION, 3,
|
||||||
|
EGL_CONTEXT_MINOR_VERSION, 3,
|
||||||
|
EGL_CONTEXT_OPENGL_PROFILE_MASK, EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT,
|
||||||
|
debug_mode ? EGL_CONTEXT_OPENGL_DEBUG : EGL_NONE, EGL_TRUE,
|
||||||
|
EGL_NONE,
|
||||||
|
};
|
||||||
|
r_ogl_lnx_state->context = eglCreateContext(r_ogl_lnx_state->display, r_ogl_lnx_state->config, EGL_NO_CONTEXT, options);
|
||||||
|
if(r_ogl_lnx_state->context == EGL_NO_CONTEXT)
|
||||||
|
{
|
||||||
|
os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't create OpenGL context with EGL."));
|
||||||
|
os_abort(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
eglMakeCurrent(r_ogl_lnx_state->display, 0, 0, r_ogl_lnx_state->context);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal R_Handle
|
||||||
|
r_ogl_os_window_equip(OS_Handle window)
|
||||||
|
{
|
||||||
|
OS_LNX_Window *window_os = (OS_LNX_Window *)window.u64[0];
|
||||||
|
R_OGL_LNX_Window *w = r_ogl_lnx_state->free_window;
|
||||||
|
if(w != 0)
|
||||||
|
{
|
||||||
|
SLLStackPop(r_ogl_lnx_state->free_window);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
w = push_array(r_ogl_lnx_state->arena, R_OGL_LNX_Window, 1);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
EGLint options[] =
|
||||||
|
{
|
||||||
|
EGL_GL_COLORSPACE, EGL_GL_COLORSPACE_LINEAR,
|
||||||
|
EGL_RENDER_BUFFER, EGL_BACK_BUFFER,
|
||||||
|
EGL_NONE,
|
||||||
|
};
|
||||||
|
w->surface = eglCreateWindowSurface(r_ogl_lnx_state->display, r_ogl_lnx_state->config, window_os->window, options);
|
||||||
|
if(w->surface == EGL_NO_SURFACE)
|
||||||
|
{
|
||||||
|
os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't create EGL surface."));
|
||||||
|
os_abort(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
R_Handle result = {(U64)w};
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
r_ogl_os_window_unequip(OS_Handle os, R_Handle r)
|
||||||
|
{
|
||||||
|
R_OGL_LNX_Window *w = (R_OGL_LNX_Window *)r.u64[0];
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
SLLStackPush(r_ogl_lnx_state->free_window, w);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
r_ogl_os_select_window(OS_Handle os, R_Handle r)
|
||||||
|
{
|
||||||
|
OS_LNX_Window *w = (OS_LNX_Window *)os.u64[0];
|
||||||
|
R_OGL_LNX_Window *w_r = (R_OGL_LNX_Window *)r.u64[0];
|
||||||
|
eglMakeCurrent(r_ogl_lnx_state->display, w_r->surface, w_r->surface, r_ogl_lnx_state->context);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
r_ogl_os_window_swap(OS_Handle os, R_Handle r)
|
||||||
|
{
|
||||||
|
OS_LNX_Window *w = (OS_LNX_Window *)os.u64[0];
|
||||||
|
R_OGL_LNX_Window *w_r = (R_OGL_LNX_Window *)r.u64[0];
|
||||||
|
eglSwapBuffers(r_ogl_lnx_state->display, w_r->surface);
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
// Copyright (c) 2024 Epic Games Tools
|
||||||
|
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||||
|
|
||||||
|
#ifndef RENDER_OPENGL_LINUX_EGL_H
|
||||||
|
#define RENDER_OPENGL_LINUX_EGL_H
|
||||||
|
|
||||||
|
#define glTexImage3D glTexImage3D__static
|
||||||
|
#define glTexSubImage3D glTexSubImage3D__static
|
||||||
|
#define glActiveTexture glActiveTexture__static
|
||||||
|
#include <GL/gl.h>
|
||||||
|
#include <EGL/egl.h>
|
||||||
|
#undef glTexImage3D
|
||||||
|
#undef glTexSubImage3D
|
||||||
|
#undef glActiveTexture
|
||||||
|
|
||||||
|
typedef struct R_OGL_LNX_Window R_OGL_LNX_Window;
|
||||||
|
struct R_OGL_LNX_Window
|
||||||
|
{
|
||||||
|
R_OGL_LNX_Window *next;
|
||||||
|
EGLSurface *surface;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct R_OGL_LNX_State R_OGL_LNX_State;
|
||||||
|
struct R_OGL_LNX_State
|
||||||
|
{
|
||||||
|
Arena *arena;
|
||||||
|
EGLDisplay *display;
|
||||||
|
EGLConfig config;
|
||||||
|
EGLContext *context;
|
||||||
|
R_OGL_LNX_Window *free_window;
|
||||||
|
};
|
||||||
|
|
||||||
|
global R_OGL_LNX_State *r_ogl_lnx_state = 0;
|
||||||
|
|
||||||
|
#endif // RENDER_OPENGL_LINUX_EGL_H
|
||||||
@@ -0,0 +1,110 @@
|
|||||||
|
// Copyright (c) 2024 Epic Games Tools
|
||||||
|
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||||
|
|
||||||
|
internal VoidProc *
|
||||||
|
r_ogl_os_load_procedure(char *name)
|
||||||
|
{
|
||||||
|
VoidProc *result = (VoidProc *)glXGetProcAddressARB((U8 *)name);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
r_ogl_os_init(CmdLine *cmdln)
|
||||||
|
{
|
||||||
|
//- rjf: require GLX 1.3+
|
||||||
|
int glx_version_major = 0;
|
||||||
|
int glx_version_minor = 0;
|
||||||
|
if(!glXQueryVersion(os_lnx_gfx_state->display, &glx_version_major, &glx_version_minor) ||
|
||||||
|
(glx_version_major == 1 && glx_version_minor < 3) ||
|
||||||
|
glx_version_major < 1)
|
||||||
|
{
|
||||||
|
Temp scratch = scratch_begin(0, 0);
|
||||||
|
String8 message = push_str8f(scratch.arena, "Unsupported GLX version (%i.%i, need at least 1.3)", glx_version_major, glx_version_minor);
|
||||||
|
os_graphical_message(1, str8_lit("Fatal Error"), message);
|
||||||
|
os_abort(1);
|
||||||
|
scratch_end(scratch);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- rjf: get frame buffer configs
|
||||||
|
local_persist int framebuffer_config_options[] =
|
||||||
|
{
|
||||||
|
GLX_X_RENDERABLE, 1,
|
||||||
|
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, 1,
|
||||||
|
None
|
||||||
|
};
|
||||||
|
int framebuffer_configs_count = 0;
|
||||||
|
GLXFBConfig *framebuffer_configs = glXChooseFBConfig(os_lnx_gfx_state->display, DefaultScreen(os_lnx_gfx_state->display), framebuffer_config_options, &framebuffer_configs_count);
|
||||||
|
if(framebuffer_configs == 0)
|
||||||
|
{
|
||||||
|
os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Could not find a suitable framebuffer configuration."));
|
||||||
|
os_abort(1);
|
||||||
|
}
|
||||||
|
GLXFBConfig framebuffer_config = framebuffer_configs[0];
|
||||||
|
XFree(framebuffer_configs);
|
||||||
|
|
||||||
|
//- rjf: get visual info; create color map
|
||||||
|
XVisualInfo *visual_info = glXGetVisualFromFBConfig(os_lnx_gfx_state->display, framebuffer_config);
|
||||||
|
Colormap cmap = XCreateColormap(os_lnx_gfx_state->display, RootWindow(os_lnx_gfx_state->display, visual_info->screen), visual_info->visual, AllocNone);
|
||||||
|
|
||||||
|
//- rjf: construct set-window-attributes
|
||||||
|
XSetWindowAttributes set_window_attributes = {0};
|
||||||
|
set_window_attributes.background_pixmap = None;
|
||||||
|
set_window_attributes.border_pixel = 0;
|
||||||
|
set_window_attributes.event_mask = StructureNotifyMask;
|
||||||
|
|
||||||
|
//- rjf: construct context
|
||||||
|
{
|
||||||
|
B32 debug_mode = cmd_line_has_flag(cmdln, str8_lit("opengl_debug"));
|
||||||
|
#if BUILD_DEBUG
|
||||||
|
debug_mode = 1;
|
||||||
|
#endif
|
||||||
|
glXCreateContextAttribsARBProc glXCreateContextAttribsARB = 0;
|
||||||
|
glXCreateContextAttribsARB = (glXCreateContextAttribsARBProc)glXGetProcAddressARB((U8 *)"glXCreateContextAttribsARB");
|
||||||
|
int context_options[] =
|
||||||
|
{
|
||||||
|
GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
|
||||||
|
GLX_CONTEXT_MINOR_VERSION_ARB, 3,
|
||||||
|
GLX_CONTEXT_FLAGS_ARB, !!debug_mode*GLX_CONTEXT_DEBUG_BIT_ARB,
|
||||||
|
None
|
||||||
|
};
|
||||||
|
r_ogl_lnx_ctx = glXCreateContextAttribsARB(os_lnx_gfx_state->display, framebuffer_config, 0, 1, context_options);
|
||||||
|
}
|
||||||
|
|
||||||
|
glXMakeCurrent(os_lnx_gfx_state->display, RootWindow(os_lnx_gfx_state->display, visual_info->screen), r_ogl_lnx_ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal R_Handle
|
||||||
|
r_ogl_os_window_equip(OS_Handle window)
|
||||||
|
{
|
||||||
|
R_Handle result = {0};
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
r_ogl_os_window_unequip(OS_Handle os, R_Handle r)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
r_ogl_os_select_window(OS_Handle os, R_Handle r)
|
||||||
|
{
|
||||||
|
OS_LNX_Window *w = (OS_LNX_Window *)os.u64[0];
|
||||||
|
glXMakeCurrent(os_lnx_gfx_state->display, w->window, r_ogl_lnx_ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
r_ogl_os_window_swap(OS_Handle os, R_Handle r)
|
||||||
|
{
|
||||||
|
OS_LNX_Window *w = (OS_LNX_Window *)os.u64[0];
|
||||||
|
glXSwapBuffers(os_lnx_gfx_state->display, w->window);
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
// Copyright (c) 2024 Epic Games Tools
|
||||||
|
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||||
|
|
||||||
|
#ifndef RENDER_OPENGL_LINUX_GLX_H
|
||||||
|
#define RENDER_OPENGL_LINUX_GLX_H
|
||||||
|
|
||||||
|
#define glTexImage3D glTexImage3D__static
|
||||||
|
#define glTexSubImage3D glTexSubImage3D__static
|
||||||
|
#define glActiveTexture glActiveTexture__static
|
||||||
|
#include <GL/gl.h>
|
||||||
|
#include <GL/glx.h>
|
||||||
|
#undef glTexImage3D
|
||||||
|
#undef glTexSubImage3D
|
||||||
|
#undef glActiveTexture
|
||||||
|
|
||||||
|
#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091
|
||||||
|
#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092
|
||||||
|
#define GLX_CONTEXT_FLAGS_ARB 0x2094
|
||||||
|
#define GLX_CONTEXT_DEBUG_BIT_ARB 0x00000001
|
||||||
|
#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002
|
||||||
|
typedef GLXContext (*glXCreateContextAttribsARBProc)(Display*, GLXFBConfig, GLXContext, Bool, const int*);
|
||||||
|
|
||||||
|
global GLXContext r_ogl_lnx_ctx = 0;
|
||||||
|
|
||||||
|
#endif // RENDER_OPENGL_LINUX_GLX_H
|
||||||
@@ -1,110 +1,13 @@
|
|||||||
// Copyright (c) 2024 Epic Games Tools
|
// Copyright (c) 2024 Epic Games Tools
|
||||||
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||||
|
|
||||||
internal VoidProc *
|
////////////////////////////////
|
||||||
r_ogl_os_load_procedure(char *name)
|
//~ rjf: Backend Includes
|
||||||
{
|
|
||||||
VoidProc *result = (VoidProc *)glXGetProcAddressARB((U8 *)name);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void
|
#if R_OPENGL_LINUX_BACKEND == R_OPENGL_LINUX_BACKEND_GLX
|
||||||
r_ogl_os_init(CmdLine *cmdln)
|
# include "glx/render_opengl_linux_glx.c"
|
||||||
{
|
#elif R_OPENGL_LINUX_BACKEND == R_OPENGL_LINUX_BACKEND_EGL
|
||||||
//- rjf: require GLX 1.3+
|
# include "egl/render_opengl_linux_egl.c"
|
||||||
int glx_version_major = 0;
|
#else
|
||||||
int glx_version_minor = 0;
|
# error Linux OpenGL backend not specified.
|
||||||
if(!glXQueryVersion(os_lnx_gfx_state->display, &glx_version_major, &glx_version_minor) ||
|
|
||||||
(glx_version_major == 1 && glx_version_minor < 3) ||
|
|
||||||
glx_version_major < 1)
|
|
||||||
{
|
|
||||||
Temp scratch = scratch_begin(0, 0);
|
|
||||||
String8 message = push_str8f(scratch.arena, "Unsupported GLX version (%i.%i, need at least 1.3)", glx_version_major, glx_version_minor);
|
|
||||||
os_graphical_message(1, str8_lit("Fatal Error"), message);
|
|
||||||
os_abort(1);
|
|
||||||
scratch_end(scratch);
|
|
||||||
}
|
|
||||||
|
|
||||||
//- rjf: get frame buffer configs
|
|
||||||
local_persist int framebuffer_config_options[] =
|
|
||||||
{
|
|
||||||
GLX_X_RENDERABLE, 1,
|
|
||||||
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, 1,
|
|
||||||
None
|
|
||||||
};
|
|
||||||
int framebuffer_configs_count = 0;
|
|
||||||
GLXFBConfig *framebuffer_configs = glXChooseFBConfig(os_lnx_gfx_state->display, DefaultScreen(os_lnx_gfx_state->display), framebuffer_config_options, &framebuffer_configs_count);
|
|
||||||
if(framebuffer_configs == 0)
|
|
||||||
{
|
|
||||||
os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Could not find a suitable framebuffer configuration."));
|
|
||||||
os_abort(1);
|
|
||||||
}
|
|
||||||
GLXFBConfig framebuffer_config = framebuffer_configs[0];
|
|
||||||
XFree(framebuffer_configs);
|
|
||||||
|
|
||||||
//- rjf: get visual info; create color map
|
|
||||||
XVisualInfo *visual_info = glXGetVisualFromFBConfig(os_lnx_gfx_state->display, framebuffer_config);
|
|
||||||
Colormap cmap = XCreateColormap(os_lnx_gfx_state->display, RootWindow(os_lnx_gfx_state->display, visual_info->screen), visual_info->visual, AllocNone);
|
|
||||||
|
|
||||||
//- rjf: construct set-window-attributes
|
|
||||||
XSetWindowAttributes set_window_attributes = {0};
|
|
||||||
set_window_attributes.background_pixmap = None;
|
|
||||||
set_window_attributes.border_pixel = 0;
|
|
||||||
set_window_attributes.event_mask = StructureNotifyMask;
|
|
||||||
|
|
||||||
//- rjf: construct context
|
|
||||||
{
|
|
||||||
B32 debug_mode = cmd_line_has_flag(cmdln, str8_lit("opengl_debug"));
|
|
||||||
#if BUILD_DEBUG
|
|
||||||
debug_mode = 1;
|
|
||||||
#endif
|
#endif
|
||||||
glXCreateContextAttribsARBProc glXCreateContextAttribsARB = 0;
|
|
||||||
glXCreateContextAttribsARB = (glXCreateContextAttribsARBProc)glXGetProcAddressARB((U8 *)"glXCreateContextAttribsARB");
|
|
||||||
int context_options[] =
|
|
||||||
{
|
|
||||||
GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
|
|
||||||
GLX_CONTEXT_MINOR_VERSION_ARB, 3,
|
|
||||||
GLX_CONTEXT_FLAGS_ARB, !!debug_mode*GLX_CONTEXT_DEBUG_BIT_ARB,
|
|
||||||
None
|
|
||||||
};
|
|
||||||
r_ogl_lnx_ctx = glXCreateContextAttribsARB(os_lnx_gfx_state->display, framebuffer_config, 0, 1, context_options);
|
|
||||||
}
|
|
||||||
|
|
||||||
glXMakeCurrent(os_lnx_gfx_state->display, RootWindow(os_lnx_gfx_state->display, visual_info->screen), r_ogl_lnx_ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal R_Handle
|
|
||||||
r_ogl_os_window_equip(OS_Handle window)
|
|
||||||
{
|
|
||||||
R_Handle result = {0};
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void
|
|
||||||
r_ogl_os_window_unequip(OS_Handle os, R_Handle r)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void
|
|
||||||
r_ogl_os_select_window(OS_Handle os, R_Handle r)
|
|
||||||
{
|
|
||||||
OS_LNX_Window *w = (OS_LNX_Window *)os.u64[0];
|
|
||||||
glXMakeCurrent(os_lnx_gfx_state->display, w->window, r_ogl_lnx_ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void
|
|
||||||
r_ogl_os_window_swap(OS_Handle os, R_Handle r)
|
|
||||||
{
|
|
||||||
OS_LNX_Window *w = (OS_LNX_Window *)os.u64[0];
|
|
||||||
glXSwapBuffers(os_lnx_gfx_state->display, w->window);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -4,22 +4,28 @@
|
|||||||
#ifndef RENDER_OPENGL_LINUX_H
|
#ifndef RENDER_OPENGL_LINUX_H
|
||||||
#define RENDER_OPENGL_LINUX_H
|
#define RENDER_OPENGL_LINUX_H
|
||||||
|
|
||||||
#define glTexImage3D glTexImage3D__static
|
////////////////////////////////
|
||||||
#define glTexSubImage3D glTexSubImage3D__static
|
//~ rjf: Backend Constants
|
||||||
#define glActiveTexture glActiveTexture__static
|
|
||||||
#include <GL/gl.h>
|
|
||||||
#include <GL/glx.h>
|
|
||||||
#undef glTexImage3D
|
|
||||||
#undef glTexSubImage3D
|
|
||||||
#undef glActiveTexture
|
|
||||||
|
|
||||||
#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091
|
#define R_OPENGL_LINUX_BACKEND_GLX 0
|
||||||
#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092
|
#define R_OPENGL_LINUX_BACKEND_EGL 1
|
||||||
#define GLX_CONTEXT_FLAGS_ARB 0x2094
|
|
||||||
#define GLX_CONTEXT_DEBUG_BIT_ARB 0x00000001
|
|
||||||
#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002
|
|
||||||
typedef GLXContext (*glXCreateContextAttribsARBProc)(Display*, GLXFBConfig, GLXContext, Bool, const int*);
|
|
||||||
|
|
||||||
global GLXContext r_ogl_lnx_ctx = 0;
|
////////////////////////////////
|
||||||
|
//~ rjf: Decide On Backend
|
||||||
|
|
||||||
|
#if !defined(R_OPENGL_LINUX_BACKEND)
|
||||||
|
# define R_OPENGL_LINUX_BACKEND R_OPENGL_LINUX_BACKEND_GLX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
//~ rjf: Backend Includes
|
||||||
|
|
||||||
|
#if R_OPENGL_LINUX_BACKEND == R_OPENGL_LINUX_BACKEND_GLX
|
||||||
|
# include "glx/render_opengl_linux_glx.h"
|
||||||
|
#elif R_OPENGL_LINUX_BACKEND == R_OPENGL_LINUX_BACKEND_EGL
|
||||||
|
# include "egl/render_opengl_linux_egl.h"
|
||||||
|
#else
|
||||||
|
# error Linux OpenGL backend not specified.
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // RENDER_OPENGL_LINUX_H
|
#endif // RENDER_OPENGL_LINUX_H
|
||||||
|
|||||||
@@ -4,41 +4,6 @@
|
|||||||
#ifndef RENDER_OPENGL_H
|
#ifndef RENDER_OPENGL_H
|
||||||
#define RENDER_OPENGL_H
|
#define RENDER_OPENGL_H
|
||||||
|
|
||||||
////////////////////////////////
|
|
||||||
//~ rjf: OS Backend Includes
|
|
||||||
|
|
||||||
#if OS_WINDOWS
|
|
||||||
# include "render/opengl/win32/render_opengl_win32.h"
|
|
||||||
#elif OS_LINUX
|
|
||||||
# include "render/opengl/linux/render_opengl_linux.h"
|
|
||||||
#else
|
|
||||||
# error OS portion of OpenGL rendering backend not defined.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
////////////////////////////////
|
|
||||||
//~ rjf: Shader Metadata Types
|
|
||||||
|
|
||||||
typedef struct R_OGL_Attribute R_OGL_Attribute;
|
|
||||||
struct R_OGL_Attribute
|
|
||||||
{
|
|
||||||
U64 index;
|
|
||||||
String8 name;
|
|
||||||
GLenum type;
|
|
||||||
U64 count;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct R_OGL_AttributeArray R_OGL_AttributeArray;
|
|
||||||
struct R_OGL_AttributeArray
|
|
||||||
{
|
|
||||||
R_OGL_Attribute *v;
|
|
||||||
U64 count;
|
|
||||||
};
|
|
||||||
|
|
||||||
////////////////////////////////
|
|
||||||
//~ rjf: Generated Code
|
|
||||||
|
|
||||||
#include "render/opengl/generated/render_opengl.meta.h"
|
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: Defines
|
//~ rjf: Defines
|
||||||
|
|
||||||
@@ -107,6 +72,41 @@ typedef ptrdiff_t GLintptr;
|
|||||||
|
|
||||||
#define GL_DEBUG_OUTPUT 0x92E0
|
#define GL_DEBUG_OUTPUT 0x92E0
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
//~ rjf: OS Backend Includes
|
||||||
|
|
||||||
|
#if OS_WINDOWS
|
||||||
|
# include "render/opengl/win32/render_opengl_win32.h"
|
||||||
|
#elif OS_LINUX
|
||||||
|
# include "render/opengl/linux/render_opengl_linux.h"
|
||||||
|
#else
|
||||||
|
# error OS portion of OpenGL rendering backend not defined.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
//~ rjf: Shader Metadata Types
|
||||||
|
|
||||||
|
typedef struct R_OGL_Attribute R_OGL_Attribute;
|
||||||
|
struct R_OGL_Attribute
|
||||||
|
{
|
||||||
|
U64 index;
|
||||||
|
String8 name;
|
||||||
|
GLenum type;
|
||||||
|
U64 count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct R_OGL_AttributeArray R_OGL_AttributeArray;
|
||||||
|
struct R_OGL_AttributeArray
|
||||||
|
{
|
||||||
|
R_OGL_Attribute *v;
|
||||||
|
U64 count;
|
||||||
|
};
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
//~ rjf: Generated Code
|
||||||
|
|
||||||
|
#include "render/opengl/generated/render_opengl.meta.h"
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: OpenGL Procedure List
|
//~ rjf: OpenGL Procedure List
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user