vk: Fall back to previous gens in entry point resolver
authorKristian Høgsberg Kristensen <kristian.h.kristensen@intel.com>
Wed, 26 Aug 2015 11:10:58 +0000 (04:10 -0700)
committerKristian Høgsberg Kristensen <kristian.h.kristensen@intel.com>
Thu, 3 Sep 2015 18:53:09 +0000 (11:53 -0700)
We used to always just do a one-level fallback from genX_* to anv_*
entry points. That worked for gen7 and gen8 where all entry points were
either different or could be made anv_* entry points (eg
anv_CreateDynamicViewportState). We're about to add gen9 and now need to
be able to fall back to gen8 entry points for most things.

Signed-off-by: Kristian Høgsberg Kristensen <kristian.h.kristensen@intel.com>
src/vulkan/anv_device.c
src/vulkan/anv_entrypoints_gen.py

index 25c60488a803614c4a98b96a94810e4683efe6fb..70c0c9d490ac30636f3016dc929e9899a4da3f8b 100644 (file)
@@ -542,14 +542,7 @@ VkResult anv_CreateDevice(
 
    assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO);
 
-   switch (physical_device->info->gen) {
-   case 7:
-      driver_layer = &gen7_layer;
-      break;
-   case 8:
-      driver_layer = &gen8_layer;
-      break;
-   }
+   anv_set_dispatch_gen(physical_device->info->gen);
 
    device = anv_instance_alloc(instance, sizeof(*device), 8,
                                VK_SYSTEM_ALLOC_TYPE_API_OBJECT);
index 21f87f181e9a7aaf489699538b44543c7f5fbedb..149f34c9842d19da708616491f6376197d4bbbf7 100644 (file)
@@ -91,9 +91,7 @@ if opt_header:
     print "   };\n"
     print "};\n"
 
-    print "extern const struct anv_layer gen7_layer;\n"
-    print "extern const struct anv_layer gen8_layer;\n"
-    print "extern const struct anv_layer *driver_layer;\n"
+    print "void anv_set_dispatch_gen(uint32_t gen);\n"
 
     for type, name, args, num, h in entrypoints:
         print "%s anv_%s%s;" % (type, name, args)
@@ -195,7 +193,13 @@ determine_validate(void)
       enable_validate = atoi(s);
 }
 
-const struct anv_layer *driver_layer = &anv_layer;
+static uint32_t dispatch_gen;
+
+void
+anv_set_dispatch_gen(uint32_t gen)
+{
+   dispatch_gen = gen;   
+}
 
 static void * __attribute__ ((noinline))
 resolve_entrypoint(uint32_t index)
@@ -203,10 +207,20 @@ resolve_entrypoint(uint32_t index)
    if (enable_validate && validate_layer.entrypoints[index])
       return validate_layer.entrypoints[index];
 
-   if (driver_layer && driver_layer->entrypoints[index])
-      return driver_layer->entrypoints[index];
-
-   return anv_layer.entrypoints[index];
+   switch (dispatch_gen) {
+   case 8:
+      if (gen8_layer.entrypoints[index])
+         return gen8_layer.entrypoints[index];
+      /* fall through */
+   case 7:
+      if (gen7_layer.entrypoints[index])
+         return gen7_layer.entrypoints[index];
+      /* fall through */
+   case 0:
+      return anv_layer.entrypoints[index];
+   default:
+      unreachable("unsupported gen\\n");
+   }
 }
 """