Module: Mesa
Branch: main
Commit: 6f8fe78e3b00a97cff98a21f03a0b63ac1366c19
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=6f8fe78e3b00a97cff98a21f03a0b63ac1366c19

Author: Yiwei Zhang <[email protected]>
Date:   Mon Feb 13 23:18:39 2023 -0800

venus: start requiring all experimental features

This is to prepare for promoting exp features to core.

Signed-off-by: Yiwei Zhang <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21379>

---

 src/virtio/vulkan/vn_instance.c | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/src/virtio/vulkan/vn_instance.c b/src/virtio/vulkan/vn_instance.c
index f09a4e5a997..fdf22bd1abe 100644
--- a/src/virtio/vulkan/vn_instance.c
+++ b/src/virtio/vulkan/vn_instance.c
@@ -163,28 +163,32 @@ vn_instance_init_ring(struct vn_instance *instance)
    return VK_SUCCESS;
 }
 
-static void
+static VkResult
 vn_instance_init_experimental_features(struct vn_instance *instance)
 {
    if (instance->renderer->info.vk_mesa_venus_protocol_spec_version !=
        100000) {
       if (VN_DEBUG(INIT))
          vn_log(instance, "renderer supports no experimental features");
-      return;
+      return VK_SUCCESS;
    }
 
    size_t struct_size = sizeof(instance->experimental);
    vn_call_vkGetVenusExperimentalFeatureData100000MESA(
       instance, &struct_size, &instance->experimental);
 
+   VkVenusExperimentalFeatures100000MESA *exp_feats = &instance->experimental;
+
    /* if renderer supports multiple_timelines, the driver will use it and
     * globalFencing support can be assumed.
     */
    if (instance->renderer->info.supports_multiple_timelines)
-      instance->experimental.globalFencing = VK_TRUE;
+      exp_feats->globalFencing = VK_TRUE;
 
-   /* largeRing has been enforced by mandated render server config */
-   assert(instance->experimental.largeRing);
+   if (!exp_feats->memoryResourceAllocationSize ||
+       !exp_feats->globalFencing || !exp_feats->largeRing ||
+       !exp_feats->syncFdFencing)
+      return VK_ERROR_INITIALIZATION_FAILED;
 
    if (VN_DEBUG(INIT)) {
       vn_log(instance,
@@ -198,6 +202,8 @@ vn_instance_init_experimental_features(struct vn_instance 
*instance)
              instance->experimental.largeRing,
              instance->experimental.syncFdFencing);
    }
+
+   return VK_SUCCESS;
 }
 
 static VkResult
@@ -690,7 +696,9 @@ vn_CreateInstance(const VkInstanceCreateInfo *pCreateInfo,
    if (result != VK_SUCCESS)
       goto fail;
 
-   vn_instance_init_experimental_features(instance);
+   result = vn_instance_init_experimental_features(instance);
+   if (result != VK_SUCCESS)
+      goto fail;
 
    result = vn_instance_init_renderer_versions(instance);
    if (result != VK_SUCCESS)

Reply via email to