From e09a41754ffa115ba1668f82698140b2b727b7fd Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Thu, 26 Feb 2026 01:03:52 +0100 Subject: [PATCH] fixing descriptor sets population --- build.zig | 2 +- sandbox/main.zig | 27 ++++++++++------------ sandbox/shader.nzsl | 4 ++-- sandbox/shader.spv | Bin 1068 -> 900 bytes sandbox/shader.spv.txt | 51 +++++++++++++++++------------------------ src/Module.zig | 10 +++++--- 6 files changed, 43 insertions(+), 51 deletions(-) diff --git a/build.zig b/build.zig index 214a7be..8dfe6a2 100644 --- a/build.zig +++ b/build.zig @@ -64,7 +64,7 @@ pub fn build(b: *std.Build) void { // Zig sandbox setup const sandbox_exe = b.addExecutable(.{ - .name = "spirv_interpreter_sandbpx", + .name = "spirv_interpreter_sandbox", .root_module = b.createModule(.{ .root_source_file = b.path("sandbox/main.zig"), .target = target, diff --git a/sandbox/main.zig b/sandbox/main.zig index eaabab5..03a23f0 100644 --- a/sandbox/main.zig +++ b/sandbox/main.zig @@ -26,24 +26,21 @@ pub fn main() !void { var ssbo: SSBO = .{}; - try rt.writeDescriptorSet(allocator, std.mem.asBytes(&ssbo), 0, 0); - for (0..16) |i| { for (0..16) |x| { - for (0..16) |y| { - const global_invocation_indices = [3]i32{ - @as(i32, @intCast(i * 16 + x)), - @as(i32, @intCast(y)), - 1, - }; + const global_invocation_indices = [3]i32{ + @as(i32, @intCast(i * 16 + x)), + 1, + 1, + }; - try rt.writeBuiltIn(std.mem.asBytes(&global_invocation_indices), .GlobalInvocationId); - rt.callEntryPoint(allocator, entry) catch |err| switch (err) { - spv.Runtime.RuntimeError.OutOfBounds => continue, - else => return err, - }; - try rt.readDescriptorSet(std.mem.asBytes(&ssbo), 0, 0); - } + try rt.writeBuiltIn(std.mem.asBytes(&global_invocation_indices), .GlobalInvocationId); + try rt.writeDescriptorSet(allocator, std.mem.asBytes(&ssbo), 0, 0); + rt.callEntryPoint(allocator, entry) catch |err| switch (err) { + spv.Runtime.RuntimeError.OutOfBounds => continue, + else => return err, + }; + try rt.readDescriptorSet(std.mem.asBytes(&ssbo), 0, 0); } } diff --git a/sandbox/shader.nzsl b/sandbox/shader.nzsl index 6dbc17b..7ac2ab0 100644 --- a/sandbox/shader.nzsl +++ b/sandbox/shader.nzsl @@ -18,8 +18,8 @@ external } [entry(compute)] -[workgroup(16, 16, 1)] +[workgroup(16, 1, 1)] fn main(input: Input) { - ssbo.data[input.indices.x * input.indices.y] = i32(input.indices.x * input.indices.y); + ssbo.data[input.indices.x] = i32(input.indices.x); } diff --git a/sandbox/shader.spv b/sandbox/shader.spv index bc1bdc897edfeac7ad3a9a928b4c257541c3e7b5..8f72e42459370b43d624b699df3745acf09cbf06 100644 GIT binary patch delta 334 zcmYjMOA5k36wCC36)m>b`qvh^a4l{GQ4vqjBX|#?AYPz&2sduLoh}3uX~BVz_mY{s zHxKXH@NFw=00x&}fwc596PC-!4*>`PVaoh&!sq*F;uH?Xl&lKsliSH!6}qg$EWGG< z$s4*Ia#ZODxbRu`Dy>c4!~XRx*0mr1`CDc*+4l+QIWs)+pwdV1qXb$&>h_y$HT+gdg2Uzpu#(LbD14S}w1~X_Ui>ttIu8 z{HQDw<(!r?n_Ul_qo$k%=5#x(q)zV1li|zihLd<*FE77!@b>VrcS9bnPWw(0 zQ$JRnv+!Qj$I(z)6LD~+ zMH%>=IJl#w1e5#kTUN|0cwOI$VsO{Dsu&FI-w7B013qe>nn$fH14k40vo7Nf;C4Da z#l!O|!oc0Us$wvf>*GHS_iYLTcYRxm!O-G#ZYze58eF_nU4}Mlr@BjWwEwE}Q1%BG C`ZNpx diff --git a/sandbox/shader.spv.txt b/sandbox/shader.spv.txt index 784b4e1..a1a6cc4 100644 --- a/sandbox/shader.spv.txt +++ b/sandbox/shader.spv.txt @@ -1,11 +1,11 @@ Version 1.0 Generator: 2560130 -Bound: 41 +Bound: 32 Schema: 0 OpCapability Capability(Shader) OpMemoryModel AddressingModel(Logical) MemoryModel(GLSL450) - OpEntryPoint ExecutionModel(GLCompute) %18 "main" %11 - OpExecutionMode %18 ExecutionMode(LocalSize) 16 16 1 + OpEntryPoint ExecutionModel(GLCompute) %17 "main" %11 + OpExecutionMode %17 ExecutionMode(LocalSize) 16 1 1 OpSource SourceLanguage(NZSL) 4198400 OpSourceExtension "Version: 1.1" OpName %3 "SSBO" @@ -14,7 +14,7 @@ Schema: 0 OpMemberName %14 0 "indices" OpName %5 "ssbo" OpName %11 "global_invocation_indices" - OpName %18 "main" + OpName %17 "main" OpDecorate %5 Decoration(Binding) 0 OpDecorate %5 Decoration(DescriptorSet) 0 OpDecorate %11 Decoration(BuiltIn) BuiltIn(GlobalInvocationId) @@ -36,33 +36,24 @@ Schema: 0 %14 = OpTypeStruct %9 %15 = OpTypePointer StorageClass(Function) %14 %16 = OpTypeRuntimeArray %1 -%17 = OpConstant %1 i32(1) -%31 = OpTypePointer StorageClass(Uniform) %2 -%40 = OpTypePointer StorageClass(Uniform) %1 +%26 = OpTypePointer StorageClass(Uniform) %2 +%31 = OpTypePointer StorageClass(Uniform) %1 %5 = OpVariable %4 StorageClass(Uniform) %11 = OpVariable %10 StorageClass(Input) -%18 = OpFunction %6 FunctionControl(0) %7 -%19 = OpLabel -%20 = OpVariable %15 StorageClass(Function) -%21 = OpAccessChain %13 %20 %12 - OpCopyMemory %21 %11 -%22 = OpAccessChain %13 %20 %12 -%23 = OpLoad %9 %22 -%24 = OpCompositeExtract %8 %23 0 -%25 = OpAccessChain %13 %20 %12 -%26 = OpLoad %9 %25 -%27 = OpCompositeExtract %8 %26 1 -%28 = OpIMul %8 %24 %27 -%29 = OpBitcast %1 %28 -%30 = OpAccessChain %31 %5 %12 -%32 = OpAccessChain %13 %20 %12 -%33 = OpLoad %9 %32 -%34 = OpCompositeExtract %8 %33 0 -%35 = OpAccessChain %13 %20 %12 -%36 = OpLoad %9 %35 -%37 = OpCompositeExtract %8 %36 1 -%38 = OpIMul %8 %34 %37 -%39 = OpAccessChain %40 %30 %38 - OpStore %39 %29 +%17 = OpFunction %6 FunctionControl(0) %7 +%18 = OpLabel +%19 = OpVariable %15 StorageClass(Function) +%20 = OpAccessChain %13 %19 %12 + OpCopyMemory %20 %11 +%21 = OpAccessChain %13 %19 %12 +%22 = OpLoad %9 %21 +%23 = OpCompositeExtract %8 %22 0 +%24 = OpBitcast %1 %23 +%25 = OpAccessChain %26 %5 %12 +%27 = OpAccessChain %13 %19 %12 +%28 = OpLoad %9 %27 +%29 = OpCompositeExtract %8 %28 0 +%30 = OpAccessChain %31 %25 %29 + OpStore %30 %24 OpReturn OpFunctionEnd diff --git a/src/Module.zig b/src/Module.zig index df18c6d..575985a 100644 --- a/src/Module.zig +++ b/src/Module.zig @@ -212,7 +212,8 @@ fn populateMaps(self: *Self) ModuleError!void { if (result.variant == null or std.meta.activeTag(result.variant.?) != .Variable) continue; - var current_set: usize = 0; + var set: ?usize = null; + var binding: ?usize = null; for (result.decorations.items) |decoration| { switch (result.variant.?.Variable.storage_class) { @@ -235,14 +236,17 @@ fn populateMaps(self: *Self) ModuleError!void { .UniformConstant, => { switch (decoration.rtype) { - .Binding => self.bindings[current_set][decoration.literal_1] = @intCast(id), - .DescriptorSet => current_set = decoration.literal_1, + .Binding => binding = decoration.literal_1, + .DescriptorSet => set = decoration.literal_1, else => {}, } }, else => {}, } } + if (set != null and binding != null) { + self.bindings[set.?][binding.?] = @intCast(id); + } } }