From b3d982bfc3a053e7058cace4e058050ff916c801 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Tue, 9 Jul 2019 11:54:23 +0900 Subject: [PATCH] Remove global vulkan_ctx While I can't say that I'm happy with the details of vulkan_ctx_t, I am pretty sure I don't want to be limited to having only one. --- include/QF/Vulkan/init.h | 6 ++-- include/QF/Vulkan/qf_vid.h | 5 +-- include/vid_vulkan.h | 6 ++-- libs/video/renderer/vid_render_vulkan.c | 6 ++-- libs/video/renderer/vulkan/init.c | 34 ++++++++++--------- .../video/renderer/vulkan/vulkan_vid_common.c | 10 +++--- 6 files changed, 36 insertions(+), 31 deletions(-) diff --git a/include/QF/Vulkan/init.h b/include/QF/Vulkan/init.h index 85efb44e1..c964e6c41 100644 --- a/include/QF/Vulkan/init.h +++ b/include/QF/Vulkan/init.h @@ -52,7 +52,7 @@ typedef struct { VkQueueFamilyProperties *queueFamilies; } VulkanPhysDevice_t; -typedef struct { +typedef struct VulkanInstance_s { VkInstance instance; VkDebugUtilsMessengerEXT debug_callback; uint32_t numDevices; @@ -64,7 +64,9 @@ typedef struct { } VulkanInstance_t; void Vulkan_Init_Cvars (void); -VulkanInstance_t *Vulkan_CreateInstance (const char *appName, +struct vulkan_ctx_s; +VulkanInstance_t *Vulkan_CreateInstance (struct vulkan_ctx_s *ctx, + const char *appName, uint32_t appVersion, const char **layers, const char **extensions); diff --git a/include/QF/Vulkan/qf_vid.h b/include/QF/Vulkan/qf_vid.h index d032a075a..8e1825b48 100644 --- a/include/QF/Vulkan/qf_vid.h +++ b/include/QF/Vulkan/qf_vid.h @@ -30,7 +30,8 @@ #include "QF/Vulkan/cvars.h" -void Vulkan_Init_Common (void); -void Vulkan_Shutdown_Common (void); +struct vulkan_ctx_s; +void Vulkan_Init_Common (struct vulkan_ctx_s *ctx); +void Vulkan_Shutdown_Common (struct vulkan_ctx_s *ctx); #endif // __QF_Vulkan_vid_h diff --git a/include/vid_vulkan.h b/include/vid_vulkan.h index ae83ae397..eea285ae4 100644 --- a/include/vid_vulkan.h +++ b/include/vid_vulkan.h @@ -10,18 +10,18 @@ typedef struct vulkan_ctx_s { void (*load_vulkan) (struct vulkan_ctx_s *ctx); void (*unload_vulkan) (struct vulkan_ctx_s *ctx); - const char * const *required_extensions; + const char **required_extensions; struct vulkan_presentation_s *presentation; int (*get_presentation_support) (struct vulkan_ctx_s *ctx, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex); VkSurfaceKHR (*create_surface) (struct vulkan_ctx_s *ctx); + + struct VulkanInstance_s *vtx; VkInstance instance; #define EXPORTED_VULKAN_FUNCTION(fname) PFN_##fname fname; #define GLOBAL_LEVEL_VULKAN_FUNCTION(fname) PFN_##fname fname; #include "QF/Vulkan/funclist.h" } vulkan_ctx_t; -extern vulkan_ctx_t *vulkan_ctx; - #endif//__vid_vulkan_h diff --git a/libs/video/renderer/vid_render_vulkan.c b/libs/video/renderer/vid_render_vulkan.c index 840505e10..60c7c1b5e 100644 --- a/libs/video/renderer/vid_render_vulkan.c +++ b/libs/video/renderer/vid_render_vulkan.c @@ -43,7 +43,7 @@ #include "vulkan/namehack.h" -vulkan_ctx_t *vulkan_ctx; +static vulkan_ctx_t *vulkan_ctx; static vid_model_funcs_t model_funcs = { /* vulkan_Mod_LoadExternalTextures, @@ -153,7 +153,7 @@ vulkan_vid_render_init (void) vulkan_ctx = vr_data.vid->vid_internal->vulkan_context (); vulkan_ctx->load_vulkan (vulkan_ctx); - Vulkan_Init_Common (); + Vulkan_Init_Common (vulkan_ctx); vr_data.vid->vid_internal->set_palette = set_palette; vr_data.vid->vid_internal->choose_visual = vulkan_vid_render_choose_visual; @@ -166,7 +166,7 @@ vulkan_vid_render_init (void) static void vulkan_vid_render_shutdown (void) { - Vulkan_Shutdown_Common (); + Vulkan_Shutdown_Common (vulkan_ctx); } static general_funcs_t plugin_info_general_funcs = { diff --git a/libs/video/renderer/vulkan/init.c b/libs/video/renderer/vulkan/init.c index e3181fc07..af3f21b4b 100644 --- a/libs/video/renderer/vulkan/init.c +++ b/libs/video/renderer/vulkan/init.c @@ -73,15 +73,15 @@ static const char *device_types[] = { }; static void -get_instance_layers_and_extensions (void) +get_instance_layers_and_extensions (vulkan_ctx_t *ctx) { uint32_t i; VkLayerProperties *properties; VkExtensionProperties *extensions; - vulkan_ctx->vkEnumerateInstanceLayerProperties (&numLayers, 0); + ctx->vkEnumerateInstanceLayerProperties (&numLayers, 0); properties = malloc (numLayers * sizeof (VkLayerProperties)); - vulkan_ctx->vkEnumerateInstanceLayerProperties (&numLayers, properties); + ctx->vkEnumerateInstanceLayerProperties (&numLayers, properties); instanceLayerNames = (const char **) malloc ((numLayers + 1) * sizeof (const char **)); for (i = 0; i < numLayers; i++) { @@ -89,9 +89,9 @@ get_instance_layers_and_extensions (void) } instanceLayerNames[i] = 0; - vulkan_ctx->vkEnumerateInstanceExtensionProperties (0, &numExtensions, 0); + ctx->vkEnumerateInstanceExtensionProperties (0, &numExtensions, 0); extensions = malloc (numExtensions * sizeof (VkLayerProperties)); - vulkan_ctx->vkEnumerateInstanceExtensionProperties (0, &numExtensions, + ctx->vkEnumerateInstanceExtensionProperties (0, &numExtensions, extensions); instanceExtensionNames = (const char **) malloc ((numExtensions + 1) * sizeof (const char **)); @@ -277,19 +277,19 @@ setup_debug_callback (VulkanInstance_t *instance) } static void -load_instance_funcs (VulkanInstance_t *instance) +load_instance_funcs (vulkan_ctx_t *ctx) { + VulkanInstance_t *vtx = ctx->vtx; + VkInstance instance = vtx->instance; #define INSTANCE_LEVEL_VULKAN_FUNCTION(name) \ - instance->name = (PFN_##name) \ - vulkan_ctx->vkGetInstanceProcAddr (instance->instance, #name); \ - if (!instance->name) { \ + vtx->name = (PFN_##name) ctx->vkGetInstanceProcAddr (instance, #name); \ + if (!vtx->name) { \ Sys_Error ("Couldn't find instance level function %s", #name); \ } #define INSTANCE_LEVEL_VULKAN_FUNCTION_EXTENSION(name) \ - instance->name = (PFN_##name) \ - vulkan_ctx->vkGetInstanceProcAddr (instance->instance, #name); \ - if (!instance->name) { \ + vtx->name = (PFN_##name) ctx->vkGetInstanceProcAddr (instance, #name); \ + if (!vtx->name) { \ Sys_Printf ("Couldn't find instance level function %s", #name); \ } @@ -297,7 +297,8 @@ load_instance_funcs (VulkanInstance_t *instance) } VulkanInstance_t * -Vulkan_CreateInstance (const char *appName, uint32_t appVersion, +Vulkan_CreateInstance (vulkan_ctx_t *ctx, + const char *appName, uint32_t appVersion, const char **layers, const char **extensions) { VkApplicationInfo appInfo = { @@ -319,7 +320,7 @@ Vulkan_CreateInstance (const char *appName, uint32_t appVersion, VulkanInstance_t *inst; if (!instanceLayerProperties) { - get_instance_layers_and_extensions (); + get_instance_layers_and_extensions (ctx); } createInfo.enabledLayerCount = count_strings (layers); @@ -346,13 +347,14 @@ Vulkan_CreateInstance (const char *appName, uint32_t appVersion, createInfo.ppEnabledLayerNames = lay; createInfo.ppEnabledExtensionNames = ext; - res = vulkan_ctx->vkCreateInstance (&createInfo, 0, &instance); + res = ctx->vkCreateInstance (&createInfo, 0, &instance); if (res != VK_SUCCESS) { Sys_Error ("unable to create vulkan instance\n"); } inst = malloc (sizeof(VulkanInstance_t)); inst->instance = instance; - load_instance_funcs (inst); + ctx->vtx = inst; + load_instance_funcs (ctx); if (vulkan_use_validation->int_val) { setup_debug_callback (inst); diff --git a/libs/video/renderer/vulkan/vulkan_vid_common.c b/libs/video/renderer/vulkan/vulkan_vid_common.c index cfd2a980f..96094303a 100644 --- a/libs/video/renderer/vulkan/vulkan_vid_common.c +++ b/libs/video/renderer/vulkan/vulkan_vid_common.c @@ -168,25 +168,25 @@ create_suitable_device (VulkanInstance_t *instance) int x = 1; void -Vulkan_Init_Common (void) +Vulkan_Init_Common (vulkan_ctx_t *ctx) { Sys_Printf ("Vulkan_Init_Common\n"); Vulkan_Init_Cvars (); - vulkan_instance = Vulkan_CreateInstance (PACKAGE_STRING, 0x000702ff, 0, instance_extensions);//FIXME version + vulkan_instance = Vulkan_CreateInstance (ctx, PACKAGE_STRING, 0x000702ff, 0, instance_extensions);//FIXME version vulkan_device = create_suitable_device (vulkan_instance); if (!vulkan_device) { Sys_Error ("no suitable vulkan device found"); } // only for now... Sys_Printf ("%p %p\n", vulkan_device->device, vulkan_device->queue); - Vulkan_Shutdown_Common (); + Vulkan_Shutdown_Common (ctx); if (x) Sys_Quit(); } void -Vulkan_Shutdown_Common (void) +Vulkan_Shutdown_Common (vulkan_ctx_t *ctx) { if (vulkan_device) { vulkan_device->vkDestroyDevice (vulkan_device->device, 0); @@ -195,5 +195,5 @@ Vulkan_Shutdown_Common (void) } Vulkan_DestroyInstance (vulkan_instance); vulkan_instance = 0; - vulkan_ctx->unload_vulkan (vulkan_ctx); + ctx->unload_vulkan (ctx); }