From 1678c3a038807efd4e6e07866e45222894e7de05 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 15 Nov 2023 22:23:24 -0800 Subject: [PATCH] build: add glslang --- build.zig | 9 ++++++ build.zig.zon | 1 + src/App.zig | 35 +++++++++++++++++++++ src/temp.frag | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 129 insertions(+) create mode 100644 src/temp.frag diff --git a/build.zig b/build.zig index f6164675e..df093ac8a 100644 --- a/build.zig +++ b/build.zig @@ -643,6 +643,10 @@ fn addDeps( .optimize = step.optimize, .@"enable-libpng" = true, }); + const glslang_dep = b.dependency("glslang", .{ + .target = step.target, + .optimize = step.optimize, + }); const mach_glfw_dep = b.dependency("mach_glfw", .{ .target = step.target, .optimize = step.optimize, @@ -718,6 +722,7 @@ fn addDeps( fontconfig_dep.module("fontconfig"), ); step.addModule("freetype", freetype_dep.module("freetype")); + step.addModule("glslang", glslang_dep.module("glslang")); step.addModule("harfbuzz", harfbuzz_dep.module("harfbuzz")); step.addModule("xev", libxev_dep.module("xev")); step.addModule("pixman", pixman_dep.module("pixman")); @@ -743,6 +748,10 @@ fn addDeps( try static_libs.append(tracy_dep.artifact("tracy").getEmittedBin()); } + // Glslang + step.linkLibrary(glslang_dep.artifact("glslang")); + try static_libs.append(glslang_dep.artifact("glslang").getEmittedBin()); + // Dynamic link if (!static) { step.addIncludePath(freetype_dep.path("")); diff --git a/build.zig.zon b/build.zig.zon index 1ba57e1b2..198743c45 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -29,6 +29,7 @@ .cimgui = .{ .path = "./pkg/cimgui" }, .fontconfig = .{ .path = "./pkg/fontconfig" }, .freetype = .{ .path = "./pkg/freetype" }, + .glslang = .{ .path = "./pkg/glslang" }, .harfbuzz = .{ .path = "./pkg/harfbuzz" }, .libpng = .{ .path = "./pkg/libpng" }, .macos = .{ .path = "./pkg/macos" }, diff --git a/src/App.zig b/src/App.zig index a09860a86..4536a2f69 100644 --- a/src/App.zig +++ b/src/App.zig @@ -73,6 +73,41 @@ pub fn create( }; errdefer app.surfaces.deinit(alloc); + // TODO: remove this temporary crap + // const glslang = @import("glslang"); + // try glslang.init(); + // { + // const c = glslang.c; + // const glsl_input: c.glslang_input_t = .{ + // .language = c.GLSLANG_SOURCE_GLSL, + // .stage = c.GLSLANG_STAGE_FRAGMENT, + // .client = c.GLSLANG_CLIENT_VULKAN, + // .client_version = c.GLSLANG_TARGET_VULKAN_1_2, + // .target_language = c.GLSLANG_TARGET_SPV, + // .target_language_version = c.GLSLANG_TARGET_SPV_1_5, + // .code = @embedFile("temp.frag"), + // .default_version = 100, + // .default_profile = c.GLSLANG_NO_PROFILE, + // .force_default_version_and_profile = 0, + // .forward_compatible = 0, + // .messages = c.GLSLANG_MSG_DEFAULT_BIT, + // .resource = c.glslang_default_resource(), + // }; + // + // const shader = try glslang.Shader.create(&glsl_input); + // defer shader.delete(); + // try shader.preprocess(&glsl_input); + // try shader.parse(&glsl_input); + // + // const program = try glslang.Program.create(); + // defer program.delete(); + // program.addShader(shader); + // try program.link(c.GLSLANG_MSG_SPV_RULES_BIT | c.GLSLANG_MSG_VULKAN_RULES_BIT); + // program.spirvGenerate(c.GLSLANG_STAGE_FRAGMENT); + // const size = program.spirvGetSize(); + // log.warn("SPIRV PROGRAM size={d}", .{size}); + // } + return app; } diff --git a/src/temp.frag b/src/temp.frag new file mode 100644 index 000000000..4c331118c --- /dev/null +++ b/src/temp.frag @@ -0,0 +1,84 @@ +#version 430 core + +layout(binding = 0) uniform Globals { + uniform vec3 iResolution; + uniform float iTime; + uniform float iTimeDelta; + uniform float iFrameRate; + uniform int iFrame; + uniform float iChannelTime[4]; + uniform vec3 iChannelResolution[4]; + uniform vec4 iMouse; + uniform vec4 iDate; + uniform float iSampleRate; +}; + +layout(binding = 0) uniform sampler2D iChannel0; +layout(binding = 1) uniform sampler2D iChannel1; +layout(binding = 2) uniform sampler2D iChannel2; +layout(binding = 3) uniform sampler2D iChannel3; + +layout(location = 0) in vec4 gl_FragCoord; +layout(location = 0) out vec4 _fragColor; + +#define texture2D texture + +void mainImage( out vec4 fragColor, in vec2 fragCoord ); +void main() { mainImage (_fragColor, gl_FragCoord.xy); } + +// Loosely based on postprocessing shader by inigo quilez, License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. + +vec2 curve(vec2 uv) +{ + uv = (uv - 0.5) * 2.0; + uv *= 1.1; + uv.x *= 1.0 + pow((abs(uv.y) / 5.0), 2.0); + uv.y *= 1.0 + pow((abs(uv.x) / 4.0), 2.0); + uv = (uv / 2.0) + 0.5; + uv = uv *0.92 + 0.04; + return uv; +} +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 q = fragCoord.xy / iResolution.xy; + vec2 uv = q; + uv = curve( uv ); + vec3 oricol = texture( iChannel0, vec2(q.x,q.y) ).xyz; + vec3 col; + float x = sin(0.3*iTime+uv.y*21.0)*sin(0.7*iTime+uv.y*29.0)*sin(0.3+0.33*iTime+uv.y*31.0)*0.0017; + + col.r = texture(iChannel0,vec2(x+uv.x+0.001,uv.y+0.001)).x+0.05; + col.g = texture(iChannel0,vec2(x+uv.x+0.000,uv.y-0.002)).y+0.05; + col.b = texture(iChannel0,vec2(x+uv.x-0.002,uv.y+0.000)).z+0.05; + col.r += 0.08*texture(iChannel0,0.75*vec2(x+0.025, -0.027)+vec2(uv.x+0.001,uv.y+0.001)).x; + col.g += 0.05*texture(iChannel0,0.75*vec2(x+-0.022, -0.02)+vec2(uv.x+0.000,uv.y-0.002)).y; + col.b += 0.08*texture(iChannel0,0.75*vec2(x+-0.02, -0.018)+vec2(uv.x-0.002,uv.y+0.000)).z; + + col = clamp(col*0.6+0.4*col*col*1.0,0.0,1.0); + + float vig = (0.0 + 1.0*16.0*uv.x*uv.y*(1.0-uv.x)*(1.0-uv.y)); + col *= vec3(pow(vig,0.3)); + + col *= vec3(0.95,1.05,0.95); + col *= 2.8; + + float scans = clamp( 0.35+0.35*sin(3.5*iTime+uv.y*iResolution.y*1.5), 0.0, 1.0); + + float s = pow(scans,1.7); + col = col*vec3( 0.4+0.7*s) ; + + col *= 1.0+0.01*sin(110.0*iTime); + if (uv.x < 0.0 || uv.x > 1.0) + col *= 0.0; + if (uv.y < 0.0 || uv.y > 1.0) + col *= 0.0; + + col*=1.0-0.65*vec3(clamp((mod(fragCoord.x, 2.0)-1.0)*2.0,0.0,1.0)); + + float comp = smoothstep( 0.1, 0.9, sin(iTime) ); + + // Remove the next line to stop cross-fade between original and postprocess +// col = mix( col, oricol, comp ); + + fragColor = vec4(col,1.0); +}