forked from pyrite-dev/milsko
vulkan: initialize handle->internal if null
This commit is contained in:
parent
98a6559215
commit
aecfdf8f2b
1 changed files with 27 additions and 21 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue