package pipeline import "core:log" import vk "vendor:vulkan" Shader_Module :: struct { handle: vk.ShaderModule, } // Create a shader module from raw SPIR-V bytes (e.g. from #load) create_shader_module_from_bytes :: proc( device: vk.Device, code: []byte, ) -> ( mod: Shader_Module, ok: bool, ) { if len(code) == 0 || len(code) % 4 != 0 { log.error("gpu/pipeline: invalid SPIR-V data (empty or not 4-byte aligned)") return {}, false } create_info := vk.ShaderModuleCreateInfo { sType = .SHADER_MODULE_CREATE_INFO, codeSize = len(code), pCode = cast([^]u32)raw_data(code), } result := vk.CreateShaderModule(device, &create_info, nil, &mod.handle) if result != .SUCCESS { log.errorf("gpu/pipeline: vkCreateShaderModule failed: %v", result) return {}, false } return mod, true } destroy_shader_module :: proc(device: vk.Device, mod: ^Shader_Module) { if mod.handle != 0 { vk.DestroyShaderModule(device, mod.handle, nil) mod.handle = 0 } }