Harbor

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

import "core:log"
import vk "vendor:vulkan"
import bk "../backend"

// Create a Vulkan surface from a backend-neutral surface descriptor.
create_surface :: proc(desc: bk.Surface_Desc, instance: vk.Instance) -> (surface: vk.SurfaceKHR, ok: bool) {
	switch desc.kind {
	case .X11:
		return create_xlib_surface(instance, desc.x11)
	case .Wayland:
		return create_wayland_surface(instance, desc.wayland)
	case .Win32:
		return create_win32_surface(instance, desc.win32)
	case .None:
	}

	log.error("gpu/core: unsupported surface descriptor for Vulkan surface")
	return 0, false
}

@(private)
create_xlib_surface :: proc(instance: vk.Instance, handle: bk.X11_Surface_Handle) -> (vk.SurfaceKHR, bool) {
	when ODIN_OS == .Linux {
		info := vk.XlibSurfaceCreateInfoKHR{
			sType  = .XLIB_SURFACE_CREATE_INFO_KHR,
			dpy    = auto_cast handle.display,
			window = auto_cast handle.window,
		}
		surface: vk.SurfaceKHR
		result := vk.CreateXlibSurfaceKHR(instance, &info, nil, &surface)
		if result != .SUCCESS {
			log.errorf("gpu/core: vkCreateXlibSurfaceKHR failed: %v", result)
			return 0, false
		}
		return surface, true
	} else {
		return 0, false
	}
}

@(private)
create_wayland_surface :: proc(instance: vk.Instance, handle: bk.Wayland_Surface_Handle) -> (vk.SurfaceKHR, bool) {
	when ODIN_OS == .Linux {
		info := vk.WaylandSurfaceCreateInfoKHR{
			sType   = .WAYLAND_SURFACE_CREATE_INFO_KHR,
			display = auto_cast handle.display,
			surface = auto_cast handle.surface,
		}
		surface: vk.SurfaceKHR
		result := vk.CreateWaylandSurfaceKHR(instance, &info, nil, &surface)
		if result != .SUCCESS {
			log.errorf("gpu/core: vkCreateWaylandSurfaceKHR failed: %v", result)
			return 0, false
		}
		return surface, true
	} else {
		return 0, false
	}
}

@(private)
create_win32_surface :: proc(instance: vk.Instance, handle: bk.Win32_Surface_Handle) -> (vk.SurfaceKHR, bool) {
	when ODIN_OS == .Windows {
		info := vk.Win32SurfaceCreateInfoKHR{
			sType     = .WIN32_SURFACE_CREATE_INFO_KHR,
			hinstance = auto_cast handle.hinstance,
			hwnd      = auto_cast handle.hwnd,
		}
		surface: vk.SurfaceKHR
		result := vk.CreateWin32SurfaceKHR(instance, &info, nil, &surface)
		if result != .SUCCESS {
			log.errorf("gpu/core: vkCreateWin32SurfaceKHR failed: %v", result)
			return 0, false
		}
		return surface, true
	} else {
		return 0, false
	}
}