70 lines
2.2 KiB
Zig
70 lines
2.2 KiB
Zig
const std = @import("std");
|
|
const vk = @import("vulkan");
|
|
const lib = @import("lib.zig");
|
|
|
|
const NonDispatchable = @import("NonDispatchable.zig");
|
|
|
|
const VkError = @import("error_set.zig").VkError;
|
|
|
|
const Device = @import("Device.zig");
|
|
|
|
const Self = @This();
|
|
pub const ObjectType: vk.ObjectType = .shader_module;
|
|
|
|
owner: *Device,
|
|
|
|
vtable: *const VTable,
|
|
|
|
pub const VTable = struct {
|
|
destroy: *const fn (*Self, std.mem.Allocator) void,
|
|
};
|
|
|
|
pub fn init(device: *Device, allocator: std.mem.Allocator, info: *const vk.ShaderModuleCreateInfo) VkError!Self {
|
|
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,
|
|
};
|
|
}
|
|
|
|
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 });
|
|
}
|
|
}
|