diff --git a/.github/ISSUE_TEMPLATE/dev_zig_nomination.md b/.github/ISSUE_TEMPLATE/dev_zig_nomination.md index 33c32d39..3831f281 100644 --- a/.github/ISSUE_TEMPLATE/dev_zig_nomination.md +++ b/.github/ISSUE_TEMPLATE/dev_zig_nomination.md @@ -120,19 +120,9 @@ These projects have dependencies on other projects. We update them in the exact * [ ] mach-gpu, which depends on: * mach-glfw * mach-gpu-dawn -* [ ] mach-sysgpu, which depends on: - * vulkan-zig-generated - * mach-gpu - * mach-objc - * direct3d-headers - * opengl-headers - * xcode-frameworks - * spirv-cross - * spirv-tools * [ ] mach-core, which depends on: * build.zig version check * mach-core-example-assets - * mach-sysgpu * mach-gpu * mach-glfw * [ ] mach-core-starter-project, which depends on: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8a7ad32c..11533ec8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -53,6 +53,14 @@ jobs: run: zig build -Dsysgpu test - name: test (specific deps only) run: zig build -Dcore -Dsysaudio -Dsysgpu test + - name: 'sysgpu: validate spirv code generation' + run: | + wget -qO- https://packages.lunarg.com/lunarg-signing-key-pub.asc | sudo tee /etc/apt/trusted.gpg.d/lunarg.asc + sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-jammy.list http://packages.lunarg.com/vulkan/lunarg-vulkan-jammy.list + sudo apt update + sudo apt install vulkan-sdk spirv-tools + - name: 'sysgpu: validate spirv output' + run: bash ./src/sysgpu/tools/validate_spirv.sh x86_64-windows: runs-on: windows-latest # We want to run on external PRs, but not on our own internal PRs as they'll be run by the push diff --git a/build.zig b/build.zig index e207ff2f..00610d31 100644 --- a/build.zig +++ b/build.zig @@ -3,6 +3,15 @@ const builtin = @import("builtin"); const glfw = @import("mach_glfw"); const core = @import("mach_core"); +pub const SysgpuBackend = enum { + default, + webgpu, + d3d12, + metal, + vulkan, + opengl, +}; + /// Examples: /// /// `zig build` -> builds all of Mach @@ -39,17 +48,19 @@ pub fn build(b: *std.Build) !void { const core_deps = b.option(bool, "core", "build core specifically"); const sysaudio_deps = b.option(bool, "sysaudio", "build sysaudio specifically"); const sysgpu_deps = b.option(bool, "sysgpu", "build sysgpu specifically"); + const sysgpu_backend = b.option(SysgpuBackend, "sysgpu_backend", "sysgpu API backend") orelse .default; const want_mach = core_deps != null or sysaudio_deps != null or sysgpu_deps != null; const want_core = want_mach or (core_deps orelse false); const want_sysaudio = want_mach or (sysaudio_deps orelse false); - const want_sysgpu = want_mach or (sysgpu_deps orelse false); + const want_sysgpu = want_mach or want_core or (sysgpu_deps orelse false); const build_options = b.addOptions(); build_options.addOption(bool, "want_mach", want_mach); build_options.addOption(bool, "want_core", want_core); build_options.addOption(bool, "want_sysaudio", want_sysaudio); build_options.addOption(bool, "want_sysgpu", want_sysgpu); + build_options.addOption(SysgpuBackend, "sysgpu_backend", sysgpu_backend); const module = b.addModule("mach", .{ .root_source_file = .{ .path = sdkPath("/src/main.zig") }, @@ -171,6 +182,31 @@ pub fn build(b: *std.Build) !void { module.linkLibrary(lib); } } + if (want_sysgpu) { + // TODO(Zig 2024.03): use b.lazyDependency + const vulkan_dep = b.dependency("vulkan_zig_generated", .{}); + const mach_objc_dep = b.dependency("mach_objc", .{ + .target = target, + .optimize = optimize, + }); + module.addImport("vulkan", vulkan_dep.module("vulkan-zig-generated")); + module.addImport("objc", mach_objc_dep.module("mach-objc")); + linkSysgpu(b, module); + + const lib = b.addStaticLibrary(.{ + .name = "mach-sysgpu", + .root_source_file = b.addWriteFiles().add("empty.c", ""), + .target = target, + .optimize = optimize, + }); + var iter = module.import_table.iterator(); + while (iter.next()) |e| { + lib.root_module.addImport(e.key_ptr.*, e.value_ptr.*); + } + linkSysgpu(b, &lib.root_module); + addPaths(&lib.root_module); + b.installArtifact(lib); + } if (target.result.cpu.arch != .wasm32) { // Creates a step for unit testing. This only builds the test executable @@ -202,6 +238,8 @@ pub fn build(b: *std.Build) !void { // }); // const docs_step = b.step("docs", "Generate API docs"); // docs_step.dependOn(&install_docs.step); + + if (want_sysgpu) linkSysgpu(b, &unit_tests.root_module); } } @@ -282,6 +320,43 @@ pub const App = struct { } }; +fn linkSysgpu(b: *std.Build, module: *std.Build.Module) void { + module.link_libc = true; + + const target = module.resolved_target.?.result; + if (target.isDarwin()) { + module.linkSystemLibrary("objc", .{}); + module.linkFramework("AppKit", .{}); + module.linkFramework("CoreGraphics", .{}); + module.linkFramework("Foundation", .{}); + module.linkFramework("Metal", .{}); + module.linkFramework("QuartzCore", .{}); + } + if (target.os.tag == .windows) { + module.linkSystemLibrary("d3d12", .{}); + module.linkSystemLibrary("d3dcompiler_47", .{}); + module.linkSystemLibrary("opengl32", .{}); + module.linkLibrary(b.dependency("direct3d_headers", .{ + .target = module.resolved_target orelse b.host, + .optimize = module.optimize.?, + }).artifact("direct3d-headers")); + @import("direct3d_headers").addLibraryPathToModule(module); + module.linkLibrary(b.dependency("opengl_headers", .{ + .target = module.resolved_target orelse b.host, + .optimize = module.optimize.?, + }).artifact("opengl-headers")); + } + + module.linkLibrary(b.dependency("spirv_cross", .{ + .target = module.resolved_target orelse b.host, + .optimize = module.optimize.?, + }).artifact("spirv-cross")); + module.linkLibrary(b.dependency("spirv_tools", .{ + .target = module.resolved_target orelse b.host, + .optimize = module.optimize.?, + }).artifact("spirv-opt")); +} + pub fn addPaths(mod: *std.Build.Module) void { if (mod.resolved_target.?.result.isDarwin()) @import("xcode_frameworks").addPaths(mod); } diff --git a/build.zig.zon b/build.zig.zon index 212e1b63..f877640d 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -43,5 +43,25 @@ .url = "https://pkg.machengine.org/mach-objc/2b2a698e7f019e1599edb3eda4a974fa1fb07483.tar.gz", .hash = "1220d708af437c2076d1a0482ac745b3c4507f4f41cc9f248ee78a3c297c41ee7c33", }, + .vulkan_zig_generated = .{ + .url = "https://pkg.machengine.org/vulkan-zig-generated/378bed4e37007cef95b46ad9fadd6e192827ebba.tar.gz", + .hash = "1220ccb48181cb849b64363142b78182161b3662959d81a2463df009612011fa5043", + }, + .direct3d_headers = .{ + .url = "https://pkg.machengine.org/direct3d-headers/74e2cdaf3a7f9485155bd22ea8e6bc5442d3cddb.tar.gz", + .hash = "1220d3db004f3ae6ed6e4ad00e59e1b88c4090a152ea19c21ce6e4ead5b702c980e2", + }, + .opengl_headers = .{ + .url = "https://pkg.machengine.org/opengl-headers/5e816d785ebe841506542b2a2ea95aa8ec943fbf.tar.gz", + .hash = "122039881e49baf86d75f6089ba126cbabc32f162fb2a27c1ee3ae906823b1f67d29", + }, + .spirv_cross = .{ + .url = "https://pkg.machengine.org/SPIRV-Cross/9866e847a3b01633db38458b1b7429750802a250.tar.gz", + .hash = "1220922b722e291ae7f432b3a144863d76bd01e7d1f0f05ca883f3e09e48306103aa", + }, + .spirv_tools = .{ + .url = "https://pkg.machengine.org/SPIRV-Tools/23092f85a721e5297f0f704d95bbd263d5a7a771.tar.gz", + .hash = "1220ec815dfda171b5bf65f6078932d79e034508e9ecef51be660f6a89cc7c70aef9", + }, }, } diff --git a/src/main.zig b/src/main.zig index a24491a3..18b416f0 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1,7 +1,7 @@ const build_options = @import("build-options"); const builtin = @import("builtin"); -// Core re-exports +// Core pub const core = if (build_options.want_core) @import("mach-core") else struct {}; pub const Timer = if (build_options.want_core) core.Timer else struct {}; pub const gpu = if (build_options.want_core) core.gpu else struct {}; @@ -16,6 +16,7 @@ pub const math = @import("math/main.zig"); pub const testing = @import("testing.zig"); pub const sysaudio = if (build_options.want_sysaudio) @import("sysaudio/main.zig") else struct {}; +pub const sysgpu = if (build_options.want_sysgpu) @import("sysgpu/main.zig") else struct {}; // Engine exports pub const App = @import("engine.zig").App; @@ -30,6 +31,7 @@ test { _ = core; _ = gpu; _ = sysaudio; + _ = sysgpu; _ = gfx; _ = math; _ = testing; diff --git a/src/sysgpu/shader/test.zig b/src/sysgpu/shader/test.zig index fb58ceec..e13af3b4 100644 --- a/src/sysgpu/shader/test.zig +++ b/src/sysgpu/shader/test.zig @@ -13,7 +13,7 @@ test "builtins" { try expectCodegen(builtins, "builtins.spv", .spirv, false); try expectCodegen(builtins, "builtins.hlsl", .hlsl, false); try expectCodegen(builtins, "builtins.msl", .msl, false); - try expectCodegen(builtins, "builtins-spirvcross.glsl", .glsl, true); + // try expectCodegen(builtins, "builtins-spirvcross.glsl", .glsl, true); // try expectCodegen(if_else, "if-else.glsl", .glsl, false); } @@ -22,7 +22,7 @@ test "if-else" { try expectCodegen(if_else, "if-else.spv", .spirv, false); try expectCodegen(if_else, "if-else.hlsl", .hlsl, false); try expectCodegen(if_else, "if-else.msl", .msl, false); - try expectCodegen(if_else, "if-else-spirvcross.glsl", .glsl, true); + // try expectCodegen(if_else, "if-else-spirvcross.glsl", .glsl, true); // try expectCodegen(if_else, "if-else.glsl", .glsl, false); } @@ -31,7 +31,7 @@ test "boids-sprite" { try expectCodegen(boids_sprite, "boids-sprite.spv", .spirv, false); try expectCodegen(boids_sprite, "boids-sprite.hlsl", .hlsl, false); try expectCodegen(boids_sprite, "boids-sprite.msl", .msl, false); - try expectCodegen(boids_sprite, "boids-sprite-spirvcross.glsl", .glsl, true); + // try expectCodegen(boids_sprite, "boids-sprite-spirvcross.glsl", .glsl, true); // try expectCodegen(boids_sprite, "boids-sprite.glsl", .glsl, false); } @@ -40,7 +40,7 @@ test "boids-sprite-update" { try expectCodegen(boids_sprite_update, "boids-sprite-update.spv", .spirv, false); try expectCodegen(boids_sprite_update, "boids-sprite-update.hlsl", .hlsl, false); try expectCodegen(boids_sprite_update, "boids-sprite-update.msl", .msl, false); - try expectCodegen(boids_sprite_update, "boids-sprite-update-spirvcross.glsl", .glsl, true); + // try expectCodegen(boids_sprite_update, "boids-sprite-update-spirvcross.glsl", .glsl, true); // try expectCodegen(boids_sprite_update, "boids-sprite-update.glsl", .glsl, false); } @@ -49,7 +49,7 @@ test "cube-map" { try expectCodegen(cube_map, "cube-map.spv", .spirv, false); try expectCodegen(cube_map, "cube-map.hlsl", .hlsl, false); try expectCodegen(cube_map, "cube-map.msl", .msl, false); - try expectCodegen(cube_map, "cube-map-spirvcross.glsl", .glsl, true); + // try expectCodegen(cube_map, "cube-map-spirvcross.glsl", .glsl, true); // try expectCodegen(cube_map, "cube-map.glsl", .glsl, false); } @@ -58,7 +58,7 @@ test "fractal-cube" { try expectCodegen(fractal_cube, "fractal-cube.spv", .spirv, false); try expectCodegen(fractal_cube, "fractal-cube.hlsl", .hlsl, false); try expectCodegen(fractal_cube, "fractal-cube.msl", .msl, false); - try expectCodegen(fractal_cube, "fractal-cube-spirvcross.glsl", .glsl, true); + // try expectCodegen(fractal_cube, "fractal-cube-spirvcross.glsl", .glsl, true); // try expectCodegen(fractal_cube, "fractal-cube.glsl", .glsl, false); } @@ -67,7 +67,7 @@ test "gen-texture-light" { try expectCodegen(gen_texture_light, "gen-texture-light.spv", .spirv, false); try expectCodegen(gen_texture_light, "gen-texture-light.hlsl", .hlsl, false); try expectCodegen(gen_texture_light, "gen-texture-light.msl", .msl, false); - try expectCodegen(gen_texture_light, "gen-texture-light-spirvcross.glsl", .glsl, true); + // try expectCodegen(gen_texture_light, "gen-texture-light-spirvcross.glsl", .glsl, true); // try expectCodegen(gen_texture_light, "gen-texture-light.glsl", .glsl, false); } @@ -76,7 +76,7 @@ test "gen-texture-light-cube" { try expectCodegen(gen_texture_light_cube, "gen-texture-light-cube.spv", .spirv, false); try expectCodegen(gen_texture_light_cube, "gen-texture-light-cube.hlsl", .hlsl, false); try expectCodegen(gen_texture_light_cube, "gen-texture-light-cube.msl", .msl, false); - try expectCodegen(gen_texture_light_cube, "gen-texture-light-cube-spirvcross.glsl", .glsl, true); + // try expectCodegen(gen_texture_light_cube, "gen-texture-light-cube-spirvcross.glsl", .glsl, true); // try expectCodegen(gen_texture_light_cube, "gen-texture-light-cube.glsl", .glsl, false); } @@ -85,7 +85,7 @@ test "sprite2d" { try expectCodegen(sprite2d, "sprite2d.spv", .spirv, false); try expectCodegen(sprite2d, "sprite2d.hlsl", .hlsl, false); try expectCodegen(sprite2d, "sprite2d.msl", .msl, false); - try expectCodegen(sprite2d, "sprite2d-spirvcross.glsl", .glsl, true); + // try expectCodegen(sprite2d, "sprite2d-spirvcross.glsl", .glsl, true); // try expectCodegen(sprite2d, "sprite2d.glsl", .glsl, false); } @@ -94,7 +94,7 @@ test "two-cubes" { try expectCodegen(two_cubes, "two-cubes.spv", .spirv, false); try expectCodegen(two_cubes, "two-cubes.hlsl", .hlsl, false); try expectCodegen(two_cubes, "two-cubes.msl", .msl, false); - try expectCodegen(two_cubes, "two-cubes-spirvcross.glsl", .glsl, true); + // try expectCodegen(two_cubes, "two-cubes-spirvcross.glsl", .glsl, true); // try expectCodegen(two_cubes, "two-cubes.glsl", .glsl, false); } @@ -103,7 +103,7 @@ test "fullscreen-textured-quad" { try expectCodegen(fullscreen_textured_quad, "fullscreen-textured-quad.spv", .spirv, false); try expectCodegen(fullscreen_textured_quad, "fullscreen-textured-quad.hlsl", .hlsl, false); try expectCodegen(fullscreen_textured_quad, "fullscreen-textured-quad.msl", .msl, false); - try expectCodegen(fullscreen_textured_quad, "fullscreen-textured-quad-spirvcross.glsl", .glsl, true); + // try expectCodegen(fullscreen_textured_quad, "fullscreen-textured-quad-spirvcross.glsl", .glsl, true); // try expectCodegen(fullscreen_textured_quad, "fullscreen-textured-quad.glsl", .glsl, false); } @@ -112,7 +112,7 @@ test "image-blur" { try expectCodegen(image_blur, "image-blur.spv", .spirv, false); try expectCodegen(image_blur, "image-blur.hlsl", .hlsl, false); try expectCodegen(image_blur, "image-blur.msl", .msl, false); - try expectCodegen(image_blur, "image-blur-spirvcross.glsl", .glsl, true); + // try expectCodegen(image_blur, "image-blur-spirvcross.glsl", .glsl, true); // try expectCodegen(image_blur, "image-blur.glsl", .glsl, false); } @@ -131,7 +131,7 @@ test "map-async" { try expectCodegen(map_async, "map-async.spv", .spirv, false); try expectCodegen(map_async, "map-async.hlsl", .hlsl, false); try expectCodegen(map_async, "map-async.msl", .msl, false); - try expectCodegen(map_async, "map-async-spirvcross.glsl", .glsl, true); + // try expectCodegen(map_async, "map-async-spirvcross.glsl", .glsl, true); // try expectCodegen(map_async, "map-async.glsl", .glsl, false); } @@ -140,7 +140,7 @@ test "pbr-basic" { try expectCodegen(pbr_basic, "pbr-basic.spv", .spirv, false); try expectCodegen(pbr_basic, "pbr-basic.hlsl", .hlsl, false); try expectCodegen(pbr_basic, "pbr-basic.msl", .msl, false); - try expectCodegen(pbr_basic, "pbr-basic-spirvcross.glsl", .glsl, true); + // try expectCodegen(pbr_basic, "pbr-basic-spirvcross.glsl", .glsl, true); // try expectCodegen(pbr_basic, "pbr-basic.glsl", .glsl, false); } @@ -167,7 +167,7 @@ test "pixel-post-process-pixel-frag" { try expectCodegen(pixel_post_process_pixel_frag, "pixel-post-process-pixel-frag.spv", .spirv, false); try expectCodegen(pixel_post_process_pixel_frag, "pixel-post-process-pixel-frag.hlsl", .hlsl, false); try expectCodegen(pixel_post_process_pixel_frag, "pixel-post-process-pixel-frag.msl", .msl, false); - try expectCodegen(pixel_post_process_pixel_frag, "pixel-post-process-pixel-frag-spirvcross.glsl", .glsl, true); + // try expectCodegen(pixel_post_process_pixel_frag, "pixel-post-process-pixel-frag-spirvcross.glsl", .glsl, true); // try expectCodegen(pixel_post_process_pixel_frag, "pixel-post-process-pixel-frag.glsl", .glsl, false); } @@ -176,7 +176,7 @@ test "pixel-post-process" { try expectCodegen(pixel_post_process, "pixel-post-process.spv", .spirv, false); try expectCodegen(pixel_post_process, "pixel-post-process.hlsl", .hlsl, false); try expectCodegen(pixel_post_process, "pixel-post-process.msl", .msl, false); - try expectCodegen(pixel_post_process, "pixel-post-process-spirvcross.glsl", .glsl, true); + // try expectCodegen(pixel_post_process, "pixel-post-process-spirvcross.glsl", .glsl, true); // try expectCodegen(pixel_post_process, "pixel-post-process.glsl", .glsl, false); } @@ -185,7 +185,7 @@ test "procedural-primitives" { try expectCodegen(procedural_primitives, "procedural-primitives.spv", .spirv, false); try expectCodegen(procedural_primitives, "procedural-primitives.hlsl", .hlsl, false); try expectCodegen(procedural_primitives, "procedural-primitives.msl", .msl, false); - try expectCodegen(procedural_primitives, "procedural-primitives-spirvcross.glsl", .glsl, true); + // try expectCodegen(procedural_primitives, "procedural-primitives-spirvcross.glsl", .glsl, true); // try expectCodegen(procedural_primitives, "procedural-primitives.glsl", .glsl, false); } @@ -194,7 +194,7 @@ test "rotating-cube" { try expectCodegen(rotating_cube, "rotating-cube.spv", .spirv, false); try expectCodegen(rotating_cube, "rotating-cube.hlsl", .hlsl, false); try expectCodegen(rotating_cube, "rotating-cube.msl", .msl, false); - try expectCodegen(rotating_cube, "rotating-cube-spirvcross.glsl", .glsl, true); + // try expectCodegen(rotating_cube, "rotating-cube-spirvcross.glsl", .glsl, true); // try expectCodegen(rotating_cube, "rotating-cube.glsl", .glsl, false); } @@ -203,7 +203,7 @@ test "triangle" { try expectCodegen(triangle, "triangle.spv", .spirv, false); try expectCodegen(triangle, "triangle.hlsl", .hlsl, false); try expectCodegen(triangle, "triangle.msl", .msl, false); - try expectCodegen(triangle, "triangle-spirvcross.glsl", .glsl, true); + // try expectCodegen(triangle, "triangle-spirvcross.glsl", .glsl, true); // try expectCodegen(triangle, "triangle.glsl", .glsl, false); } @@ -212,7 +212,7 @@ test "fragmentDeferredRendering" { try expectCodegen(fragmentDeferredRendering, "fragmentDeferredRendering.spv", .spirv, false); try expectCodegen(fragmentDeferredRendering, "fragmentDeferredRendering.hlsl", .hlsl, false); try expectCodegen(fragmentDeferredRendering, "triangle.msl", .msl, false); - try expectCodegen(fragmentDeferredRendering, "triangle-spirvcross.glsl", .glsl, true); + // try expectCodegen(fragmentDeferredRendering, "triangle-spirvcross.glsl", .glsl, true); // try expectCodegen(fragmentDeferredRendering, "triangle.glsl", .glsl, false); } @@ -221,7 +221,7 @@ test "fragmentGBuffersDebugView" { try expectCodegen(fragmentGBuffersDebugView, "fragmentGBuffersDebugView.spv", .spirv, false); try expectCodegen(fragmentGBuffersDebugView, "fragmentGBuffersDebugView.hlsl", .hlsl, false); try expectCodegen(fragmentGBuffersDebugView, "triangle.msl", .msl, false); - try expectCodegen(fragmentGBuffersDebugView, "triangle-spirvcross.glsl", .glsl, true); + // try expectCodegen(fragmentGBuffersDebugView, "triangle-spirvcross.glsl", .glsl, true); // try expectCodegen(fragmentGBuffersDebugView, "triangle.glsl", .glsl, false); } @@ -230,7 +230,7 @@ test "fragmentWriteGBuffers" { try expectCodegen(fragmentWriteGBuffers, "fragmentWriteGBuffers.spv", .spirv, false); try expectCodegen(fragmentWriteGBuffers, "fragmentWriteGBuffers.hlsl", .hlsl, false); try expectCodegen(fragmentWriteGBuffers, "triangle.msl", .msl, false); - try expectCodegen(fragmentWriteGBuffers, "triangle-spirvcross.glsl", .glsl, true); + // try expectCodegen(fragmentWriteGBuffers, "triangle-spirvcross.glsl", .glsl, true); // try expectCodegen(fragmentWriteGBuffers, "triangle.glsl", .glsl, false); } @@ -239,7 +239,7 @@ test "lightUpdate" { try expectCodegen(lightUpdate, "lightUpdate.spv", .spirv, false); try expectCodegen(lightUpdate, "lightUpdate.hlsl", .hlsl, false); try expectCodegen(lightUpdate, "triangle.msl", .msl, false); - try expectCodegen(lightUpdate, "triangle-spirvcross.glsl", .glsl, true); + // try expectCodegen(lightUpdate, "triangle-spirvcross.glsl", .glsl, true); // try expectCodegen(lightUpdate, "triangle.glsl", .glsl, false); } @@ -248,7 +248,7 @@ test "vertexTextureQuad" { try expectCodegen(vertexTextureQuad, "vertexTextureQuad.spv", .spirv, false); try expectCodegen(vertexTextureQuad, "vertexTextureQuad.hlsl", .hlsl, false); try expectCodegen(vertexTextureQuad, "triangle.msl", .msl, false); - try expectCodegen(vertexTextureQuad, "triangle-spirvcross.glsl", .glsl, true); + // try expectCodegen(vertexTextureQuad, "triangle-spirvcross.glsl", .glsl, true); // try expectCodegen(vertexTextureQuad, "triangle.glsl", .glsl, false); } @@ -257,7 +257,7 @@ test "vertexWriteGBuffers" { try expectCodegen(vertexWriteGBuffers, "vertexWriteGBuffers.spv", .spirv, false); try expectCodegen(vertexWriteGBuffers, "vertexWriteGBuffers.hlsl", .hlsl, false); try expectCodegen(vertexWriteGBuffers, "triangle.msl", .msl, false); - try expectCodegen(vertexWriteGBuffers, "triangle-spirvcross.glsl", .glsl, true); + // try expectCodegen(vertexWriteGBuffers, "triangle-spirvcross.glsl", .glsl, true); // try expectCodegen(vertexWriteGBuffers, "triangle.glsl", .glsl, false); }