feat: double buffered video input

This commit is contained in:
2025-11-24 18:50:50 +01:00
parent aa42e9d2aa
commit c66a5c166e
16 changed files with 162 additions and 82 deletions
+13 -9
View File
@@ -51,6 +51,8 @@ UNIFORM_STATE_PREFIX=iState
UNIFORM_ACTIVE_PREFIX=iActive
# Input X format raw integer value
UNIFORM_IN_FORMAT_PREFIX=iInputFormat
# Input X should use swap texture or not (0/1)
UNIFORM_IN_SWAP_PREFIX=iInputSwap
# --- uniform vec2 ---
@@ -93,7 +95,7 @@ SUB_2_PREFIX=fx_
# Total number of internal textures
TEX_COUNT=10
TEX_COUNT=12
# === VIDEO DEVICES
# Video devices will be read from CLI arguments
@@ -104,10 +106,12 @@ IN_COUNT=2
# To which texture will be bound video device X
IN_1_OUT=1
IN_2_OUT=2
# To which texture will be bound swap buffers (for double-buffering)
IN_1_SWAP_OUT=3
IN_2_SWAP_OUT=4
# === FRAGMENT SHADERS
# Fragment shaders will be read from the CLI directory as "fragX.glsl"
# Special shader "frag0.glsl" will be prepend to each one
# Prefix of fragment shaders to detect
FRAG_FILE_PREFIX=frag
@@ -116,13 +120,13 @@ FRAG_FILE_PREFIX=frag
FRAG_COUNT=10
# To which texture will the shader fragX.glsl will render to
FRAG_1_OUT=3
FRAG_2_OUT=4
FRAG_3_OUT=5
FRAG_4_OUT=6
FRAG_5_OUT=7
FRAG_6_OUT=8
FRAG_7_OUT=9
FRAG_1_OUT=5
FRAG_2_OUT=6
FRAG_3_OUT=7
FRAG_4_OUT=8
FRAG_5_OUT=9
FRAG_6_OUT=10
FRAG_7_OUT=11
FRAG_8_OUT=0
# Which fragment shader renders to output window
FRAG_OUTPUT=9
+9 -5
View File
@@ -2,8 +2,8 @@
// VIDEO 1
// -----------
// IN: 1 (RAW IN A)
// OUT: 3 (IN A)
// IN: 1+3 (RAW IN A)
// OUT: 5 (IN A)
in vec2 vUV;
out vec4 fragColor;
@@ -12,14 +12,18 @@ out vec4 fragColor;
uniform sampler2D iTex0;
uniform sampler2D iTex1;
uniform sampler2D iTex3;
uniform int iInputFormat1;
uniform int iInputSwap1;
uniform vec2 iInputResolution1;
void main() {
if (iInputFormat1 == YUYV_FOURCC) {
fragColor = yuyvTex(iTex1, vUV, int(iInputResolution1.x));
} else if (iInputResolution1.x > 0) {
fragColor = texture(iTex1, vUV);
if (iInputSwap1 > 0) {
fragColor = yuyvTex(iTex3, vUV, int(iInputResolution1.x));
} else {
fragColor = yuyvTex(iTex1, vUV, int(iInputResolution1.x));
}
} else {
fragColor = texture(iTex0, vUV);
}
+9 -11
View File
@@ -9,15 +9,13 @@ out vec4 fragColor;
#include inc_debug.glsl
uniform sampler2D iTex0;
uniform sampler2D iTex1;
uniform sampler2D iTex2;
uniform sampler2D iTex3;
uniform sampler2D iTex4;
uniform sampler2D iTex5;
uniform sampler2D iTex6;
uniform sampler2D iTex7;
uniform sampler2D iTex8;
uniform sampler2D iTex9;
uniform sampler2D iTex10;
uniform sampler2D iTex11;
uniform int iFPS;
uniform int iInputFPS1;
uniform int iInputFPS2;
@@ -52,14 +50,14 @@ void main() {
vec4 c = vec4(0);
c += s(uv2,1,2) * texture(iTex5, uv2);
c += s(uv2,2,2) * texture(iTex7, uv2);
c += s(uv2,1,2) * texture(iTex7, uv2);
c += s(uv2,2,2) * texture(iTex9, uv2);
c += s(uv2,1,0) * texture(iTex6, uv2);
c += s(uv2,2,0) * texture(iTex8, uv2);
c += s(uv2,1,0) * texture(iTex8, uv2);
c += s(uv2,2,0) * texture(iTex10, uv2);
c += s(uv2,0,1) * debug(mod(uv2, 1));
c += s(uv2,1,1) * texture(iTex9, uv2);
c += s(uv2,1,1) * texture(iTex11, uv2);
c += s(uv2,2,1) * texture(iTex0, uv2);
float sel = 0;
@@ -79,7 +77,7 @@ void main() {
t += write_5(uv3, vec2(-37,28), texts[0]);
if (iInputResolution1.x > 0) {
c += s(uv2,0,2) * texture(iTex3, uv2);
c += s(uv2,0,2) * texture(iTex5, uv2);
f += rect(uv3, vec2(-35, 26.75), vec2(2.8, 0.7));
t += write_int(uv3, vec2(-37.6,26.1), iInputFPS1, 2);
t += write_5(uv3, vec2(-35.1,26.1), texts[8]);
@@ -92,7 +90,7 @@ void main() {
t += write_5(uv3, vec2(-37,-12), texts[1]);
if (iInputResolution2.x > 0) {
c += s(uv2,0,0) * texture(iTex4, uv2);
c += s(uv2,0,0) * texture(iTex6, uv2);
f += rect(uv3, vec2(-35, -13.25), vec2(2.8, 0.7));
t += write_int(uv3, vec2(-37.6,-13.9), iInputFPS2, 2);
t += write_5(uv3, vec2(-35.1,-13.9), texts[8]);
+9 -5
View File
@@ -2,8 +2,8 @@
// VIDEO 2
// -----------
// IN: 2 (RAW IN B)
// OUT: 4 (IN B)
// IN: 2+4 (RAW IN B)
// OUT: 6 (IN B)
in vec2 vUV;
out vec4 fragColor;
@@ -12,14 +12,18 @@ out vec4 fragColor;
uniform sampler2D iTex0;
uniform sampler2D iTex2;
uniform sampler2D iTex4;
uniform int iInputFormat2;
uniform int iInputSwap2;
uniform vec2 iInputResolution2;
void main() {
if (iInputFormat2 == YUYV_FOURCC) {
fragColor = yuyvTex(iTex2, vUV, int(iInputResolution2.x));
} else if (iInputResolution2.x > 0) {
fragColor = texture(iTex2, vUV);
if (iInputSwap2 > 0) {
fragColor = yuyvTex(iTex4, vUV, int(iInputResolution2.x));
} else {
fragColor = yuyvTex(iTex2, vUV, int(iInputResolution2.x));
}
} else {
fragColor = texture(iTex0, vUV);
}
+1 -1
View File
@@ -3,7 +3,7 @@
// SRC A
// -----------
// OUT: 5 (FX A)
// OUT: 7 (FX A)
in vec2 vUV;
out vec4 fragColor;
+1 -1
View File
@@ -2,7 +2,7 @@
// SRC B
// -----------
// OUT: 6 (FX B)
// OUT: 8 (FX B)
in vec2 vUV;
out vec4 fragColor;
+5 -5
View File
@@ -2,20 +2,20 @@
// FX A
// -------------
// IN: 5 (SRC A)
// IN: 7 (FX A)
// OUT: 7 (A+B)
// IN: 7 (SRC A)
// IN: 9 (FX A)
// OUT: 9 (A+B)
in vec2 vUV;
out vec4 fragColor;
#include inc_fx.glsl
uniform sampler2D iTex5;
uniform sampler2D iTex7;
uniform sampler2D iTex9;
uniform int iSeed5;
uniform vec3 iMidi2_1[7];
void main() {
fragColor = fx_stage(vUV, iTex5, iTex7, iSeed5, iMidi2_1[0], iMidi2_1[1].xy, iMidi2_1[2], iMidi2_1[3].xy, iMidi2_1[4], iMidi2_1[5].xy, iMidi2_1[6]);
fragColor = fx_stage(vUV, iTex7, iTex9, iSeed5, iMidi2_1[0], iMidi2_1[1].xy, iMidi2_1[2], iMidi2_1[3].xy, iMidi2_1[4], iMidi2_1[5].xy, iMidi2_1[6]);
}
+5 -5
View File
@@ -2,20 +2,20 @@
// FX B
// -------------
// IN: 6 (SRC B)
// IN: 8 (FX B)
// OUT: 8 (A+B)
// IN: 8 (SRC B)
// IN: 10 (FX B)
// OUT: 10 (A+B)
in vec2 vUV;
out vec4 fragColor;
#include inc_fx.glsl
uniform sampler2D iTex6;
uniform sampler2D iTex8;
uniform sampler2D iTex10;
uniform int iSeed6;
uniform vec3 iMidi2_2[7];
void main() {
fragColor = fx_stage(vUV, iTex6, iTex8, iSeed6, iMidi2_2[0], iMidi2_2[1].xy, iMidi2_2[2], iMidi2_2[3].xy, iMidi2_2[4], iMidi2_2[5].xy, iMidi2_2[6]);
fragColor = fx_stage(vUV, iTex8, iTex10, iSeed6, iMidi2_2[0], iMidi2_2[1].xy, iMidi2_2[2], iMidi2_2[3].xy, iMidi2_2[4], iMidi2_2[5].xy, iMidi2_2[6]);
}
+7 -7
View File
@@ -2,9 +2,9 @@
// A+B
// ------------
// IN: 7 (FX A)
// IN: 8 (FX B)
// OUT: 9 (MFX)
// IN: 9 (FX A)
// IN: 10 (FX B)
// OUT: 11 (MFX)
in vec2 vUV;
out vec4 fragColor;
@@ -13,8 +13,8 @@ out vec4 fragColor;
#include inc_functions.glsl
uniform int iDemo;
uniform sampler2D iTex7;
uniform sampler2D iTex8;
uniform sampler2D iTex9;
uniform sampler2D iTex10;
uniform int iSeed7;
uniform vec3 iMidi3_1[2];
@@ -22,8 +22,8 @@ void main() {
float mix_value = magic(iMidi3_1[1].xy, vec3(1, 0, 0), iSeed7);
bool mix_type = magic_trigger(vec3(iMidi3_1[0].x, 0, 0), iSeed7 + 10);
vec4 color_a = texture(iTex7, vUV);
vec4 color_b = texture(iTex8, vUV);
vec4 color_a = texture(iTex9, vUV);
vec4 color_b = texture(iTex10, vUV);
float k = mean(color_a);
+3 -3
View File
@@ -2,7 +2,7 @@
// MFX
// ------------
// IN: 9 (A+B)
// IN: 11 (A+B)
// IN: 0 (OUT)
// OUT: 0 (OUT)
@@ -11,7 +11,7 @@ out vec4 fragColor;
#include inc_fx.glsl
uniform sampler2D iTex9;
uniform sampler2D iTex11;
uniform sampler2D iTex0;
uniform int iSeed8;
uniform vec3 iMidi2_3[7];
@@ -20,7 +20,7 @@ uniform int iDemo;
uniform int iAutoRand;
void main() {
vec4 color = fx_stage(vUV, iTex9, iTex0, iSeed8, iMidi2_3[0], iMidi2_3[1].xy, iMidi2_3[2], iMidi2_3[3].xy, iMidi2_3[4], iMidi2_3[5].xy, iMidi2_3[6]);
vec4 color = fx_stage(vUV, iTex11, iTex0, iSeed8, iMidi2_3[0], iMidi2_3[1].xy, iMidi2_3[2], iMidi2_3[3].xy, iMidi2_3[4], iMidi2_3[5].xy, iMidi2_3[6]);
if (iDemo < 1 && iAutoRand < 1) {
color = mix(color, vec4(0), iMidi3_1[0].y);