initial commit
This commit is contained in:
34
.github/workflows/build.yml
vendored
git.filemode.normal_file
34
.github/workflows/build.yml
vendored
git.filemode.normal_file
@@ -0,0 +1,34 @@
|
||||
name: Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "master" ]
|
||||
pull_request:
|
||||
branches: [ "master" ]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
deployments: write
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
if: "!contains(github.event.head_commit.message, 'ci skip')"
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: mlugg/setup-zig@v2
|
||||
|
||||
- name: Building
|
||||
run: zig build
|
||||
|
||||
- name: Generating docs
|
||||
run: zig build docs
|
||||
|
||||
- name: Publish to Cloudflare Pages
|
||||
uses: cloudflare/wrangler-action@v3
|
||||
with:
|
||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||
command: pages deploy zig-out/docs --project-name=spirv-interpreter-docs
|
||||
gitHubToken: ${{ secrets.GITHUB_TOKEN }}
|
||||
23
.github/workflows/test.yml
vendored
git.filemode.normal_file
23
.github/workflows/test.yml
vendored
git.filemode.normal_file
@@ -0,0 +1,23 @@
|
||||
name: Test
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "master" ]
|
||||
pull_request:
|
||||
branches: [ "master" ]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
deployments: write
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
if: "!contains(github.event.head_commit.message, 'ci skip')"
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: mlugg/setup-zig@v2
|
||||
|
||||
- name: Test
|
||||
run: zig build test
|
||||
85
build.zig
git.filemode.normal_file
85
build.zig
git.filemode.normal_file
@@ -0,0 +1,85 @@
|
||||
const std = @import("std");
|
||||
|
||||
pub fn build(b: *std.Build) void {
|
||||
const target = b.standardTargetOptions(.{});
|
||||
const optimize = b.standardOptimizeOption(.{});
|
||||
|
||||
const mod = b.createModule(.{
|
||||
.root_source_file = b.path("src/lib.zig"),
|
||||
.target = target,
|
||||
.optimize = optimize,
|
||||
});
|
||||
|
||||
const spirv_headers = b.dependency("spirv_headers", .{});
|
||||
mod.addSystemIncludePath(spirv_headers.path("include/spirv/unified1"));
|
||||
|
||||
const lib = b.addLibrary(.{
|
||||
.name = "spirv_interpreter",
|
||||
.root_module = mod,
|
||||
.linkage = .dynamic,
|
||||
});
|
||||
const lib_install = b.addInstallArtifact(lib, .{});
|
||||
|
||||
// Zig example setup
|
||||
|
||||
const example_exe = b.addExecutable(.{
|
||||
.name = "spirv_interpreter_example",
|
||||
.root_module = b.createModule(.{
|
||||
.root_source_file = b.path("example/main.zig"),
|
||||
.target = target,
|
||||
.optimize = optimize,
|
||||
.imports = &.{
|
||||
.{ .name = "spv", .module = mod },
|
||||
},
|
||||
}),
|
||||
});
|
||||
|
||||
const spirv_target = b.resolveTargetQuery(.{
|
||||
.cpu_arch = .spirv32,
|
||||
.cpu_model = .{ .explicit = &std.Target.spirv.cpu.vulkan_v1_2 },
|
||||
.os_tag = .vulkan,
|
||||
.ofmt = .spirv,
|
||||
});
|
||||
|
||||
const shader = b.addObject(.{
|
||||
.name = "shader.zig",
|
||||
.root_module = b.createModule(.{
|
||||
.root_source_file = b.path("example/shader.zig"),
|
||||
.target = spirv_target,
|
||||
}),
|
||||
.use_llvm = false,
|
||||
});
|
||||
|
||||
example_exe.root_module.addAnonymousImport("shader", .{ .root_source_file = shader.getEmittedBin() });
|
||||
|
||||
const example_install = b.addInstallArtifact(example_exe, .{});
|
||||
example_install.step.dependOn(&lib_install.step);
|
||||
|
||||
const run_example = b.addRunArtifact(example_exe);
|
||||
run_example.step.dependOn(&example_install.step);
|
||||
|
||||
const run_example_step = b.step("example", "Run the basic example");
|
||||
run_example_step.dependOn(&run_example.step);
|
||||
|
||||
// Zig unit tests setup
|
||||
|
||||
const lib_tests = b.addTest(.{ .root_module = mod });
|
||||
const run_tests = b.addRunArtifact(lib_tests);
|
||||
const test_step = b.step("test", "Run Zig unit tests");
|
||||
test_step.dependOn(&run_tests.step);
|
||||
|
||||
// Docs generation
|
||||
|
||||
const autodoc_test = b.addObject(.{
|
||||
.name = "lib",
|
||||
.root_module = mod,
|
||||
});
|
||||
const install_docs = b.addInstallDirectory(.{
|
||||
.source_dir = autodoc_test.getEmittedDocs(),
|
||||
.install_dir = .prefix,
|
||||
.install_subdir = "docs",
|
||||
});
|
||||
|
||||
const docs_step = b.step("docs", "Build and install the documentation");
|
||||
docs_step.dependOn(&install_docs.step);
|
||||
}
|
||||
18
build.zig.zon
git.filemode.normal_file
18
build.zig.zon
git.filemode.normal_file
@@ -0,0 +1,18 @@
|
||||
.{
|
||||
.name = .SPIRV_Interpreter,
|
||||
.version = "0.0.1",
|
||||
.dependencies = .{
|
||||
.spirv_headers = .{
|
||||
.url = "git+https://github.com/KhronosGroup/SPIRV-Headers#0a7f626a6ae86284a413d105b47a6fb413bf6c92",
|
||||
.hash = "N-V-__8AAGOhPABkbhEc-SenlpOzOI4ppi0CDXVSteii5ywV",
|
||||
},
|
||||
},
|
||||
.minimum_zig_version = "0.15.2",
|
||||
.paths = .{
|
||||
"build.zig",
|
||||
"build.zig.zon",
|
||||
"src",
|
||||
"LICENSE",
|
||||
},
|
||||
.fingerprint = 0xd87ec8ab9fa9396a,
|
||||
}
|
||||
20
example/main.zig
git.filemode.normal_file
20
example/main.zig
git.filemode.normal_file
@@ -0,0 +1,20 @@
|
||||
const std = @import("std");
|
||||
const spv = @import("spv");
|
||||
|
||||
const shader_source = @embedFile("shader");
|
||||
|
||||
pub fn main() !void {
|
||||
{
|
||||
var gpa: std.heap.DebugAllocator(.{}) = .init;
|
||||
defer _ = gpa.deinit();
|
||||
|
||||
const allocator = gpa.allocator();
|
||||
|
||||
const ctx = try spv.Interpreter.init();
|
||||
defer ctx.deinit();
|
||||
|
||||
const module = try spv.Module.init(allocator, &ctx, @ptrCast(@alignCast(shader_source)));
|
||||
defer module.deinit(allocator);
|
||||
}
|
||||
std.log.info("Successfully executed", .{});
|
||||
}
|
||||
10
example/shader.zig
git.filemode.normal_file
10
example/shader.zig
git.filemode.normal_file
@@ -0,0 +1,10 @@
|
||||
const std = @import("std");
|
||||
const gpu = std.gpu;
|
||||
|
||||
extern var frag_color: @Vector(4, f32) addrspace(.output);
|
||||
|
||||
export fn main() callconv(.spirv_fragment) void {
|
||||
gpu.location(&frag_color, 0);
|
||||
|
||||
frag_color = .{ 1.0, 1.0, 1.0, 1.0 };
|
||||
}
|
||||
0
src/Image.zig
git.filemode.normal_file
0
src/Image.zig
git.filemode.normal_file
9
src/Interpreter.zig
git.filemode.normal_file
9
src/Interpreter.zig
git.filemode.normal_file
@@ -0,0 +1,9 @@
|
||||
const Self = @This();
|
||||
|
||||
pub fn init() !Self {
|
||||
return .{};
|
||||
}
|
||||
|
||||
pub fn deinit(self: *const Self) void {
|
||||
_ = self;
|
||||
}
|
||||
58
src/Module.zig
git.filemode.normal_file
58
src/Module.zig
git.filemode.normal_file
@@ -0,0 +1,58 @@
|
||||
const std = @import("std");
|
||||
const lib = @import("lib.zig");
|
||||
|
||||
const SpvVoid = lib.SpvVoid;
|
||||
const SpvByte = lib.SpvByte;
|
||||
const SpvWord = lib.SpvWord;
|
||||
const SpvBool = lib.SpvBool;
|
||||
const spv = lib.spv;
|
||||
|
||||
const Interpreter = @import("Interpreter.zig");
|
||||
const WordIterator = @import("WordIterator.zig");
|
||||
|
||||
const Self = @This();
|
||||
|
||||
const SpvEntryPoint = struct {
|
||||
exec_model: spv.SpvExecutionModel,
|
||||
id: SpvWord,
|
||||
name: []const u8,
|
||||
globals_count: SpvWord,
|
||||
globals: []const SpvWord,
|
||||
};
|
||||
|
||||
ctx: *const Interpreter,
|
||||
|
||||
it: WordIterator,
|
||||
|
||||
version_major: SpvByte,
|
||||
version_minor: SpvByte,
|
||||
generator_magic: SpvWord,
|
||||
|
||||
bound: SpvWord,
|
||||
|
||||
code: []const SpvWord,
|
||||
|
||||
addressing: spv.SpvAddressingModel,
|
||||
memory_model: spv.SpvMemoryModel,
|
||||
|
||||
entry_point_count: SpvWord,
|
||||
entry_points: []const SpvEntryPoint,
|
||||
|
||||
local_size_x: SpvWord,
|
||||
local_size_y: SpvWord,
|
||||
local_size_z: SpvWord,
|
||||
|
||||
pub fn init(allocator: std.mem.Allocator, ctx: *const Interpreter, source: []const SpvWord) !Self {
|
||||
var self: Self = std.mem.zeroInit(Self, .{
|
||||
.ctx = ctx,
|
||||
.code = try allocator.dupe(SpvWord, source),
|
||||
});
|
||||
|
||||
self.it = WordIterator.init(self.code);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
pub fn deinit(self: *const Self, allocator: std.mem.Allocator) void {
|
||||
allocator.free(self.code);
|
||||
}
|
||||
9
src/State.zig
git.filemode.normal_file
9
src/State.zig
git.filemode.normal_file
@@ -0,0 +1,9 @@
|
||||
const std = @import("std");
|
||||
|
||||
const Interpreter = @import("Interpreter.zig");
|
||||
const Module = @import("Module.zig");
|
||||
|
||||
const Self = @This();
|
||||
|
||||
ctx: *Interpreter,
|
||||
owner: *Module,
|
||||
33
src/WordIterator.zig
git.filemode.normal_file
33
src/WordIterator.zig
git.filemode.normal_file
@@ -0,0 +1,33 @@
|
||||
const lib = @import("lib.zig");
|
||||
|
||||
const SpvWord = lib.SpvWord;
|
||||
|
||||
const Self = @This();
|
||||
|
||||
buffer: []const SpvWord,
|
||||
index: usize,
|
||||
|
||||
pub fn init(buffer: []const SpvWord) Self {
|
||||
return .{
|
||||
.buffer = buffer,
|
||||
.index = 0,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn next(self: *Self) ?SpvWord {
|
||||
const word = self.peek() orelse return null;
|
||||
self.index += 1;
|
||||
return word;
|
||||
}
|
||||
|
||||
pub fn peek(self: *const Self) ?SpvWord {
|
||||
return if (self.index >= self.buffer.len) null else self.buffer[self.index];
|
||||
}
|
||||
|
||||
pub fn skip(self: *Self) bool {
|
||||
if (self.index >= self.buffer.len) {
|
||||
return false;
|
||||
}
|
||||
self.index += 1;
|
||||
return true;
|
||||
}
|
||||
21
src/lib.zig
git.filemode.normal_file
21
src/lib.zig
git.filemode.normal_file
@@ -0,0 +1,21 @@
|
||||
const std = @import("std");
|
||||
pub const spv = @cImport(@cInclude("spirv.h"));
|
||||
|
||||
pub const Image = @import("Image.zig");
|
||||
pub const Interpreter = @import("Interpreter.zig");
|
||||
pub const Module = @import("Module.zig");
|
||||
pub const State = @import("State.zig");
|
||||
const opcode = @import("opcode.zig");
|
||||
|
||||
pub const SpvVoid = void;
|
||||
pub const SpvByte = u8;
|
||||
pub const SpvWord = u32;
|
||||
pub const SpvBool = bool;
|
||||
|
||||
test {
|
||||
std.testing.refAllDecls(Image);
|
||||
std.testing.refAllDecls(Interpreter);
|
||||
std.testing.refAllDecls(Module);
|
||||
std.testing.refAllDecls(State);
|
||||
std.testing.refAllDecls(opcode);
|
||||
}
|
||||
0
src/opcode.zig
git.filemode.normal_file
0
src/opcode.zig
git.filemode.normal_file
Reference in New Issue
Block a user