adding base spv interpreter

This commit is contained in:
2026-01-25 17:57:17 +01:00
parent 87c6a66a2f
commit 067db7a48a
7 changed files with 47 additions and 3 deletions

View File

@@ -1,6 +1,7 @@
const std = @import("std");
const vk = @import("vulkan");
const base = @import("base");
const spv = @import("spv");
const VkError = base.VkError;
const Device = base.Device;

View File

@@ -1,6 +1,8 @@
const std = @import("std");
const vk = @import("vulkan");
const base = @import("base");
const spv = @import("spv");
const lib = @import("lib.zig");
const VkError = base.VkError;
const Device = base.Device;
@@ -9,6 +11,7 @@ const Self = @This();
pub const Interface = base.ShaderModule;
interface: Interface,
module: spv.Module,
pub fn create(device: *base.Device, allocator: std.mem.Allocator, info: *const vk.ShaderModuleCreateInfo) VkError!*Self {
const self = allocator.create(Self) catch return VkError.OutOfHostMemory;
@@ -22,11 +25,22 @@ pub fn create(device: *base.Device, allocator: std.mem.Allocator, info: *const v
self.* = .{
.interface = interface,
.module = spv.Module.init(
allocator,
info.p_code[0..@divExact(info.code_size, 4)],
.{
.use_simd_vectors_specializations = !std.process.hasEnvVarConstant(lib.NO_SHADER_SIMD_ENV_NAME),
},
) catch |err| switch (err) {
spv.Module.ModuleError.OutOfMemory => return VkError.OutOfHostMemory,
else => return VkError.ValidationFailed,
},
};
return self;
}
pub fn destroy(interface: *Interface, allocator: std.mem.Allocator) void {
const self: *Self = @alignCast(@fieldParentPtr("interface", interface));
self.module.deinit(allocator);
allocator.destroy(self);
}

View File

@@ -40,6 +40,8 @@ pub const VULKAN_VERSION = vk.makeApiVersion(0, 1, 0, 0);
pub const DRIVER_VERSION = vk.makeApiVersion(0, 0, 0, 1);
pub const DEVICE_ID = 0x600DCAFE;
pub const NO_SHADER_SIMD_ENV_NAME = "STROLL_SOFT_NO_SIMD";
/// Generic system memory.
pub const MEMORY_TYPE_GENERIC_BIT = 0;

View File

@@ -14,6 +14,8 @@ pub const ObjectType: vk.ObjectType = .pipeline;
owner: *Device,
vtable: *const VTable,
bind_point: vk.PipelineBindPoint,
stages: vk.ShaderStageFlags,
pub const VTable = struct {
destroy: *const fn (*Self, std.mem.Allocator) void,
@@ -22,20 +24,34 @@ pub const VTable = struct {
pub fn initCompute(device: *Device, allocator: std.mem.Allocator, cache: ?*PipelineCache, info: *const vk.ComputePipelineCreateInfo) VkError!Self {
_ = allocator;
_ = cache;
_ = info;
var stages: vk.ShaderStageFlags = .{};
for (info.p_stages[0..info.stage_count]) |stage| {
stages = stages.merge(stage orelse continue);
}
return .{
.owner = device,
.vtable = undefined,
.bind_point = .compute,
.stages = stages,
};
}
pub fn initGraphics(device: *Device, allocator: std.mem.Allocator, cache: ?*PipelineCache, info: *const vk.GraphicsPipelineCreateInfo) VkError!Self {
_ = allocator;
_ = cache;
_ = info;
var stages: vk.ShaderStageFlags = .{};
for (info.p_stages[0..info.stage_count]) |stage| {
stages = stages.merge(stage orelse continue);
}
return .{
.owner = device,
.vtable = undefined,
.bind_point = .graphics,
.stages = stages,
};
}

View File

@@ -51,7 +51,7 @@ pub const DRIVER_DEBUG_ALLOCATOR_ENV_NAME = "STROLL_DEBUG_ALLOCATOR";
pub const DRIVER_LOGS_ENV_NAME = "STROLL_LOGS_LEVEL";
/// Default driver name
pub const DRIVER_NAME = "Unnamed Driver";
pub const DRIVER_NAME = "Unnamed Stroll Driver";
/// Default Vulkan version
pub const VULKAN_VERSION = vk.makeApiVersion(0, 1, 0, 0);