From 75ce49b1f0cb6288053a4de0024cd808eb4bb2a6 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Wed, 13 Dec 2023 20:25:23 +0900 Subject: [PATCH] [vulkan] Switch to vulkan 1.1/1.2 prop/feat structs Since switching to the 1.2 api as a requirement, might as well use the relevant structs instead of extension struct (for multiview). Came up when double-checking the max views property due to running into what appears to be an nvidia bug where > 29 views (any bit pattern) cause a segfault when creating the pipeline. --- include/QF/Vulkan/instance.h | 6 +++--- libs/video/renderer/vulkan/device.c | 16 ++++++++-------- libs/video/renderer/vulkan/instance.c | 19 +++++++++++-------- libs/video/renderer/vulkan/resource.c | 2 +- libs/video/renderer/vulkan/staging.c | 2 +- libs/video/renderer/vulkan/vkparse.c | 6 +++--- libs/video/renderer/vulkan/vulkan_bsp.c | 6 +++--- libs/video/renderer/vulkan/vulkan_draw.c | 4 ++-- libs/video/renderer/vulkan/vulkan_lighting.c | 2 +- libs/video/renderer/vulkan/vulkan_particles.c | 2 +- .../video/renderer/vulkan/vulkan_vid_common.c | 1 - 11 files changed, 34 insertions(+), 32 deletions(-) diff --git a/include/QF/Vulkan/instance.h b/include/QF/Vulkan/instance.h index c4b18a73a..9c7226362 100644 --- a/include/QF/Vulkan/instance.h +++ b/include/QF/Vulkan/instance.h @@ -42,9 +42,9 @@ typedef struct DARRAY_TYPE(const char *) qfv_debugstack_t; typedef struct qfv_physdev_s { struct qfv_instance_s *instance; VkPhysicalDevice dev; - VkPhysicalDeviceProperties2 properties2; - VkPhysicalDeviceProperties *properties; - VkPhysicalDeviceMultiviewProperties multiViewProperties; + VkPhysicalDeviceProperties2 p; + VkPhysicalDeviceVulkan11Properties v11Properties; + VkPhysicalDeviceVulkan12Properties v12Properties; VkPhysicalDeviceMemoryProperties memory_properties; } qfv_physdev_t; diff --git a/libs/video/renderer/vulkan/device.c b/libs/video/renderer/vulkan/device.c index 63a2ebeb5..7325483f6 100644 --- a/libs/video/renderer/vulkan/device.c +++ b/libs/video/renderer/vulkan/device.c @@ -149,19 +149,19 @@ QFV_CreateDevice (vulkan_ctx_t *ctx, const char **extensions) VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, 0, 0, family, 1, &priority }; - VkPhysicalDeviceMultiviewFeatures multiview_features = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, + VkPhysicalDeviceVulkan12Features features12 = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, + .hostQueryReset = 1, + }; + VkPhysicalDeviceVulkan11Features features11 = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, + .pNext = &features12, .multiview = 1, .multiviewGeometryShader = 1, }; - VkPhysicalDeviceVulkan12Features features12 = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, - .pNext = &multiview_features, - .hostQueryReset = 1, - }; VkPhysicalDeviceFeatures2 features = { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, - .pNext = &features12, + .pNext = &features11, .features = { .imageCubeArray = 1, .independentBlend = 1, diff --git a/libs/video/renderer/vulkan/instance.c b/libs/video/renderer/vulkan/instance.c index ce10f08c9..3f3a4c759 100644 --- a/libs/video/renderer/vulkan/instance.c +++ b/libs/video/renderer/vulkan/instance.c @@ -279,15 +279,18 @@ QFV_CreateInstance (vulkan_ctx_t *ctx, qfv_physdev_t *dev = &inst->devices[i]; dev->instance = inst; dev->dev = physDev; - dev->properties2 = (VkPhysicalDeviceProperties2) { + dev->p = (VkPhysicalDeviceProperties2) { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, - .pNext = &dev->multiViewProperties, + .pNext = &dev->v11Properties, }; - dev->multiViewProperties = (VkPhysicalDeviceMultiviewProperties) { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, + dev->v11Properties = (VkPhysicalDeviceVulkan11Properties) { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, + .pNext = &dev->v12Properties, }; - ifunc->vkGetPhysicalDeviceProperties2 (physDev, &dev->properties2); - dev->properties = &dev->properties2.properties; + dev->v12Properties = (VkPhysicalDeviceVulkan12Properties) { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, + }; + ifunc->vkGetPhysicalDeviceProperties2 (physDev, &dev->p); ifunc->vkGetPhysicalDeviceMemoryProperties (physDev, &dev->memory_properties); } @@ -314,8 +317,8 @@ QFV_GetMaxSampleCount (qfv_physdev_t *physdev) { VkSampleCountFlagBits maxSamples = VK_SAMPLE_COUNT_64_BIT; VkSampleCountFlagBits counts; - counts = min (physdev->properties->limits.framebufferColorSampleCounts, - physdev->properties->limits.framebufferDepthSampleCounts); + counts = min (physdev->p.properties.limits.framebufferColorSampleCounts, + physdev->p.properties.limits.framebufferDepthSampleCounts); while (maxSamples && maxSamples > counts) { maxSamples >>= 1; } diff --git a/libs/video/renderer/vulkan/resource.c b/libs/video/renderer/vulkan/resource.c index f14287f17..fc78239cb 100644 --- a/libs/video/renderer/vulkan/resource.c +++ b/libs/video/renderer/vulkan/resource.c @@ -92,7 +92,7 @@ QFV_CreateResource (qfv_device_t *device, qfv_resource_t *resource) { qfv_devfuncs_t *dfunc = device->funcs; qfv_physdev_t *physdev = device->physDev; - size_t atom = physdev->properties->limits.nonCoherentAtomSize; + size_t atom = physdev->p.properties.limits.nonCoherentAtomSize; VkPhysicalDeviceMemoryProperties *memprops = &physdev->memory_properties; VkMemoryRequirements req; VkDeviceSize size = 0; diff --git a/libs/video/renderer/vulkan/staging.c b/libs/video/renderer/vulkan/staging.c index e08a663a6..28a3c6584 100644 --- a/libs/video/renderer/vulkan/staging.c +++ b/libs/video/renderer/vulkan/staging.c @@ -43,7 +43,7 @@ qfv_stagebuf_t * QFV_CreateStagingBuffer (qfv_device_t *device, const char *name, size_t size, VkCommandPool cmdPool) { - size_t atom = device->physDev->properties->limits.nonCoherentAtomSize; + size_t atom = device->physDev->p.properties.limits.nonCoherentAtomSize; qfv_devfuncs_t *dfunc = device->funcs; dstring_t *str = dstring_new (); diff --git a/libs/video/renderer/vulkan/vkparse.c b/libs/video/renderer/vulkan/vkparse.c index 3c7bef5dc..6d283e7f7 100644 --- a/libs/video/renderer/vulkan/vkparse.c +++ b/libs/video/renderer/vulkan/vkparse.c @@ -1038,7 +1038,7 @@ parse_object (vulkan_ctx_t *ctx, memsuper_t *memsuper, plitem_t *plist, {"frames", &qfv_renderframeset_t_type, &rctx->frames}, {"msaaSamples", &VkSampleCountFlagBits_type, &ctx->msaaSamples}, {"physDevLimits", &VkPhysicalDeviceLimits_type, - &ctx->device->physDev->properties->limits }, + &ctx->device->physDev->p.properties.limits }, {QFV_PROPERTIES, &cexpr_plitem, &parsectx.properties}, {} }; @@ -1442,7 +1442,7 @@ QFV_ParseJobInfo (vulkan_ctx_t *ctx, plitem_t *item, qfv_renderctx_t *rctx) {"frames", &qfv_renderframeset_t_type, &rctx->frames}, {"msaaSamples", &VkSampleCountFlagBits_type, &ctx->msaaSamples}, {"physDevLimits", &VkPhysicalDeviceLimits_type, - &ctx->device->physDev->properties->limits }, + &ctx->device->physDev->p.properties.limits }, {} }; exprctx.external_variables = QFV_CreateSymtab (item, "properties", @@ -1489,7 +1489,7 @@ QFV_ParseSamplerInfo (vulkan_ctx_t *ctx, plitem_t *item, qfv_renderctx_t *rctx) exprsym_t var_syms[] = { {"physDevLimits", &VkPhysicalDeviceLimits_type, - &ctx->device->physDev->properties->limits }, + &ctx->device->physDev->p.properties.limits }, {} }; exprctx.external_variables = QFV_CreateSymtab (item, "properties", diff --git a/libs/video/renderer/vulkan/vulkan_bsp.c b/libs/video/renderer/vulkan/vulkan_bsp.c index 373c88097..ca61ffc62 100644 --- a/libs/video/renderer/vulkan/vulkan_bsp.c +++ b/libs/video/renderer/vulkan/vulkan_bsp.c @@ -504,7 +504,7 @@ Vulkan_BuildDisplayLists (model_t **models, int num_models, vulkan_ctx_t *ctx) } index_count *= 3; - size_t atom = device->physDev->properties->limits.nonCoherentAtomSize; + size_t atom = device->physDev->p.properties.limits.nonCoherentAtomSize; size_t atom_mask = atom - 1; size_t frames = bctx->frames.size; size_t index_buffer_size = index_count * frames * sizeof (uint32_t); @@ -975,7 +975,7 @@ bsp_flush (vulkan_ctx_t *ctx) qfv_devfuncs_t *dfunc = device->funcs; bspctx_t *bctx = ctx->bsp_context; bspframe_t *bframe = &bctx->frames.a[ctx->curFrame]; - size_t atom = device->physDev->properties->limits.nonCoherentAtomSize; + size_t atom = device->physDev->p.properties.limits.nonCoherentAtomSize; size_t atom_mask = atom - 1; size_t index_offset = bframe->index_offset; size_t index_size = bframe->index_count * sizeof (uint32_t); @@ -1456,7 +1456,7 @@ Vulkan_Bsp_Setup (vulkan_ctx_t *ctx) size_t entid_count = Vulkan_Scene_MaxEntities (ctx); size_t entid_size = entid_count * sizeof (uint32_t); - size_t atom = device->physDev->properties->limits.nonCoherentAtomSize; + size_t atom = device->physDev->p.properties.limits.nonCoherentAtomSize; size_t atom_mask = atom - 1; entid_size = (entid_size + atom_mask) & ~atom_mask; bctx->entid_buffer diff --git a/libs/video/renderer/vulkan/vulkan_draw.c b/libs/video/renderer/vulkan/vulkan_draw.c index 3cd436805..bc4ca8dfc 100644 --- a/libs/video/renderer/vulkan/vulkan_draw.c +++ b/libs/video/renderer/vulkan/vulkan_draw.c @@ -975,7 +975,7 @@ slice_draw (const exprval_t **params, exprval_t *result, exprctx_t *ectx) qftVkScopedZone (taskctx->frame->qftVkCtx, taskctx->cmd, "slice_draw"); VkDeviceMemory memory = dctx->draw_resource[1].memory; - size_t atom = device->physDev->properties->limits.nonCoherentAtomSize; + size_t atom = device->physDev->p.properties.limits.nonCoherentAtomSize; size_t atom_mask = atom - 1; #define a(x) (((x) + atom_mask) & ~atom_mask) VkMappedMemoryRange ranges[] = { @@ -1012,7 +1012,7 @@ line_draw (const exprval_t **params, exprval_t *result, exprctx_t *ectx) } VkDeviceMemory memory = dctx->draw_resource[1].memory; - size_t atom = device->physDev->properties->limits.nonCoherentAtomSize; + size_t atom = device->physDev->p.properties.limits.nonCoherentAtomSize; size_t atom_mask = atom - 1; #define a(x) (((x) + atom_mask) & ~atom_mask) VkMappedMemoryRange ranges[] = { diff --git a/libs/video/renderer/vulkan/vulkan_lighting.c b/libs/video/renderer/vulkan/vulkan_lighting.c index 50aa66466..d1b60db22 100644 --- a/libs/video/renderer/vulkan/vulkan_lighting.c +++ b/libs/video/renderer/vulkan/vulkan_lighting.c @@ -1719,7 +1719,7 @@ build_shadow_maps (lightingctx_t *lctx, vulkan_ctx_t *ctx) qfv_device_t *device = ctx->device; qfv_physdev_t *physDev = device->physDev; - int maxLayers = physDev->properties->limits.maxImageArrayLayers; + int maxLayers = physDev->p.properties.limits.maxImageArrayLayers; if (maxLayers > 2048) { maxLayers = 2048; } diff --git a/libs/video/renderer/vulkan/vulkan_particles.c b/libs/video/renderer/vulkan/vulkan_particles.c index 7d88443a8..7fee8acb0 100644 --- a/libs/video/renderer/vulkan/vulkan_particles.c +++ b/libs/video/renderer/vulkan/vulkan_particles.c @@ -209,7 +209,7 @@ update_particles (const exprval_t **p, exprval_t *result, exprctx_t *ectx) qfv_packet_t *packet = QFV_PacketAcquire (pctx->stage); - __auto_type limits = &device->physDev->properties->limits; + __auto_type limits = &device->physDev->p.properties.limits; VkMemoryRequirements req = { .alignment = limits->minStorageBufferOffsetAlignment }; diff --git a/libs/video/renderer/vulkan/vulkan_vid_common.c b/libs/video/renderer/vulkan/vulkan_vid_common.c index eb26d9c29..7f9a26083 100644 --- a/libs/video/renderer/vulkan/vulkan_vid_common.c +++ b/libs/video/renderer/vulkan/vulkan_vid_common.c @@ -92,7 +92,6 @@ static cvar_t vulkan_oit_fragments_cvar = { static const char *instance_extensions[] = { VK_KHR_SURFACE_EXTENSION_NAME, - VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 0, };