diff --git a/src/widget/vulkan.c b/src/widget/vulkan.c index 32ae20a..26ffe2c 100644 --- a/src/widget/vulkan.c +++ b/src/widget/vulkan.c @@ -85,9 +85,6 @@ MwVulkanConfig vulkan_config = { return 1; \ } -const char** enabledExtensions; -const char** enabledLayers; - typedef enum vulkan_supported_state_t { VULKAN_SUPPORTED_UNKNOWN, VULKAN_SUPPORTED_YES, @@ -115,6 +112,10 @@ typedef struct vulkan { int vkInstanceExtensionCount; int vkDeviceExtensionCount; int vkLayerCount; + + const char** enabledExtensions; + const char** enabledLayers; + } vulkan_t; static int vulkan_instance_setup(MwWidget handle, vulkan_t* o); @@ -224,27 +225,27 @@ static int vulkan_instance_setup(MwWidget handle, vulkan_t* o) { VK_ASSERT(_vkCreateInstance); /* setup enabled extensions */ - arrput(enabledExtensions, VK_KHR_SURFACE_EXTENSION_NAME); + arrput(o->enabledExtensions, VK_KHR_SURFACE_EXTENSION_NAME); #ifdef USE_GDI if(handle->lowlevel->common.type == MwLLBackendGDI) { - arrput(enabledExtensions, VK_KHR_WIN32_SURFACE_EXTENSION_NAME); + arrput(o->enabledExtensions, VK_KHR_WIN32_SURFACE_EXTENSION_NAME); } #endif #ifdef USE_X11 if(handle->lowlevel->common.type == MwLLBackendX11) { - arrput(enabledExtensions, VK_KHR_XLIB_SURFACE_EXTENSION_NAME); + arrput(o->enabledExtensions, VK_KHR_XLIB_SURFACE_EXTENSION_NAME); } #endif #ifdef USE_WAYLAND if(handle->lowlevel->common.type == MwLLBackendWayland) { - arrput(enabledExtensions, VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME); + arrput(o->enabledExtensions, VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME); /* take this opprutunity to set the widget to always render */ MwWaylandAlwaysRender = MwTRUE; } #endif #ifdef USE_COCOA if(handle->lowlevel->common.type == MwLLBackendCocoa) { - arrput(enabledExtensions, VK_EXT_METAL_SURFACE_EXTENSION_NAME); + arrput(o->enabledExtensions, VK_EXT_METAL_SURFACE_EXTENSION_NAME); } #endif @@ -252,11 +253,11 @@ static int vulkan_instance_setup(MwWidget handle, vulkan_t* o) { VK_CMD(_vkEnumerateInstanceExtensionProperties(NULL, &extension_count, NULL)); ext_props = malloc(sizeof(VkExtensionProperties) * extension_count); VK_CMD(_vkEnumerateInstanceExtensionProperties(NULL, &extension_count, ext_props)); - o->vkInstanceExtensions = malloc(sizeof(const char*) * (arrlen(enabledExtensions) + 1)); + o->vkInstanceExtensions = malloc(sizeof(const char*) * (arrlen(o->enabledExtensions) + 1)); for(i = 0; i < extension_count; i++) { - for(n = 0; n < (unsigned long)arrlen(enabledExtensions); n++) { - if(strcmp(ext_props[i].extensionName, enabledExtensions[n]) == 0) { + for(n = 0; n < (unsigned long)arrlen(o->enabledExtensions); n++) { + if(strcmp(ext_props[i].extensionName, o->enabledExtensions[n]) == 0) { printf("[Vulkan Widget] Enabling extension %s\n", ext_props[i].extensionName); o->vkInstanceExtensions[o->vkInstanceExtensionCount] = ext_props[i].extensionName; o->vkInstanceExtensionCount++; @@ -278,14 +279,14 @@ static int vulkan_instance_setup(MwWidget handle, vulkan_t* o) { VK_CMD(_vkEnumerateInstanceLayerProperties(&layer_count, NULL)); layer_props = malloc(sizeof(VkLayerProperties) * layer_count); VK_CMD(_vkEnumerateInstanceLayerProperties(&layer_count, layer_props)); - o->vkLayers = malloc(256 * (arrlen(enabledLayers) + 1)); + o->vkLayers = malloc(256 * (arrlen(o->enabledLayers) + 1)); if(vulkan_config.validation_layers) { - arrput(enabledLayers, "VK_LAYER_KHRONOS_validation"); + arrput(o->enabledLayers, "VK_LAYER_KHRONOS_validation"); } for(i = 0; i < layer_count; i++) { - for(n = 0; n < (unsigned long)arrlen(enabledLayers); n++) { - if(strcmp(layer_props[i].layerName, enabledLayers[n]) == 0) { + for(n = 0; n < (unsigned long)arrlen(o->enabledLayers); n++) { + if(strcmp(layer_props[i].layerName, o->enabledLayers[n]) == 0) { printf("[Vulkan Widget] Enabling layer %s\n", layer_props[i].layerName); o->vkLayers[o->vkLayerCount] = layer_props[i].layerName; o->vkLayerCount++; @@ -452,11 +453,11 @@ static int vulkan_devices_setup(MwWidget handle, vulkan_t* o) { VK_CMD(_vkEnumerateDeviceExtensionProperties(o->vkPhysicalDevice, NULL, &extension_count, NULL)); ext_props = malloc(sizeof(VkExtensionProperties) * extension_count); VK_CMD(_vkEnumerateDeviceExtensionProperties(o->vkPhysicalDevice, NULL, &extension_count, ext_props)); - o->vkDeviceExtensions = malloc(sizeof(const char*) * (arrlen(enabledExtensions) + 1)); + o->vkDeviceExtensions = malloc(sizeof(const char*) * (arrlen(o->enabledExtensions) + 1)); for(i = 0; i < extension_count; i++) { - for(n = 0; n < (unsigned long)arrlen(enabledExtensions); n++) { - if(strcmp(ext_props[i].extensionName, enabledExtensions[n]) == 0) { + for(n = 0; n < (unsigned long)arrlen(o->enabledExtensions); n++) { + if(strcmp(ext_props[i].extensionName, o->enabledExtensions[n]) == 0) { o->vkDeviceExtensions[o->vkDeviceExtensionCount] = ext_props[i].extensionName; o->vkDeviceExtensionCount++; break; @@ -547,15 +548,20 @@ static void* mwVulkanGetFieldImpl(MwWidget handle, int field, int* err) { } static void prop_change(MwWidget handle, const char* prop) { - /* TODO: make this local to widgets, not global */ + vulkan_t* o = (vulkan_t*)handle->internal; + if(!o) { + handle->internal = malloc(sizeof(*o)); + o = (vulkan_t*)handle->internal; + } + if(strcmp(prop, MwNvulkanExtension) == 0) { char* str = MwStringDuplicate(MwGetText(handle, MwNvulkanExtension)); - arrput(enabledExtensions, str); + arrput(o->enabledExtensions, str); } else if(strcmp(prop, MwNvulkanLayer) == 0) { char* str = MwStringDuplicate(MwGetText(handle, MwNvulkanExtension)); - arrput(enabledLayers, str); + arrput(o->enabledLayers, str); } }