Harbor

branch main
showing the latest snapshot on main
shader.odin 980 B · Plain text
pipeline/shader.odin 0644 Raw
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
	}
}