From fa683fb88233d340bcaf9741f15ff5b625835fcc Mon Sep 17 00:00:00 2001 From: Ivan Avdeev Date: Sat, 9 Jan 2021 14:05:34 -0800 Subject: [PATCH] fix vulkan handles width in 32-bit mode; print vk version --- engine/platform/platform.h | 16 ++++++++++++- engine/platform/sdl/vid_sdl.c | 6 ++--- engine/ref_api.h | 10 ++++++++- ref_vk/vk_core.c | 42 +++++++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 5 deletions(-) diff --git a/engine/platform/platform.h b/engine/platform/platform.h index 34cc1a1c..cea9d2f3 100644 --- a/engine/platform/platform.h +++ b/engine/platform/platform.h @@ -128,9 +128,23 @@ qboolean SW_CreateBuffer( int width, int height, uint *stride, uint *bpp, uint * // Vulkan // +// FIXME MAXIMUM DUMB +// We need to declare this somewhere visible from: +// - ref_api.h + ref_dll +// - platform.h +// Naively including ref_api.h in platform.h leads to weird compilation errors wrt wrong type casts (fwd declaration conflicts?) +// Figure this out +#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) +typedef void* vulkan_non_dispatchable_handle_t; +#else +typedef uint64_t vulkan_non_dispatchable_handle_t; +#endif +typedef void* vulkan_handle_t; +// FIXME END MAXIMUM DUMB + int VK_GetInstanceExtensions( const char ***pNames ); void *VK_GetVkGetInstanceProcAddr( void ); -void *VK_CreateSurface( void *vkInstance ); +vulkan_non_dispatchable_handle_t VK_CreateSurface( vulkan_handle_t vkInstance ); // // in_evdev.c diff --git a/engine/platform/sdl/vid_sdl.c b/engine/platform/sdl/vid_sdl.c index 1228fc6b..70b0da97 100644 --- a/engine/platform/sdl/vid_sdl.c +++ b/engine/platform/sdl/vid_sdl.c @@ -989,17 +989,17 @@ void *VK_GetVkGetInstanceProcAddr( void ) return SDL_Vulkan_GetVkGetInstanceProcAddr(); } -void *VK_CreateSurface( void *vkInstance ) +vulkan_non_dispatchable_handle_t VK_CreateSurface( vulkan_handle_t vkInstance ) { VkSurfaceKHR surface; if (!SDL_Vulkan_CreateSurface(host.hWnd, vkInstance, &surface)) { Con_Reportf( S_ERROR "Couldn't create Vulkan surface: %s\n", SDL_GetError()); - return NULL; + return 0; } - return (void*)surface; + return surface; } /* diff --git a/engine/ref_api.h b/engine/ref_api.h index 26414b39..fdd8049c 100644 --- a/engine/ref_api.h +++ b/engine/ref_api.h @@ -251,6 +251,14 @@ typedef enum PARM_NUMMODELS = -13, // cl.nummodels } ref_parm_e; +#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) +typedef void* vulkan_non_dispatchable_handle_t; +#else +typedef uint64_t vulkan_non_dispatchable_handle_t; +#endif + +typedef void* vulkan_handle_t; + typedef struct ref_api_s { int (*EngineGetParm)( int parm, int arg ); // generic @@ -436,7 +444,7 @@ typedef struct ref_api_s // Vulkan int (*VK_GetInstanceExtensions)( const char ***pNames ); void *(*VK_GetVkGetInstanceProcAddr)( void ); - void *(*VK_CreateSurface)( void *vkInstance ); + vulkan_non_dispatchable_handle_t (*VK_CreateSurface)( vulkan_handle_t vkInstance ); } ref_api_t; struct mip_s; diff --git a/ref_vk/vk_core.c b/ref_vk/vk_core.c index a6231754..fe8d8d87 100644 --- a/ref_vk/vk_core.c +++ b/ref_vk/vk_core.c @@ -8,8 +8,30 @@ #include "crtlib.h" #include "com_strings.h" +#define VK_NO_PROTOTYPES +#include + +typedef struct vulkan_core_s { + PFN_vkGetInstanceProcAddr get_proc_addr; + uint32_t vulkan_version; + VkInstance instance; +} vulkan_core_t; + +vulkan_core_t vk_core = {0}; + +#define XVK_PARSE_VERSION(v) \ + VK_VERSION_MAJOR(v), \ + VK_VERSION_MINOR(v), \ + VK_VERSION_PATCH(v) + +#define XVK_INSTANCE_FUNC(f) \ + ((PFN_ ##f)vk_core.get_proc_addr(vk_core.instance, #f)) + +static PFN_vkEnumerateInstanceVersion vkEnumerateInstanceVersion; + qboolean R_VkInit( void ) { + if( !gEngine.R_Init_Video( REF_VULKAN )) // request Vulkan surface { gEngine.Con_Printf( S_ERROR "Cannot initialize Vulkan video" ); @@ -17,6 +39,25 @@ qboolean R_VkInit( void ) } // TODO VkInstance create ... + vk_core.get_proc_addr = gEngine.VK_GetVkGetInstanceProcAddr(); + if (!vk_core.get_proc_addr) + { + gEngine.Con_Printf( S_ERROR "Cannot get vkGetInstanceProcAddr address" ); + return false; + } + + vkEnumerateInstanceVersion = XVK_INSTANCE_FUNC(vkEnumerateInstanceVersion); + if (vkEnumerateInstanceVersion) + { + vkEnumerateInstanceVersion(&vk_core.vulkan_version); + } + else + { + vk_core.vulkan_version = VK_MAKE_VERSION(1, 0, 0); + } + + gEngine.Con_Printf( "Vulkan version %u.%u.%u\n", XVK_PARSE_VERSION(vk_core.vulkan_version)); + { const char **instance_exts = NULL; const int num_instance_exts = gEngine.VK_GetInstanceExtensions(&instance_exts); @@ -45,5 +86,6 @@ void R_VkShutdown( void ) gEngine.Con_Printf("VK FIXME: %s\n", __FUNCTION__); // TODO destroy everything + //vkDestroyInstance(vk_core.instance, NULL); }