| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- package glfw
- /*
- #include "glfw/src/internal.h"
- GLFWAPI VkResult glfwCreateWindowSurface(VkInstance instance, GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface);
- GLFWAPI GLFWvkproc glfwGetInstanceProcAddress(VkInstance instance, const char* procname);
- // Helper function for doing raw pointer arithmetic
- static inline const char* getArrayIndex(const char** array, unsigned int index) {
- return array[index];
- }
- void* getVulkanProcAddr() {
- return glfwGetInstanceProcAddress;
- }
- */
- import "C"
- import (
- "errors"
- "fmt"
- "reflect"
- "unsafe"
- )
- // VulkanSupported reports whether the Vulkan loader has been found. This check is performed by Init.
- //
- // The availability of a Vulkan loader does not by itself guarantee that window surface creation or
- // even device creation is possible. Call GetRequiredInstanceExtensions to check whether the
- // extensions necessary for Vulkan surface creation are available and GetPhysicalDevicePresentationSupport
- // to check whether a queue family of a physical device supports image presentation.
- func VulkanSupported() bool {
- return glfwbool(C.glfwVulkanSupported())
- }
- // GetVulkanGetInstanceProcAddress returns the function pointer used to find Vulkan core or
- // extension functions. The return value of this function can be passed to the Vulkan library.
- //
- // Note that this function does not work the same way as the glfwGetInstanceProcAddress.
- func GetVulkanGetInstanceProcAddress() unsafe.Pointer {
- return C.getVulkanProcAddr()
- }
- // GetRequiredInstanceExtensions returns a slice of Vulkan instance extension names required
- // by GLFW for creating Vulkan surfaces for GLFW windows. If successful, the list will always
- // contain VK_KHR_surface, so if you don't require any additional extensions you can pass this list
- // directly to the VkInstanceCreateInfo struct.
- //
- // If Vulkan is not available on the machine, this function returns nil. Call
- // VulkanSupported to check whether Vulkan is available.
- //
- // If Vulkan is available but no set of extensions allowing window surface creation was found, this
- // function returns nil. You may still use Vulkan for off-screen rendering and compute work.
- func (window *Window) GetRequiredInstanceExtensions() []string {
- var count C.uint32_t
- strarr := C.glfwGetRequiredInstanceExtensions(&count)
- if count == 0 {
- return nil
- }
- extensions := make([]string, count)
- for i := uint(0); i < uint(count); i++ {
- extensions[i] = C.GoString(C.getArrayIndex(strarr, C.uint(i)))
- }
- return extensions
- }
- // CreateWindowSurface creates a Vulkan surface for this window.
- func (window *Window) CreateWindowSurface(instance interface{}, allocCallbacks unsafe.Pointer) (surface uintptr, err error) {
- if instance == nil {
- return 0, errors.New("vulkan: instance is nil")
- }
- val := reflect.ValueOf(instance)
- if val.Kind() != reflect.Ptr {
- return 0, fmt.Errorf("vulkan: instance is not a VkInstance (expected kind Ptr, got %s)", val.Kind())
- }
- var vulkanSurface C.VkSurfaceKHR
- ret := C.glfwCreateWindowSurface(
- (C.VkInstance)(unsafe.Pointer(reflect.ValueOf(instance).Pointer())), window.data,
- (*C.VkAllocationCallbacks)(allocCallbacks), (*C.VkSurfaceKHR)(unsafe.Pointer(&vulkanSurface)))
- if ret != C.VK_SUCCESS {
- return 0, fmt.Errorf("vulkan: error creating window surface: %d", ret)
- }
- return uintptr(unsafe.Pointer(&vulkanSurface)), nil
- }
|