mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-29 07:32:02 +00:00
Correct extension handling
I had missed a critical bit from the cookbook.
This commit is contained in:
parent
ed3c5cb9ec
commit
2771e9c573
7 changed files with 91 additions and 42 deletions
|
@ -21,16 +21,6 @@ GLOBAL_LEVEL_VULKAN_FUNCTION (vkCreateInstance)
|
|||
#define INSTANCE_LEVEL_VULKAN_FUNCTION(function)
|
||||
#endif
|
||||
|
||||
#if defined(VK_USE_PLATFORM_XLIB_KHR)
|
||||
INSTANCE_LEVEL_VULKAN_FUNCTION (vkGetPhysicalDeviceXlibPresentationSupportKHR)
|
||||
INSTANCE_LEVEL_VULKAN_FUNCTION (vkCreateXlibSurfaceKHR)
|
||||
#elif defined(VK_USE_PLATFORM_WIN32_KHR)
|
||||
INSTANCE_LEVEL_VULKAN_FUNCTION (vkGetPhysicalDeviceWin32PresentationSupportKHR)
|
||||
INSTANCE_LEVEL_VULKAN_FUNCTION (vkCreateWin32SurfaceKHR)
|
||||
#elif defined(VK_USE_PLATFORM_XCB_KHR)
|
||||
INSTANCE_LEVEL_VULKAN_FUNCTION (vkGetPhysicalDeviceXcbPresentationSupportKHR)
|
||||
INSTANCE_LEVEL_VULKAN_FUNCTION (vkCreateXcbSurfaceKHR)
|
||||
#else
|
||||
INSTANCE_LEVEL_VULKAN_FUNCTION (vkEnumeratePhysicalDevices)
|
||||
INSTANCE_LEVEL_VULKAN_FUNCTION (vkGetPhysicalDeviceProperties)
|
||||
INSTANCE_LEVEL_VULKAN_FUNCTION (vkGetPhysicalDeviceFeatures)
|
||||
|
@ -41,17 +31,40 @@ INSTANCE_LEVEL_VULKAN_FUNCTION (vkDestroyInstance)
|
|||
INSTANCE_LEVEL_VULKAN_FUNCTION (vkEnumerateDeviceLayerProperties)
|
||||
INSTANCE_LEVEL_VULKAN_FUNCTION (vkEnumerateDeviceExtensionProperties)
|
||||
INSTANCE_LEVEL_VULKAN_FUNCTION (vkGetPhysicalDeviceMemoryProperties)
|
||||
#endif
|
||||
|
||||
#undef INSTANCE_LEVEL_VULKAN_FUNCTION
|
||||
|
||||
#ifndef INSTANCE_LEVEL_VULKAN_FUNCTION_EXTENSION
|
||||
#define INSTANCE_LEVEL_VULKAN_FUNCTION_EXTENSION(function)
|
||||
#ifndef INSTANCE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION
|
||||
#define INSTANCE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION(function, extension)
|
||||
#endif
|
||||
|
||||
INSTANCE_LEVEL_VULKAN_FUNCTION_EXTENSION (vkCreateDebugUtilsMessengerEXT)
|
||||
#if defined(VK_USE_PLATFORM_XLIB_KHR)
|
||||
INSTANCE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION
|
||||
(vkGetPhysicalDeviceXlibPresentationSupportKHR,
|
||||
VK_KHR_XLIB_SURFACE_EXTENSION_NAME)
|
||||
INSTANCE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION
|
||||
(vkCreateXlibSurfaceKHR,
|
||||
VK_KHR_XLIB_SURFACE_EXTENSION_NAME)
|
||||
#elif defined(VK_USE_PLATFORM_WIN32_KHR)
|
||||
INSTANCE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION
|
||||
(vkGetPhysicalDeviceWin32PresentationSupportKHR,
|
||||
VK_KHR_WIN32_SURFACE_EXTENSION_NAME)
|
||||
INSTANCE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION
|
||||
(vkCreateWin32SurfaceKHR,
|
||||
VK_KHR_WIN32_SURFACE_EXTENSION_NAME)
|
||||
#elif defined(VK_USE_PLATFORM_XCB_KHR)
|
||||
INSTANCE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION
|
||||
(vkGetPhysicalDeviceXcbPresentationSupportKHR,
|
||||
VK_KHR_XCB_SURFACE_EXTENSION_NAME)
|
||||
INSTANCE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION
|
||||
(vkCreateXcbSurfaceKHR,
|
||||
VK_KHR_XCB_SURFACE_EXTENSION_NAME)
|
||||
#else
|
||||
INSTANCE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION
|
||||
(vkCreateDebugUtilsMessengerEXT, VK_EXT_DEBUG_UTILS_EXTENSION_NAME)
|
||||
#endif
|
||||
|
||||
#undef INSTANCE_LEVEL_VULKAN_FUNCTION_EXTENSION
|
||||
#undef INSTANCE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION
|
||||
|
||||
#ifndef DEVICE_LEVEL_VULKAN_FUNCTION
|
||||
#define DEVICE_LEVEL_VULKAN_FUNCTION(function)
|
||||
|
@ -62,8 +75,8 @@ DEVICE_LEVEL_VULKAN_FUNCTION (vkGetDeviceQueue)
|
|||
|
||||
#undef DEVICE_LEVEL_VULKAN_FUNCTION
|
||||
|
||||
#ifndef DEVICE_LEVEL_VULKAN_FUNCTION_EXTENSION
|
||||
#define DEVICE_LEVEL_VULKAN_FUNCTION_EXTENSION(function)
|
||||
#ifndef DEVICE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION
|
||||
#define DEVICE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION(function, extension)
|
||||
#endif
|
||||
|
||||
#undef DEVICE_LEVEL_VULKAN_FUNCTION_EXTENSION
|
||||
#undef DEVICE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION
|
||||
|
|
|
@ -36,7 +36,7 @@ typedef struct VulkanDevice_s {
|
|||
VkSurfaceKHR surface;
|
||||
|
||||
#define DEVICE_LEVEL_VULKAN_FUNCTION(name) PFN_##name name;
|
||||
#define DEVICE_LEVEL_VULKAN_FUNCTION_EXTENSION(name) PFN_##name name;
|
||||
#define DEVICE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION(name,ext) PFN_##name name;
|
||||
#include "QF/Vulkan/funclist.h"
|
||||
} VulkanDevice_t;
|
||||
|
||||
|
@ -55,12 +55,15 @@ typedef struct {
|
|||
|
||||
typedef struct VulkanInstance_s {
|
||||
VkInstance instance;
|
||||
struct strset_s *enabled_extensions;
|
||||
int (*extension_enabled) (struct VulkanInstance_s *inst,
|
||||
const char *ext);
|
||||
VkDebugUtilsMessengerEXT debug_callback;
|
||||
uint32_t numDevices;
|
||||
VulkanPhysDevice_t *devices;
|
||||
|
||||
#define INSTANCE_LEVEL_VULKAN_FUNCTION(name) PFN_##name name;
|
||||
#define INSTANCE_LEVEL_VULKAN_FUNCTION_EXTENSION(name) PFN_##name name;
|
||||
#define INSTANCE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION(name,ext) PFN_##name name;
|
||||
#include "QF/Vulkan/funclist.h"
|
||||
} VulkanInstance_t;
|
||||
|
||||
|
|
|
@ -6,11 +6,14 @@
|
|||
#endif
|
||||
#include <vulkan/vulkan.h>
|
||||
|
||||
struct VulkanInstance_s;
|
||||
typedef struct vulkan_ctx_s {
|
||||
void (*load_vulkan) (struct vulkan_ctx_s *ctx);
|
||||
void (*unload_vulkan) (struct vulkan_ctx_s *ctx);
|
||||
|
||||
const char **required_extensions;
|
||||
int (*extension_enabled) (struct VulkanInstance_s *inst,
|
||||
const char *ext);
|
||||
struct vulkan_presentation_s *presentation;
|
||||
int (*get_presentation_support) (struct vulkan_ctx_s *ctx,
|
||||
VkPhysicalDevice physicalDevice,
|
||||
|
@ -22,6 +25,7 @@ typedef struct vulkan_ctx_s {
|
|||
struct VulkanInstance_s *vtx;
|
||||
struct VulkanDevice_s *dev;
|
||||
VkInstance instance;
|
||||
VkPhysicalDevice physDevice;
|
||||
VkDevice device;
|
||||
#define EXPORTED_VULKAN_FUNCTION(fname) PFN_##fname fname;
|
||||
#define GLOBAL_LEVEL_VULKAN_FUNCTION(fname) PFN_##fname fname;
|
||||
|
|
|
@ -48,6 +48,13 @@
|
|||
|
||||
static vulkan_ctx_t *vulkan_ctx;
|
||||
|
||||
static void
|
||||
vulkan_R_Init (void)
|
||||
{
|
||||
if (vulkan_ctx)
|
||||
Sys_Quit ();
|
||||
}
|
||||
|
||||
static vid_model_funcs_t model_funcs = {
|
||||
0,//vulkan_Mod_LoadExternalTextures,
|
||||
0,//vulkan_Mod_LoadLighting,
|
||||
|
@ -108,7 +115,7 @@ vid_render_funcs_t vulkan_vid_render_funcs = {
|
|||
0,//vulkan_Fog_Update,
|
||||
0,//vulkan_Fog_ParseWorldspawn,
|
||||
|
||||
0,//vulkan_R_Init,
|
||||
vulkan_R_Init,
|
||||
0,//vulkan_R_ClearState,
|
||||
0,//vulkan_R_LoadSkys,
|
||||
0,//vulkan_R_NewMap,
|
||||
|
@ -151,6 +158,7 @@ vulkan_vid_render_create_context (void)
|
|||
{
|
||||
vulkan_ctx->create_window (vulkan_ctx);
|
||||
vulkan_ctx->dev->surface = vulkan_ctx->create_surface (vulkan_ctx);
|
||||
Sys_Printf ("%p\n", vulkan_ctx->dev->surface);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -198,6 +198,12 @@ init_physdev (VulkanInstance_t *instance, VkPhysicalDevice dev, VulkanPhysDevice
|
|||
}
|
||||
}
|
||||
|
||||
static int
|
||||
instance_extension_enabled (VulkanInstance_t *inst, const char *ext)
|
||||
{
|
||||
return strset_contains (inst->enabled_extensions, ext);
|
||||
}
|
||||
|
||||
static int message_severities =
|
||||
VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT |
|
||||
VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
|
||||
|
@ -242,10 +248,13 @@ load_instance_funcs (vulkan_ctx_t *ctx)
|
|||
Sys_Error ("Couldn't find instance level function %s", #name); \
|
||||
}
|
||||
|
||||
#define INSTANCE_LEVEL_VULKAN_FUNCTION_EXTENSION(name) \
|
||||
vtx->name = (PFN_##name) ctx->vkGetInstanceProcAddr (instance, #name); \
|
||||
#define INSTANCE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION(name, ext) \
|
||||
if (vtx->extension_enabled (vtx, ext)) { \
|
||||
vtx->name = (PFN_##name) ctx->vkGetInstanceProcAddr (instance, \
|
||||
#name); \
|
||||
if (!vtx->name) { \
|
||||
Sys_Printf ("Couldn't find instance level function %s", #name); \
|
||||
Sys_Error ("Couldn't find instance level function %s", #name); \
|
||||
} \
|
||||
}
|
||||
|
||||
#include "QF/Vulkan/funclist.h"
|
||||
|
@ -278,9 +287,9 @@ Vulkan_CreateInstance (vulkan_ctx_t *ctx,
|
|||
get_instance_layers_and_extensions (ctx);
|
||||
}
|
||||
|
||||
uint32_t nlay = count_strings (layers);
|
||||
uint32_t nlay = count_strings (layers) + 1;
|
||||
uint32_t next = count_strings (extensions)
|
||||
+ count_strings (ctx->required_extensions);
|
||||
+ count_strings (ctx->required_extensions) + 1;
|
||||
if (vulkan_use_validation->int_val) {
|
||||
nlay += count_strings (vulkanValidationLayers);
|
||||
next += count_strings (debugExtensions);
|
||||
|
@ -289,8 +298,8 @@ Vulkan_CreateInstance (vulkan_ctx_t *ctx,
|
|||
const char **ext = alloca (next * sizeof (const char *));
|
||||
// ensure there are null pointers so merge_strings can act as append
|
||||
// since it does not add a null
|
||||
memset (lay, 0, nlay * sizeof (const char *));
|
||||
memset (ext, 0, next * sizeof (const char *));
|
||||
memset (lay, 0, nlay-- * sizeof (const char *));
|
||||
memset (ext, 0, next-- * sizeof (const char *));
|
||||
merge_strings (lay, layers, 0);
|
||||
merge_strings (ext, extensions, ctx->required_extensions);
|
||||
if (vulkan_use_validation->int_val) {
|
||||
|
@ -299,6 +308,8 @@ Vulkan_CreateInstance (vulkan_ctx_t *ctx,
|
|||
}
|
||||
prune_strings (instanceLayerNames, lay, &nlay);
|
||||
prune_strings (instanceExtensionNames, ext, &next);
|
||||
lay[nlay] = 0;
|
||||
ext[next] = 0;
|
||||
createInfo.enabledLayerCount = nlay;
|
||||
createInfo.ppEnabledLayerNames = lay;
|
||||
createInfo.enabledExtensionCount = next;
|
||||
|
@ -310,6 +321,9 @@ Vulkan_CreateInstance (vulkan_ctx_t *ctx,
|
|||
}
|
||||
inst = malloc (sizeof(VulkanInstance_t));
|
||||
inst->instance = instance;
|
||||
inst->enabled_extensions = new_strset (ext);
|
||||
inst->extension_enabled = instance_extension_enabled;
|
||||
ctx->extension_enabled = instance_extension_enabled;
|
||||
ctx->vtx = inst;
|
||||
load_instance_funcs (ctx);
|
||||
|
||||
|
|
|
@ -117,10 +117,13 @@ load_device_funcs (VulkanInstance_t *inst, VulkanDevice_t *dev)
|
|||
Sys_Error ("Couldn't find device level function %s", #name); \
|
||||
}
|
||||
|
||||
#define DEVICE_LEVEL_VULKAN_FUNCTION_EXTENSION(name) \
|
||||
dev->name = (PFN_##name) inst->vkGetDeviceProcAddr (dev->device, #name); \
|
||||
#define DEVICE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION(name, ext) \
|
||||
if (inst->extension_enabled (vtx, ext)) { \
|
||||
dev->name = (PFN_##name) inst->vkGetDeviceProcAddr (dev->device, \
|
||||
#name); \
|
||||
if (!dev->name) { \
|
||||
Sys_Printf ("Couldn't find device level function %s", #name); \
|
||||
} \
|
||||
}
|
||||
|
||||
#include "QF/Vulkan/funclist.h"
|
||||
|
@ -204,6 +207,7 @@ Vulkan_CreateDevice (vulkan_ctx_t *ctx)
|
|||
0, &device->queue);
|
||||
ctx->dev = device;
|
||||
ctx->device = device->device;
|
||||
ctx->physDevice = phys->device;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -61,7 +61,7 @@
|
|||
static cvar_t *vulkan_library_name;
|
||||
|
||||
typedef struct vulkan_presentation_s {
|
||||
#define INSTANCE_LEVEL_VULKAN_FUNCTION(name) PFN_##name name;
|
||||
#define INSTANCE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION(name,ext) PFN_##name name;
|
||||
#include "QF/Vulkan/funclist.h"
|
||||
|
||||
Display *display;
|
||||
|
@ -117,10 +117,13 @@ x11_vulkan_init_presentation (vulkan_ctx_t *ctx)
|
|||
vulkan_presentation_t *pres = ctx->presentation;
|
||||
VkInstance instance = ctx->instance;
|
||||
|
||||
#define INSTANCE_LEVEL_VULKAN_FUNCTION(name) \
|
||||
pres->name = (PFN_##name) ctx->vkGetInstanceProcAddr (instance, #name); \
|
||||
#define INSTANCE_LEVEL_VULKAN_FUNCTION_FROM_EXTENSION(name, ext) \
|
||||
if (ctx->extension_enabled (ctx->vtx, ext)) { \
|
||||
pres->name = (PFN_##name) ctx->vkGetInstanceProcAddr (instance, \
|
||||
#name); \
|
||||
if (!pres->name) { \
|
||||
Sys_Error ("Couldn't find instance-level function %s", #name); \
|
||||
} \
|
||||
}
|
||||
#include "QF/Vulkan/funclist.h"
|
||||
|
||||
|
|
Loading…
Reference in a new issue