166 lines
4.6 KiB
Go
166 lines
4.6 KiB
Go
package sdl
|
|
|
|
/*
|
|
#include "sdl_wrapper.h"
|
|
|
|
#if (SDL_VERSION_ATLEAST(2,0,6))
|
|
#if defined(_WIN32)
|
|
#include <SDL2/SDL_vulkan.h>
|
|
#else
|
|
#include <SDL_vulkan.h>
|
|
#endif
|
|
#else //!SDL_VERSION_ATLEAST(2,0,6)
|
|
|
|
#define VK_DEFINE_HANDLE(object) typedef struct object##_T* object;
|
|
#if defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)
|
|
#define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef struct object##_T *object;
|
|
#else
|
|
#define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t object;
|
|
#endif
|
|
|
|
VK_DEFINE_HANDLE(VkInstance)
|
|
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSurfaceKHR)
|
|
typedef VkInstance SDL_vulkanInstance;
|
|
typedef VkSurfaceKHR SDL_vulkanSurface;
|
|
|
|
|
|
#if defined(WARN_OUTDATED)
|
|
#pragma message("SDL_Vulkan_LoadLibrary is not supported before SDL 2.0.6")
|
|
#endif
|
|
|
|
static int SDL_Vulkan_LoadLibrary(const char *path)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
#if defined(WARN_OUTDATED)
|
|
#pragma message("SDL_Vulkan_GetVkGetInstanceProcAddr is not supported before SDL 2.0.6")
|
|
#endif
|
|
|
|
static void* SDL_Vulkan_GetVkGetInstanceProcAddr(void)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
|
|
#if defined(WARN_OUTDATED)
|
|
#pragma message("SDL_Vulkan_UnloadLibrary is not supported before SDL 2.0.6")
|
|
#endif
|
|
|
|
static void SDL_Vulkan_UnloadLibrary(void) {}
|
|
|
|
|
|
#if defined(WARN_OUTDATED)
|
|
#pragma message("SDL_Vulkan_GetInstanceExtensions is not supported before SDL 2.0.6")
|
|
#endif
|
|
|
|
static int SDL_Vulkan_GetInstanceExtensions(SDL_Window *window, unsigned int *pCount, const char **pNames)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
#if defined(WARN_OUTDATED)
|
|
#pragma message("SDL_Vulkan_CreateSurface is not supported before SDL 2.0.6")
|
|
#endif
|
|
|
|
static int SDL_Vulkan_CreateSurface(SDL_Window *window, VkInstance instance, VkSurfaceKHR *surface)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
#if defined(WARN_OUTDATED)
|
|
#pragma message("SDL_Vulkan_GetDrawableSize is not supported before SDL 2.0.6")
|
|
#endif
|
|
|
|
static void SDL_Vulkan_GetDrawableSize(SDL_Window *window, int *w, int *h) {
|
|
*w = 0;
|
|
*h = 0;
|
|
}
|
|
|
|
#endif
|
|
*/
|
|
import "C"
|
|
import (
|
|
"errors"
|
|
"reflect"
|
|
"unsafe"
|
|
)
|
|
|
|
// VulkanLoadLibrary dynamically loads a Vulkan loader library.
|
|
// (https://wiki.libsdl.org/SDL_Vulkan_LoadLibrary)
|
|
func VulkanLoadLibrary(path string) error {
|
|
var ret C.int
|
|
if path == "" {
|
|
ret = C.SDL_Vulkan_LoadLibrary(nil)
|
|
} else {
|
|
cpath := C.CString(path)
|
|
defer C.free(unsafe.Pointer(cpath))
|
|
ret = C.SDL_Vulkan_LoadLibrary(cpath)
|
|
}
|
|
if int(ret) == -1 {
|
|
return GetError()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// VulkanGetVkGetInstanceProcAddr gets the address of the vkGetInstanceProcAddr function.
|
|
// (https://wiki.libsdl.org/SDL_Vulkan_GetVkInstanceProcAddr)
|
|
func VulkanGetVkGetInstanceProcAddr() unsafe.Pointer {
|
|
return C.SDL_Vulkan_GetVkGetInstanceProcAddr()
|
|
}
|
|
|
|
// VulkanUnloadLibrary unloads the Vulkan loader library previously loaded by VulkanLoadLibrary().
|
|
// (https://wiki.libsdl.org/SDL_Vulkan_UnloadLibrary)
|
|
func VulkanUnloadLibrary() {
|
|
C.SDL_Vulkan_UnloadLibrary()
|
|
}
|
|
|
|
// VulkanGetInstanceExtensions gets the names of the Vulkan instance extensions needed to create a surface with VulkanCreateSurface().
|
|
// (https://wiki.libsdl.org/SDL_Vulkan_GetInstanceExtensions)
|
|
func (window *Window) VulkanGetInstanceExtensions() []string {
|
|
var count C.uint
|
|
C.SDL_Vulkan_GetInstanceExtensions(window.cptr(), &count, nil)
|
|
if count == 0 {
|
|
return nil
|
|
}
|
|
|
|
strptrs := make([]*C.char, uint(count))
|
|
C.SDL_Vulkan_GetInstanceExtensions(window.cptr(), &count, &strptrs[0])
|
|
extensions := make([]string, uint(count))
|
|
for i := range strptrs {
|
|
extensions[i] = C.GoString(strptrs[i])
|
|
}
|
|
return extensions
|
|
}
|
|
|
|
// VulkanCreateSurface creates a Vulkan rendering surface for a window.
|
|
// (https://wiki.libsdl.org/SDL_Vulkan_CreateSurface)
|
|
func (window *Window) VulkanCreateSurface(instance interface{}) (surface unsafe.Pointer, err error) {
|
|
if instance == nil {
|
|
return nil, errors.New("vulkan: instance is nil")
|
|
}
|
|
val := reflect.ValueOf(instance)
|
|
if val.Kind() != reflect.Ptr {
|
|
return nil, errors.New("vulkan: instance is not a VkInstance (expected kind Ptr, got " + val.Kind().String() + ")")
|
|
}
|
|
var vulkanSurface C.VkSurfaceKHR
|
|
if C.SDL_Vulkan_CreateSurface(window.cptr(),
|
|
(C.VkInstance)(unsafe.Pointer(val.Pointer())),
|
|
(*C.VkSurfaceKHR)(unsafe.Pointer(&vulkanSurface))) == C.SDL_FALSE {
|
|
|
|
return nil, GetError()
|
|
}
|
|
return unsafe.Pointer(&vulkanSurface), nil
|
|
}
|
|
|
|
// VulkanGetDrawableSize gets the size of a window's underlying drawable in pixels (for use with setting viewport, scissor & etc).
|
|
// (https://wiki.libsdl.org/SDL_Vulkan_GetDrawableSize)
|
|
func (window *Window) VulkanGetDrawableSize() (w, h int32) {
|
|
var _w, _h C.int
|
|
C.SDL_Vulkan_GetDrawableSize(window.cptr(), &_w, &_h)
|
|
return int32(_w), int32(_h)
|
|
}
|