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.
This commit is contained in:
Bill Currie 2019-07-09 11:54:23 +09:00
parent 707bdfc5f2
commit b3d982bfc3
6 changed files with 36 additions and 31 deletions

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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 = {

View File

@ -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);

View File

@ -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);
}