1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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
}
}