adding LOD support and int image sampling
Build / build (push) Failing after 24s
Test / build (push) Successful in 1m0s

This commit is contained in:
2026-06-05 22:04:27 +02:00
parent fb6e5beeff
commit fda0e2143d
2 changed files with 30 additions and 7 deletions
+2 -1
View File
@@ -67,7 +67,8 @@ pub const ImageAPI = struct {
readImageInt4: *const fn (driver_image: *anyopaque, dim: spv.SpvDim, x: i32, y: i32, z: i32) RuntimeError!Vec4(u32), readImageInt4: *const fn (driver_image: *anyopaque, dim: spv.SpvDim, x: i32, y: i32, z: i32) RuntimeError!Vec4(u32),
writeImageFloat4: *const fn (driver_image: *anyopaque, dim: spv.SpvDim, x: i32, y: i32, z: i32, pixel: Vec4(f32)) RuntimeError!void, writeImageFloat4: *const fn (driver_image: *anyopaque, dim: spv.SpvDim, x: i32, y: i32, z: i32, pixel: Vec4(f32)) RuntimeError!void,
writeImageInt4: *const fn (driver_image: *anyopaque, dim: spv.SpvDim, x: i32, y: i32, z: i32, pixel: Vec4(u32)) RuntimeError!void, writeImageInt4: *const fn (driver_image: *anyopaque, dim: spv.SpvDim, x: i32, y: i32, z: i32, pixel: Vec4(u32)) RuntimeError!void,
sampleImageFloat4: *const fn (driver_image: *anyopaque, driver_sampler: *anyopaque, dim: spv.SpvDim, x: f32, y: f32, z: f32) RuntimeError!Vec4(f32), sampleImageFloat4: *const fn (driver_image: *anyopaque, driver_sampler: *anyopaque, dim: spv.SpvDim, x: f32, y: f32, z: f32, lod: ?f32) RuntimeError!Vec4(f32),
sampleImageInt4: *const fn (driver_image: *anyopaque, driver_sampler: *anyopaque, dim: spv.SpvDim, x: f32, y: f32, z: f32, lod: ?f32) RuntimeError!Vec4(u32),
queryImageSize: *const fn (driver_image: *anyopaque, dim: spv.SpvDim, arrayed: bool) RuntimeError!Vec4(u32), queryImageSize: *const fn (driver_image: *anyopaque, dim: spv.SpvDim, arrayed: bool) RuntimeError!Vec4(u32),
}; };
+28 -6
View File
@@ -1355,12 +1355,20 @@ fn ImageEngine(comptime Op: ImageOp) type {
.Vector4f32, .Vector4f32,
.Vector3f32, .Vector3f32,
.Vector2f32, .Vector2f32,
=> try writeFloatTexel(dst, try rt.image_api.sampleImageFloat4(driver_image, driver_sampler, dim, x, y, z)), => try writeFloatTexel(dst, try rt.image_api.sampleImageFloat4(driver_image, driver_sampler, dim, x, y, z, null)),
.Vector4i32,
.Vector3i32,
.Vector2i32,
.Vector4u32,
.Vector3u32,
.Vector2u32,
=> try writeIntTexel(dst, try rt.image_api.sampleImageInt4(driver_image, driver_sampler, dim, x, y, z, null)),
.Vector => |lanes| { .Vector => |lanes| {
if (lanes.len == 0) return RuntimeError.InvalidSpirV; if (lanes.len == 0) return RuntimeError.InvalidSpirV;
switch (lanes[0]) { switch (lanes[0]) {
.Float => try writeFloatTexel(dst, try rt.image_api.sampleImageFloat4(driver_image, driver_sampler, dim, x, y, z)), .Float => try writeFloatTexel(dst, try rt.image_api.sampleImageFloat4(driver_image, driver_sampler, dim, x, y, z, null)),
.Int => try writeIntTexel(dst, try rt.image_api.sampleImageInt4(driver_image, driver_sampler, dim, x, y, z, null)),
else => return RuntimeError.InvalidValueType, else => return RuntimeError.InvalidValueType,
} }
}, },
@@ -1369,17 +1377,25 @@ fn ImageEngine(comptime Op: ImageOp) type {
} }
} }
fn sampleImageExplicitLod(rt: *Runtime, dst: *Value, driver_image: *anyopaque, driver_sampler: *anyopaque, dim: spv.SpvDim, x: f32, y: f32, z: f32) RuntimeError!void { fn sampleImageExplicitLod(rt: *Runtime, dst: *Value, driver_image: *anyopaque, driver_sampler: *anyopaque, dim: spv.SpvDim, x: f32, y: f32, z: f32, lod: ?f32) RuntimeError!void {
switch (dst.*) { switch (dst.*) {
.Vector4f32, .Vector4f32,
.Vector3f32, .Vector3f32,
.Vector2f32, .Vector2f32,
=> try writeFloatTexel(dst, try rt.image_api.sampleImageFloat4(driver_image, driver_sampler, dim, x, y, z)), => try writeFloatTexel(dst, try rt.image_api.sampleImageFloat4(driver_image, driver_sampler, dim, x, y, z, lod)),
.Vector4i32,
.Vector3i32,
.Vector2i32,
.Vector4u32,
.Vector3u32,
.Vector2u32,
=> try writeIntTexel(dst, try rt.image_api.sampleImageInt4(driver_image, driver_sampler, dim, x, y, z, lod)),
.Vector => |lanes| { .Vector => |lanes| {
if (lanes.len == 0) return RuntimeError.InvalidSpirV; if (lanes.len == 0) return RuntimeError.InvalidSpirV;
switch (lanes[0]) { switch (lanes[0]) {
.Float => try writeFloatTexel(dst, try rt.image_api.sampleImageFloat4(driver_image, driver_sampler, dim, x, y, z)), .Float => try writeFloatTexel(dst, try rt.image_api.sampleImageFloat4(driver_image, driver_sampler, dim, x, y, z, lod)),
.Int => try writeIntTexel(dst, try rt.image_api.sampleImageInt4(driver_image, driver_sampler, dim, x, y, z, lod)),
else => return RuntimeError.InvalidValueType, else => return RuntimeError.InvalidValueType,
} }
}, },
@@ -1442,7 +1458,7 @@ fn ImageEngine(comptime Op: ImageOp) type {
} }
} }
fn op(_: std.mem.Allocator, _: SpvWord, rt: *Runtime) RuntimeError!void { fn op(_: std.mem.Allocator, word_count: SpvWord, rt: *Runtime) RuntimeError!void {
if (comptime Op == .Resolve) { if (comptime Op == .Resolve) {
_ = try rt.it.next(); // result type _ = try rt.it.next(); // result type
const dst = try rt.results[try rt.it.next()].getValue(); const dst = try rt.results[try rt.it.next()].getValue();
@@ -1518,6 +1534,11 @@ fn ImageEngine(comptime Op: ImageOp) type {
const x = try readSampleCoordLane(coordinate, 0); const x = try readSampleCoordLane(coordinate, 0);
const y = readSampleCoordLane(coordinate, 1) catch 0; const y = readSampleCoordLane(coordinate, 1) catch 0;
const z = readSampleCoordLane(coordinate, 2) catch 0; const z = readSampleCoordLane(coordinate, 2) catch 0;
const image_operands = if (word_count > 4) try rt.it.next() else 0;
const lod = if ((image_operands & @intFromEnum(spv.SpvImageOperandsMask.LodMask)) != 0)
try readFloatLane(try rt.results[try rt.it.next()].getValue(), 0)
else
null;
try sampleImageExplicitLod( try sampleImageExplicitLod(
rt, rt,
@@ -1528,6 +1549,7 @@ fn ImageEngine(comptime Op: ImageOp) type {
x, x,
y, y,
z, z,
lod,
); );
}, },