working on spirv debug
Some checks failed
Build / build (push) Successful in 2m18s
Test / build_and_test (push) Failing after 1h22m47s

This commit is contained in:
2026-01-25 21:55:02 +01:00
parent 067db7a48a
commit b333f143b4
5 changed files with 50 additions and 11 deletions

View File

@@ -23,11 +23,13 @@ pub fn create(device: *base.Device, allocator: std.mem.Allocator, info: *const v
.destroy = destroy,
};
const code = info.p_code[0..@divExact(info.code_size, 4)];
self.* = .{
.interface = interface,
.module = spv.Module.init(
allocator,
info.p_code[0..@divExact(info.code_size, 4)],
code,
.{
.use_simd_vectors_specializations = !std.process.hasEnvVarConstant(lib.NO_SHADER_SIMD_ENV_NAME),
},

View File

@@ -25,16 +25,11 @@ pub fn initCompute(device: *Device, allocator: std.mem.Allocator, cache: ?*Pipel
_ = allocator;
_ = cache;
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,
.stages = info.stage.stage,
};
}
@@ -43,8 +38,10 @@ pub fn initGraphics(device: *Device, allocator: std.mem.Allocator, cache: ?*Pipe
_ = cache;
var stages: vk.ShaderStageFlags = .{};
for (info.p_stages[0..info.stage_count]) |stage| {
stages = stages.merge(stage orelse continue);
if (info.p_stages) |p_stages| {
for (p_stages[0..info.stage_count]) |stage| {
stages = stages.merge(stage.stage);
}
}
return .{

View File

@@ -1,5 +1,6 @@
const std = @import("std");
const vk = @import("vulkan");
const lib = @import("lib.zig");
const NonDispatchable = @import("NonDispatchable.zig");
@@ -19,8 +20,12 @@ pub const VTable = struct {
};
pub fn init(device: *Device, allocator: std.mem.Allocator, info: *const vk.ShaderModuleCreateInfo) VkError!Self {
_ = allocator;
_ = info;
if (std.process.hasEnvVarConstant(lib.DRIVER_LOG_SPIRV_ENV_NAME)) {
logShaderModule(allocator, info) catch |e| {
std.log.scoped(.ShaderModule).err("Failed to disassemble SPIR-V module to readable text: {s}", .{@errorName(e)});
};
}
return .{
.owner = device,
.vtable = undefined,
@@ -30,3 +35,35 @@ pub fn init(device: *Device, allocator: std.mem.Allocator, info: *const vk.Shade
pub inline fn destroy(self: *Self, allocator: std.mem.Allocator) void {
self.vtable.destroy(self, allocator);
}
fn logShaderModule(allocator: std.mem.Allocator, info: *const vk.ShaderModuleCreateInfo) !void {
std.log.scoped(.ShaderModule).info("Logging SPIR-V module", .{});
var process = std.process.Child.init(&[_][]const u8{ "spirv-dis", "--no-color", "/home/kbz8/Documents/Code/Zig/SPIRV-Interpreter/example/shader.spv" }, allocator);
process.stdout_behavior = .Pipe;
process.stderr_behavior = .Pipe;
process.stdin_behavior = .Pipe;
var stdout: std.ArrayList(u8) = .empty;
defer stdout.deinit(allocator);
var stderr: std.ArrayList(u8) = .empty;
defer stderr.deinit(allocator);
try process.spawn();
errdefer {
_ = process.kill() catch {};
}
if (process.stdin) |stdin| {
_ = try stdin.write(@ptrCast(@alignCast(info.p_code[0..@divExact(info.code_size, 4)])));
}
try process.collectOutput(allocator, &stdout, &stderr, 1024 * 1024);
_ = try process.wait();
if (stderr.items.len != 0) {
std.log.scoped(.ShaderModule).err("Failed to disassemble SPIR-V module to readable text.\nError:\n{s}", .{stderr.items});
} else if (stdout.items.len != 0) {
std.log.scoped(.ShaderModule).info("{s}\n{d}", .{ stdout.items, stdout.items.len });
}
}

View File

@@ -50,6 +50,8 @@ pub const VULKAN_VENDOR_ID = @typeInfo(vk.VendorId).@"enum".fields[@typeInfo(vk.
pub const DRIVER_DEBUG_ALLOCATOR_ENV_NAME = "STROLL_DEBUG_ALLOCATOR";
pub const DRIVER_LOGS_ENV_NAME = "STROLL_LOGS_LEVEL";
pub const DRIVER_LOG_SPIRV_ENV_NAME = "STROLL_LOG_SPIRV";
/// Default driver name
pub const DRIVER_NAME = "Unnamed Stroll Driver";
/// Default Vulkan version