Harbor

branch main
showing the latest snapshot on main
loader.odin 1.2 KB · Plain text
gpu/core/loader.odin 0644 Raw
package gpu_core

import "core:dynlib"
import "core:log"
import vk "vendor:vulkan"

@(private)
vulkan_lib: dynlib.Library

// Load the Vulkan shared library and initialize global proc addresses
load_vulkan :: proc() -> bool {
	when ODIN_OS == .Linux {
		lib, ok := dynlib.load_library("libvulkan.so.1")
		if !ok {
			lib, ok = dynlib.load_library("libvulkan.so")
			if !ok {
				log.error("gpu/core: failed to load libvulkan.so")
				return false
			}
		}
		vulkan_lib = lib
	} else when ODIN_OS == .Windows {
		lib, ok := dynlib.load_library("vulkan-1.dll")
		if !ok {
			log.error("gpu/core: failed to load vulkan-1.dll")
			return false
		}
		vulkan_lib = lib
	} else {
		log.error("gpu/core: unsupported platform for Vulkan loading")
		return false
	}

	get_instance_proc_addr, found := dynlib.symbol_address(vulkan_lib, "vkGetInstanceProcAddr")
	if !found || get_instance_proc_addr == nil {
		log.error("gpu/core: failed to find vkGetInstanceProcAddr")
		unload_vulkan()
		return false
	}

	// Initialize all global Vulkan procedure addresses
	vk.load_proc_addresses_global(get_instance_proc_addr)

	return true
}

unload_vulkan :: proc() {
	if vulkan_lib != nil {
		dynlib.unload_library(vulkan_lib)
		vulkan_lib = nil
	}
}