diff --git a/src/Runtime.zig b/src/Runtime.zig index 8651497..9437d6b 100644 --- a/src/Runtime.zig +++ b/src/Runtime.zig @@ -11,6 +11,7 @@ const SpvByte = spv.SpvByte; const SpvWord = spv.SpvWord; const SpvBool = spv.SpvBool; +const Image = @import("Image.zig"); const Module = @import("Module.zig"); const Result = @import("Result.zig"); const WordIterator = @import("WordIterator.zig"); diff --git a/src/Value.zig b/src/Value.zig index a0312d1..0d0e77b 100644 --- a/src/Value.zig +++ b/src/Value.zig @@ -107,7 +107,20 @@ pub const Value = union(Type) { values: []Self, }, Function: noreturn, - Image: struct {}, + Image: struct { + type_word: SpvWord, + data: []u8, + + pub inline fn getInfos(self: *const @This(), results: []const Result) RuntimeError!@FieldType(Result.TypeData, "Image") { + return switch (try results[self.type_word].getConstVariant()) { + .Type => |t| switch (t) { + .Image => |i| i, + else => RuntimeError.InvalidSpirV, + }, + else => RuntimeError.InvalidSpirV, + }; + } + }, Sampler: struct {}, SampledImage: struct {}, Pointer: struct { @@ -131,10 +144,10 @@ pub const Value = union(Type) { } pub fn init(allocator: std.mem.Allocator, results: []const Result, target_type: SpvWord, is_externally_visible: bool) RuntimeError!Self { - const resolved = results[target_type].resolveType(results); - const member_count = resolved.getMemberCounts(); + const resolved = results[target_type].resolveTypeWordOrNull() orelse target_type; + const member_count = results[resolved].getMemberCounts(); - return switch (resolved.variant.?) { + return switch (results[resolved].variant.?) { .Type => |t| switch (t) { .Void => .{ .Void = .{} }, .Bool => .{ .Bool = false }, @@ -220,7 +233,12 @@ pub const Value = union(Type) { .data = &.{}, }, }, - .Image => RuntimeError.ToDo, + .Image => .{ + .Image = .{ + .type_word = resolved, + .data = &.{}, + }, + }, .Sampler => RuntimeError.ToDo, .SampledImage => RuntimeError.ToDo, else => RuntimeError.InvalidSpirV, @@ -527,6 +545,7 @@ pub const Value = union(Type) { return offset; }, .RuntimeArray => |*arr| arr.data = input[0..], + .Image => |*img| img.data = input[0..], else => return RuntimeError.InvalidValueType, } return 0; diff --git a/src/opcodes.zig b/src/opcodes.zig index 09465da..c33e5ed 100644 --- a/src/opcodes.zig +++ b/src/opcodes.zig @@ -2375,6 +2375,7 @@ fn opTypeFunction(allocator: std.mem.Allocator, word_count: SpvWord, rt: *Runtim fn opTypeImage(_: std.mem.Allocator, word_count: SpvWord, rt: *Runtime) RuntimeError!void { const id = try rt.it.next(); + _ = rt.it.skip(); // TODO: sampled type management rt.results[id].variant = .{ .Type = .{ .Image = .{