diff --git a/ffi/SpirvInterpreter.h b/ffi/SpirvInterpreter.h index 2bfee61..f0326e7 100644 --- a/ffi/SpirvInterpreter.h +++ b/ffi/SpirvInterpreter.h @@ -103,6 +103,7 @@ SPV_API SpvResult SpvGetEntryPointByName(SpvRuntime runtime, const char* name, S SPV_API SpvResult SpvCallEntryPoint(SpvRuntime runtime, SpvWord entry_point_index); SPV_API SpvResult SpvReadOutput(SpvRuntime runtime, SpvByte* output, SpvSize output_size, SpvWord result); +SPV_API SpvResult SpvReadBuiltIn(SpvRuntime runtime, SpvByte* output, SpvSize output_size, SpvBuiltIn builtin); SPV_API SpvResult SpvWriteInput(SpvRuntime runtime, const SpvByte* input, SpvSize input_size, SpvWord result); SPV_API SpvResult SpvWriteBuiltIn(SpvRuntime runtime, const SpvByte* input, SpvSize input_size, SpvBuiltIn builtin); diff --git a/ffi/runtime.zig b/ffi/runtime.zig index d885d03..07951b1 100644 --- a/ffi/runtime.zig +++ b/ffi/runtime.zig @@ -91,6 +91,11 @@ export fn SpvReadOutput(rt: *spv.Runtime, output: [*]u8, output_size: u32, resul return .Success; } +export fn SpvReadBuiltIn(rt: *spv.Runtime, output: [*]u8, output_size: u32, builtin: spv.spv.SpvBuiltIn) callconv(.c) ffi.Result { + rt.readBuiltIn(output[0..output_size], builtin) catch |err| return toCResult(err); + return .Success; +} + export fn SpvWriteInput(rt: *spv.Runtime, input: [*]const u8, input_size: u32, result: spv.SpvWord) callconv(.c) ffi.Result { rt.writeInput(input[0..input_size], result) catch |err| return toCResult(err); return .Success; diff --git a/src/Runtime.zig b/src/Runtime.zig index b65e252..63db18a 100644 --- a/src/Runtime.zig +++ b/src/Runtime.zig @@ -250,6 +250,14 @@ pub fn readOutput(self: *const Self, output: []u8, result: SpvWord) RuntimeError } } +pub fn readBuiltIn(self: *const Self, output: []u8, builtin: spv.SpvBuiltIn) RuntimeError!void { + if (self.mod.builtins.get(builtin)) |result| { + _ = try self.results[result].variant.?.Variable.value.read(output); + } else { + return RuntimeError.NotFound; + } +} + pub fn writeInput(self: *const Self, input: []const u8, result: SpvWord) RuntimeError!void { if (std.mem.indexOfScalar(SpvWord, &self.mod.input_locations, result)) |_| { _ = try self.results[result].variant.?.Variable.value.writeConst(input);