15 Commits
Author SHA1 Message Date
klemek 0a43f3f582 fix: add opengl metadata
Clang Lint CI / lint-no-video (push) Successful in 46s
Clang Build CI / run-no-video (push) Successful in 1m4s
Clang Build CI / run-video (push) Successful in 1m4s
Clang Build CI / build-release (push) Successful in 1m43s
Clang Lint CI / lint-video (push) Successful in 1m4s
2026-08-27 18:45:48 +02:00
klemek 6110e1df7f fix: add ext to gl.h 2026-08-27 17:43:32 +02:00
klemek 3a228122cf fix: compatibility
Clang Build CI / run-no-video (push) Successful in 49s
Clang Build CI / run-video (push) Successful in 51s
Clang Lint CI / lint-no-video (push) Successful in 56s
Clang Build CI / build-release (push) Successful in 1m14s
Clang Lint CI / lint-video (push) Successful in 46s
2026-08-27 17:21:30 +02:00
klemek a440535953 forge (steel) v1.2.4
Clang Build CI / build-release (push) Successful in 1m16s
Clang Build CI / run-no-video (push) Successful in 58s
Clang Build CI / run-video (push) Successful in 1m1s
Clang Lint CI / lint-no-video (push) Successful in 53s
Clang Lint CI / lint-video (push) Successful in 53s
2026-08-27 16:38:49 +02:00
klemek cec3d54685 fix(shaders): remove unused warning
Clang Lint CI / lint-no-video (push) Successful in 46s
Clang Build CI / run-video (push) Successful in 51s
Clang Build CI / run-no-video (push) Successful in 1m2s
Clang Build CI / build-release (push) Successful in 1m15s
Clang Lint CI / lint-video (push) Successful in 53s
2026-08-27 16:34:51 +02:00
klemek 7355d0937c fix(window): sometimes no GLFW_PLATFORM
Clang Lint CI / lint-no-video (push) Successful in 50s
Clang Build CI / run-no-video (push) Successful in 55s
Clang Build CI / run-video (push) Successful in 1m3s
Clang Build CI / build-release (push) Successful in 1m26s
Clang Lint CI / lint-video (push) Successful in 53s
2026-08-27 16:33:00 +02:00
klemek 1c44239a8d feat(window): can specify opengl version from args
Clang Build CI / run-no-video (push) Failing after 48s
Clang Lint CI / lint-no-video (push) Failing after 48s
Clang Build CI / run-video (push) Failing after 50s
Clang Build CI / build-release (push) Failing after 1m12s
Clang Lint CI / lint-video (push) Failing after 51s
2026-08-27 16:29:06 +02:00
klemek 73dd4b75d3 forge (steel) v1.2.3
Clang Build CI / build-release (push) Failing after 1m36s
Clang Build CI / run-no-video (push) Failing after 56s
Clang Build CI / run-video (push) Failing after 57s
Clang Lint CI / lint-no-video (push) Failing after 57s
Clang Lint CI / lint-video (push) Failing after 1m7s
2026-08-22 10:26:23 +02:00
klemek 50f5d6f6cb fix(default): projection mapping ARI 2026-08-22 10:26:01 +02:00
klemek 9b7fbfbeeb forge (steel) v1.2.2
Clang Build CI / run-no-video (push) Failing after 48s
Clang Build CI / build-release (push) Failing after 1m12s
Clang Build CI / run-video (push) Failing after 2m1s
Clang Lint CI / lint-video (push) Failing after 1m48s
Clang Lint CI / lint-no-video (push) Failing after 1m45s
2026-08-21 23:18:08 +02:00
klemek 192cf571b1 feat(glfw): allow to switch backend 2026-08-21 23:17:21 +02:00
klemek 519a9b88f4 fix(window): bug with swap interval 2026-08-21 23:17:05 +02:00
klemek f124cfacfb forge (steel) v1.2.1
Clang Build CI / run-no-video (push) Successful in 2m44s
Clang Build CI / build-release (push) Failing after 52s
Clang Build CI / run-video (push) Successful in 2m41s
Clang Lint CI / lint-no-video (push) Successful in 2m38s
Clang Lint CI / lint-video (push) Successful in 1m22s
2026-05-24 23:32:25 +02:00
klemek 4e14404726 docs: add projection mapping docs 2026-05-24 23:31:55 +02:00
klemek db77846f1b feat: default project up to 4 masks 2026-05-24 23:29:41 +02:00
16 changed files with 304 additions and 50 deletions
-1
View File
@@ -39,7 +39,6 @@ build-no-video:
-lm -lGL -lglfw -lasound \
-Wall -Wextra \
-Wno-format-truncation \
-Wno-unused-parameter \
-DGLFW_INCLUDE_NONE \
-DGLFW_NATIVE_INCLUDE_NONE \
-DLOG_USE_COLOR \
+2 -2
View File
@@ -1,12 +1,12 @@
pkgname=forge-steel
pkgver=1.2.0
pkgver=1.2.4
pkgrel=1
pkgdesc="Fusion Of Real Time Generative Effects"
arch=('i686' 'pentium4' 'x86_64' 'arm' 'armv7h' 'armv6h' 'aarch64' 'riscv64')
depends=('glfw>=1:3', 'v4l-utils>=1.32', 'alsa-lib>=1.2', 'libglvnd>=1.7')
url="https://git.klemek.fr/klemek/forge-steel"
source=("${pkgname}-steel-${pkgver}.tar.gz::https://git.klemek.fr/klemek/forge-steel/releases/download/v${pkgver}/${pkgname}-${pkgver}.tar.gz")
sha256sums=('b04e9159eb3eb809029bf02423e4bf844ecdb3b11cbcb49d8eed8f2505d32a1f')
sha256sums=('a34c7f8101d8d947e26bee1fa5ab8d87f4292014e5ef17d03eb34fefb387db9e')
srcdir=build
backup=("usr/share/${pkgname}")
+22
View File
@@ -263,6 +263,28 @@ Working with pages and items, you can use the following predefined sources and e
See the [printable version](./docs/forge_default_mapping.pdf).
### Available hotkeys
| Hotkey | Function |
| ------ | -------- |
| <kbd>Shift</kbd> + <kbd>F</kbd> | Switch between shader-decoded or hardware decoded YUYV |
| <kbd>M</kbd> | Projection mapping 1 |
| <kbd>Shift</kbd> + <kbd>M</kbd> | Projection mapping 2 |
| <kbd>Ctrl</kbd> + <kbd>M</kbd> | Projection mapping 3 |
| <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>M</kbd> | Projection mapping 4 |
### Projection Mappings
In any of the projection mapping mode, use the nanoKONTROL2 last 4 columns to control 4 on-screen points:
| Midi Control | Function |
| ------ | -------- |
| Fader N | point N - X position |
| Knob N | point N - Y position |
| Last column top button | activate projection mapping |
| Last column middle button | invert projection mapping |
| Last column bottom button | show projection borders |
## Making your own FORGE project
You want to embrace the "user" in "user-defined"? It's time to make your own project.
+1 -1
View File
@@ -1,4 +1,4 @@
AC_INIT([forge], [steel-1.2.0], [klemek.dev@proton.me])
AC_INIT([forge], [steel-1.2.4], [klemek.dev@proton.me])
AM_INIT_AUTOMAKE
AC_PROG_CC
+54 -6
View File
@@ -235,11 +235,14 @@ GROUP_1_6_Y=19
GROUP_1_6_Z=
# Same for group 2
GROUP_2_ACTIVE_COUNT=4
GROUP_2_ACTIVE_COUNT=7
GROUP_2_ACTIVE_1=36
GROUP_2_ACTIVE_2=68
GROUP_2_ACTIVE_3=52
GROUP_2_ACTIVE_4=11077
GROUP_2_ACTIVE_4=1077
GROUP_2_ACTIVE_5=11077
GROUP_2_ACTIVE_6=101077
GROUP_2_ACTIVE_7=111077
GROUP_2_COUNT=7
GROUP_2_1_X=37
GROUP_2_1_Y=53
@@ -273,12 +276,12 @@ GROUP_3_2_Y=16
GROUP_3_2_Z=11089
# Auto-Random Ignore (ARI) prefixes
ARI_COUNT=17
ARI_COUNT=62
ARI_1=GROUP_3_1_Y
ARI_2=GROUP_3_2_Z
ARI_3=GROUP_2_1_X_4
ARI_4=GROUP_2_1_Y_4
ARI_5=GROUP_2_1_Z_4
ARI_3=GROUP_2_5_X_4
ARI_4=GROUP_2_5_Y_4
ARI_5=GROUP_2_5_Z_4
ARI_6=GROUP_2_2_X_4
ARI_7=GROUP_2_2_Y_4
ARI_8=GROUP_2_2_Z_4
@@ -291,6 +294,51 @@ ARI_14=GROUP_2_6_Z_4
ARI_15=GROUP_2_7_X_4
ARI_16=GROUP_2_7_Y_4
ARI_17=GROUP_2_7_Z_4
ARI_18=GROUP_2_5_X_5
ARI_19=GROUP_2_5_Y_5
ARI_20=GROUP_2_5_Z_5
ARI_21=GROUP_2_2_X_5
ARI_22=GROUP_2_2_Y_5
ARI_23=GROUP_2_2_Z_5
ARI_24=GROUP_2_4_X_5
ARI_25=GROUP_2_4_Y_5
ARI_26=GROUP_2_4_Z_5
ARI_27=GROUP_2_6_X_5
ARI_28=GROUP_2_6_Y_5
ARI_29=GROUP_2_6_Z_5
ARI_30=GROUP_2_7_X_5
ARI_31=GROUP_2_7_Y_5
ARI_32=GROUP_2_7_Z_5
ARI_33=GROUP_2_5_X_6
ARI_34=GROUP_2_5_Y_6
ARI_35=GROUP_2_5_Z_6
ARI_36=GROUP_2_2_X_6
ARI_37=GROUP_2_2_Y_6
ARI_38=GROUP_2_2_Z_6
ARI_39=GROUP_2_4_X_6
ARI_40=GROUP_2_4_Y_6
ARI_41=GROUP_2_4_Z_6
ARI_42=GROUP_2_6_X_6
ARI_43=GROUP_2_6_Y_6
ARI_44=GROUP_2_6_Z_6
ARI_45=GROUP_2_7_X_6
ARI_46=GROUP_2_7_Y_6
ARI_47=GROUP_2_7_Z_6
ARI_48=GROUP_2_5_X_7
ARI_49=GROUP_2_5_Y_7
ARI_50=GROUP_2_5_Z_7
ARI_51=GROUP_2_2_X_7
ARI_52=GROUP_2_2_Y_7
ARI_53=GROUP_2_2_Z_7
ARI_54=GROUP_2_4_X_7
ARI_55=GROUP_2_4_Y_7
ARI_56=GROUP_2_4_Z_7
ARI_57=GROUP_2_6_X_7
ARI_58=GROUP_2_6_Y_7
ARI_59=GROUP_2_6_Z_7
ARI_60=GROUP_2_7_X_7
ARI_61=GROUP_2_7_Y_7
ARI_62=GROUP_2_7_Z_7
# =====
# OTHER
+87 -17
View File
@@ -10,34 +10,104 @@ out vec4 fragColor;
uniform sampler2D iTex0;
uniform vec3 iGroup2_4[7];
uniform vec3 iGroup2_5[7];
uniform vec3 iGroup2_6[7];
uniform vec3 iGroup2_7[7];
void main() {
bool visible = iGroup2_4[0].x > 0;
bool invert = iGroup2_4[0].y > 0;
float rect = iGroup2_4[0].z;
bool visible = (iGroup2_4[4].x + iGroup2_5[4].x + iGroup2_6[4].x + iGroup2_7[4].x) > 0;
bool invert = (iGroup2_4[4].y + iGroup2_5[4].y + iGroup2_6[4].y + iGroup2_7[4].y) > 0;
float rect = clamp(iGroup2_4[4].z + iGroup2_5[4].z + iGroup2_6[4].z + iGroup2_7[4].z, 0, 1);
bool modified = false;
vec2 uv2 = vUV;
vec2 uv = mix(vec2(0), vUV, base_mask(vUV));
if (visible) {
vec2 p1 = vec2(iGroup2_4[6].xy);
vec2 p2 = vec2(iGroup2_4[1].xy);
vec2 p3 = vec2(iGroup2_4[3].xy);
vec2 p4 = vec2(iGroup2_4[5].xy);
if (iGroup2_4[4].x > 0) {
vec2 p11 = vec2(iGroup2_4[6].xy);
vec2 p12 = vec2(iGroup2_4[1].xy);
vec2 p13 = vec2(iGroup2_4[3].xy);
vec2 p14 = vec2(iGroup2_4[5].xy);
p2.x = 1 - p2.x;
p3.y = 1 - p3.y;
p4.x = 1 - p4.x;
p4.y = 1 - p4.y;
p12.x = 1 - p12.x;
p13.y = 1 - p13.y;
p14.x = 1 - p14.x;
p14.y = 1 - p14.y;
uv2 = project_4p(vUV, p1, p2, p3, p4);
vec2 uv1 = project_4p(vUV, p11, p12, p13, p14);
uv1 = mix(vec2(0), uv1, base_mask(uv1));
uv = uv1;
modified = true;
}
vec4 color = texture(iTex0, invert ? vUV : uv2);
if (iGroup2_5[4].x > 0) {
vec2 p21 = vec2(iGroup2_5[6].xy);
vec2 p22 = vec2(iGroup2_5[1].xy);
vec2 p23 = vec2(iGroup2_5[3].xy);
vec2 p24 = vec2(iGroup2_5[5].xy);
p22.x = 1 - p22.x;
p23.y = 1 - p23.y;
p24.x = 1 - p24.x;
p24.y = 1 - p24.y;
vec2 uv2 = project_4p(vUV, p21, p22, p23, p24);
uv2 = mix(vec2(0), uv2, base_mask(uv2));
if (modified) {
uv = mix(uv, uv2, step(0.0001, length(uv2)));
} else {
uv = uv2;
}
modified = true;
}
if (iGroup2_6[4].x > 0) {
vec2 p31 = vec2(iGroup2_6[6].xy);
vec2 p32 = vec2(iGroup2_6[1].xy);
vec2 p33 = vec2(iGroup2_6[3].xy);
vec2 p34 = vec2(iGroup2_6[5].xy);
p32.x = 1 - p32.x;
p33.y = 1 - p33.y;
p34.x = 1 - p34.x;
p34.y = 1 - p34.y;
vec2 uv3 = project_4p(vUV, p31, p32, p33, p34);
uv3 = mix(vec2(0), uv3, base_mask(uv3));
if (modified) {
uv = mix(uv, uv3, step(0.0001, length(uv3)));
} else {
uv = uv3;
}
modified = true;
}
if (iGroup2_7[4].x > 0) {
vec2 p41 = vec2(iGroup2_7[6].xy);
vec2 p42 = vec2(iGroup2_7[1].xy);
vec2 p43 = vec2(iGroup2_7[3].xy);
vec2 p44 = vec2(iGroup2_7[5].xy);
p42.x = 1 - p42.x;
p43.y = 1 - p43.y;
p44.x = 1 - p44.x;
p44.y = 1 - p44.y;
vec2 uv4 = project_4p(vUV, p41, p42, p43, p44);
uv4 = mix(vec2(0), uv4, base_mask(uv4));
if (modified) {
uv = mix(uv, uv4, step(0.0001, length(uv4)));
} else {
uv = uv4;
}
modified = true;
}
vec4 color = texture(iTex0, invert ? vUV : uv);
if (visible) {
float mask = step(0, uv2.x) * step(-1, -uv2.x) * step(0, uv2.y) * step(-1, -uv2.y);
float mask = step(0.0001, length(uv));
color *= mix(mask, 1 - mask, invert ? 1 : 0);
color = mix(color, color + mask * vec4(1), rect * (step(uv2.x, 0.01) + step(uv2.y, 0.01) + step(1 - uv2.y, 0.01) + step(1 - uv2.x, 0.01)));
color = mix(color, color + mask * vec4(1), rect * (step(uv.x, 0.01) + step(uv.y, 0.01) + step(1 - uv.y, 0.01) + step(1 - uv.x, 0.01)));
}
fragColor = color;
+4
View File
@@ -23,4 +23,8 @@ vec2 project_4p(vec2 uv, vec2 p1, vec2 p2, vec2 p3, vec2 p4) {
return tmp.xy / tmp.z;
}
float base_mask(vec2 uv) {
return step(0, uv.x) * step(-1, -uv.x) * step(0, uv.y) * step(-1, -uv.y);
}
#endif
+10 -5
View File
@@ -1,11 +1,11 @@
/**
* Loader generated by glad 2.0.8 on Wed May 13 21:57:23 2026
* Loader generated by glad 2.0.8 on Thu Aug 27 15:42:48 2026
*
* SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0
*
* Generator: C/C++
* Specification: gl
* Extensions: 4
* Extensions: 5
*
* APIs:
* - gl:compatibility=4.6
@@ -19,10 +19,10 @@
* - ON_DEMAND = False
*
* Commandline:
* --api='gl:compatibility=4.6' --extensions='GL_ARB_direct_state_access,GL_EXT_EGL_image_storage,GL_EXT_direct_state_access,GL_KHR_debug' c --header-only --loader
* --api='gl:compatibility=4.6' --extensions='GL_ARB_arrays_of_arrays,GL_ARB_direct_state_access,GL_EXT_EGL_image_storage,GL_EXT_direct_state_access,GL_KHR_debug' c --header-only --loader
*
* Online:
* http://glad.sh/#api=gl%3Acompatibility%3D4.6&extensions=GL_ARB_direct_state_access%2CGL_EXT_EGL_image_storage%2CGL_EXT_direct_state_access%2CGL_KHR_debug&generator=c&options=HEADER_ONLY%2CLOADER
* http://glad.sh/#api=gl%3Acompatibility%3D4.6&extensions=GL_ARB_arrays_of_arrays%2CGL_ARB_direct_state_access%2CGL_EXT_EGL_image_storage%2CGL_EXT_direct_state_access%2CGL_KHR_debug&generator=c&options=HEADER_ONLY%2CLOADER
*
*/
@@ -2403,6 +2403,8 @@ GLAD_API_CALL int GLAD_GL_VERSION_4_4;
GLAD_API_CALL int GLAD_GL_VERSION_4_5;
#define GL_VERSION_4_6 1
GLAD_API_CALL int GLAD_GL_VERSION_4_6;
#define GL_ARB_arrays_of_arrays 1
GLAD_API_CALL int GLAD_GL_ARB_arrays_of_arrays;
#define GL_ARB_direct_state_access 1
GLAD_API_CALL int GLAD_GL_ARB_direct_state_access;
#define GL_EXT_EGL_image_storage 1
@@ -6395,6 +6397,7 @@ int GLAD_GL_VERSION_4_3 = 0;
int GLAD_GL_VERSION_4_4 = 0;
int GLAD_GL_VERSION_4_5 = 0;
int GLAD_GL_VERSION_4_6 = 0;
int GLAD_GL_ARB_arrays_of_arrays = 0;
int GLAD_GL_ARB_direct_state_access = 0;
int GLAD_GL_EXT_EGL_image_storage = 0;
int GLAD_GL_EXT_direct_state_access = 0;
@@ -9290,6 +9293,7 @@ static int glad_gl_find_extensions_gl(void) {
char **exts_i = NULL;
if (!glad_gl_get_extensions(&exts, &exts_i)) return 0;
GLAD_GL_ARB_arrays_of_arrays = glad_gl_has_extension(exts, exts_i, "GL_ARB_arrays_of_arrays");
GLAD_GL_ARB_direct_state_access = glad_gl_has_extension(exts, exts_i, "GL_ARB_direct_state_access");
GLAD_GL_EXT_EGL_image_storage = glad_gl_has_extension(exts, exts_i, "GL_EXT_EGL_image_storage");
GLAD_GL_EXT_direct_state_access = glad_gl_has_extension(exts, exts_i, "GL_EXT_direct_state_access");
@@ -9392,7 +9396,7 @@ int gladLoadGL( GLADloadfunc load) {
#ifdef GLAD_GL
@@ -9571,3 +9575,4 @@ void gladLoaderUnloadGL(void) {
#endif
#endif /* GLAD_GL_IMPLEMENTATION */
+41 -1
View File
@@ -11,6 +11,9 @@
#include "config.h"
#include "string.h"
#define STR_IMPL_(x) #x // stringify argument
#define STR(x) STR_IMPL_(x) // indirection to expand argument macros
static void print_help(int status_code) {
puts(
PACKAGE
@@ -42,6 +45,12 @@ static void print_help(int status_code) {
"[-mr / -nmr] "
"[-tm] "
"[-tf] "
"[--x11] "
"[--wayland] "
"[--cocoa] "
"[--win32] "
"[-oma=MAJOR] "
"[-omi=MINOR] "
"\n\n"
"Fusion Of Real-time Generative Effects.\n\n"
"options:\n"
@@ -81,7 +90,17 @@ static void print_help(int status_code) {
" -mr, --midi-reconnect auto-reconnect midi (default)\n"
" -nmr, --no-midi-reconnect do not auto-reconnect midi\n"
" -tm, --trace-midi print midi code and values\n"
" -tf, --trace-fps print fps status of subsystems\n");
" -tf, --trace-fps print fps status of subsystems\n"
" --x11 force X11 GLFW backend\n"
" --wayland force Wayland GLFW backend\n"
" --cocoa force Cocoa GLFW backend\n"
" --win32 force Win32 GLFW backend\n"
" -oma, --opengl-major-version OpenGL major version "
"(default: " STR(
OPENGL_MAJOR_VERSION) ")\n"
" -omi, --opengl-minor-version OpenGL "
"minor version (default: " STR(
OPENGL_MINOR_VERSION) ")\n");
exit(status_code);
}
@@ -152,6 +171,9 @@ void args_parse(Parameters *params, int argc, char **argv) {
params->midi_reconnect = true;
params->trace_midi = false;
params->trace_fps = false;
params->glfw_backend = GLFW_BACKEND_ANY;
params->opengl_major = OPENGL_MAJOR_VERSION;
params->opengl_minor = OPENGL_MINOR_VERSION;
for (int i = 1; i < argc; i++) {
arg = argv[i];
@@ -220,6 +242,24 @@ void args_parse(Parameters *params, int argc, char **argv) {
params->trace_midi = true;
} else if (is_arg(arg, "-tf") || is_arg(arg, "--trace-fps")) {
params->trace_fps = true;
} else if (is_arg(arg, "--x11")) {
params->glfw_backend = GLFW_BACKEND_X11;
} else if (is_arg(arg, "--wayland")) {
params->glfw_backend = GLFW_BACKEND_WAYLAND;
} else if (is_arg(arg, "--cocoa")) {
params->glfw_backend = GLFW_BACKEND_COCOA;
} else if (is_arg(arg, "--win32")) {
params->glfw_backend = GLFW_BACKEND_WIN32;
} else if (is_arg(arg, "-oma") || is_arg(arg, "--opengl-major-version")) {
params->opengl_major = parse_uint(arg, value);
if (params->opengl_major == 0) {
invalid_value(arg, value);
}
} else if (is_arg(arg, "-omi") || is_arg(arg, "--opengl-minor-version")) {
params->opengl_minor = parse_uint(arg, value);
if (params->opengl_major == 0) {
invalid_value(arg, value);
}
} else {
#ifdef VIDEO_IN
if (is_arg(arg, "-vi") || is_arg(arg, "--video-in")) {
+19
View File
@@ -87,4 +87,23 @@
#define MAX_TAP_VALUES 10
#endif
/* OPENGL */
#ifndef OPENGL_MAJOR_VERSION
#define OPENGL_MAJOR_VERSION 4
#endif
#ifndef OPENGL_MINOR_VERSION
#define OPENGL_MINOR_VERSION 6
#endif
/* GLFW CONSTANTS */
#ifndef GLFW_BACKENDS
#define GLFW_BACKEND_ANY 0
#define GLFW_BACKEND_X11 1
#define GLFW_BACKEND_WAYLAND 2
#define GLFW_BACKEND_COCOA 3
#define GLFW_BACKEND_WIN32 4
#endif
#endif /* CONFIG_H */
+2 -2
View File
@@ -4,9 +4,9 @@
#define CONSTANTS_H
static const char *vertex_shader_text =
"#version 460\n"
"#version 140\n"
"const mat4 mvp = "
"{{2.,0.,0.,0.},{0.,2.,0.,0.},{0.,0.,2.,0.},{-1.,-1.,1.,1.}};\n"
"mat4(vec4(2.,0.,0.,0.),vec4(0.,2.,0.,0.),vec4(0.,0.,2.,0.),vec4(-1.,-1.,1.,1.));\n"
"in vec2 vPos;\n"
"out vec2 vUV;\n"
"void main()\n"
+5 -3
View File
@@ -286,14 +286,15 @@ static bool init(const Parameters *params) {
start_state_background_write();
window_startup(error_callback);
window_startup(error_callback, params->glfw_backend);
context.tex_resolution[0] = params->internal_size;
context.tex_resolution[1] = params->internal_size;
if (params->output) {
window_output = window_init(PACKAGE " " VERSION, params->output_screen,
params->windowed, NULL, key_callback);
params->windowed, params->opengl_major,
params->opengl_minor, NULL, key_callback);
window_use(window_output, &context);
@@ -305,7 +306,8 @@ static bool init(const Parameters *params) {
if (params->monitor) {
window_monitor =
window_init(PACKAGE " " VERSION " (monitor)", params->monitor_screen,
params->windowed, window_output, key_callback);
params->windowed, params->opengl_major,
params->opengl_minor, window_output, key_callback);
window_use(window_monitor, &context);
+8 -1
View File
@@ -60,7 +60,7 @@ static void gl_debug_callback(GLenum source, GLenum type, GLuint id,
#endif /* GL_DEBUG */
static bool check_eglerror_ro(const char *context) {
static bool check_eglerror_ro(__attribute__((unused)) const char *context) {
#ifdef VIDEO_IN
unsigned int code;
@@ -105,6 +105,13 @@ static bool init_gl(ShaderProgram *program) {
glDebugMessageCallback(gl_debug_callback, NULL);
#endif /* GL_DEBUG */
// print OpenGL info
log_info("[OpenGL] Vendor: %s", glGetString(GL_VENDOR));
log_info("[OpenGL] Renderer: %s", glGetString(GL_RENDERER));
log_info("[OpenGL] Version: %s", glGetString(GL_VERSION));
log_info("[OpenGL] Shading language: %s",
glGetString(GL_SHADING_LANGUAGE_VERSION));
#ifdef VIDEO_IN
program->egl_display = glfwGetEGLDisplay();
if (program->egl_display == EGL_NO_DISPLAY) {
+3
View File
@@ -58,6 +58,9 @@ typedef struct Parameters {
bool midi_reconnect;
bool trace_midi;
bool trace_fps;
unsigned int glfw_backend;
unsigned int opengl_major;
unsigned int opengl_minor;
} Parameters;
// file.c
+43 -9
View File
@@ -7,7 +7,8 @@
#include "window.h"
static void init_glfw(void (*error_callback)(int, const char *)) {
static void init_glfw(void (*error_callback)(int, const char *),
const unsigned int backend) {
log_info("[GLFW] Initializing...");
// set errors handler
@@ -16,6 +17,30 @@ static void init_glfw(void (*error_callback)(int, const char *)) {
// print current GLFW version
log_info("[GLFW] %s", glfwGetVersionString());
switch (backend) {
#ifdef GLFW_PLATFORM
case GLFW_BACKEND_X11:
glfwInitHint(GLFW_PLATFORM, GLFW_PLATFORM_X11);
log_info("[GLFW] platform: X11");
break;
case GLFW_BACKEND_WAYLAND:
glfwInitHint(GLFW_PLATFORM, GLFW_PLATFORM_WAYLAND);
log_info("[GLFW] platform: Wayland");
break;
case GLFW_BACKEND_COCOA:
glfwInitHint(GLFW_PLATFORM, GLFW_PLATFORM_COCOA);
log_info("[GLFW] platform: Cocoa");
break;
case GLFW_BACKEND_WIN32:
glfwInitHint(GLFW_PLATFORM, GLFW_BACKEND_WIN32);
log_info("[GLFW] platform: Win32");
break;
#endif /* GLFW_PLATFORM */
default:
log_info("[GLFW] platform: Any");
break;
}
// init GLFW
if (!glfwInit()) {
log_error("[GLFW] Initialization failed");
@@ -44,7 +69,9 @@ static GLFWmonitor *get_monitor(unsigned char monitor_index) {
}
static GLFWwindow *
create_window(GLFWmonitor *monitor, const char *title, Window *shared_context,
create_window(GLFWmonitor *monitor, const char *title,
const unsigned int opengl_major, const unsigned int opengl_minor,
Window *shared_context,
void (*key_callback)(Window *, int, int, int, int)) {
GLFWwindow *window;
@@ -57,12 +84,14 @@ create_window(GLFWmonitor *monitor, const char *title, Window *shared_context,
glfwWindowHint(GLFW_FOCUS_ON_SHOW, GLFW_FALSE);
// Context related hints
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, opengl_major);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, opengl_minor);
#ifdef GL_DEBUG
glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GLFW_TRUE);
#endif
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
if (opengl_major > 4 || (opengl_major == 3 && opengl_minor >= 2)) {
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
}
// create fullscreen window in selected monitor
window = glfwCreateWindow(1, 1, title, monitor, shared_context);
@@ -86,8 +115,9 @@ create_window(GLFWmonitor *monitor, const char *title, Window *shared_context,
static void use_window(GLFWwindow *window) { glfwMakeContextCurrent(window); }
void window_startup(void (*error_callback)(int, const char *)) {
init_glfw(error_callback);
void window_startup(void (*error_callback)(int, const char *),
const unsigned int backend) {
init_glfw(error_callback, backend);
}
void window_terminate() {
@@ -96,17 +126,21 @@ void window_terminate() {
}
Window *window_init(const char *title, unsigned char monitor_index,
bool windowed, Window *shared_context,
bool windowed, const unsigned int opengl_major,
const unsigned int opengl_minor, Window *shared_context,
void (*key_callback)(Window *, int, int, int, int)) {
GLFWwindow *window;
GLFWmonitor *monitor;
monitor = windowed ? NULL : get_monitor(monitor_index);
window = create_window(monitor, title, shared_context, key_callback);
window = create_window(monitor, title, opengl_major, opengl_minor,
shared_context, key_callback);
use_window(window);
glfwSwapInterval(0);
return window;
}
+3 -2
View File
@@ -3,12 +3,13 @@
#ifndef WINDOW_H
#define WINDOW_H
void window_startup(void (*error_callback)(int, const char *));
void window_startup(void (*error_callback)(int, const char *), const unsigned int backend);
void window_terminate();
Window *window_init(const char *title, unsigned char monitor_index,
bool windowed, Window *shared_context,
bool windowed, const unsigned int opengl_major,
const unsigned int opengl_minor, Window *shared_context,
void (*key_callback)(Window *, int, int, int, int));
void window_update_title(Window *window, const char *title);