[Mesa-dev] [PATCH 22/22] anv: Make entrypoint resolution take a gen_device_info
Jason Ekstrand
jason at jlekstrand.net
Sat Oct 8 04:41:20 UTC 2016
In order for things such as the ANV_CALL and the ifuncs to work, we used to
have a singleton gen_device_info structure that got assigned the first time
you create a device. Given that the driver will never be used
simultaneously on two different generations of hardware, this was fairly
safe to do. However, it has caused a few hickups and isn't, in general, a
good plan. Now that the two primary reasons for this singleton are gone,
we can get rid of it and make things quite a bit safer.
Signed-off-by: Jason Ekstrand <jason at jlekstrand.net>
---
src/intel/vulkan/anv_device.c | 9 ++++-----
src/intel/vulkan/anv_entrypoints_gen.py | 20 ++++++--------------
src/intel/vulkan/anv_private.h | 3 ++-
3 files changed, 12 insertions(+), 20 deletions(-)
diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
index f00c2de..d5286c5 100644
--- a/src/intel/vulkan/anv_device.c
+++ b/src/intel/vulkan/anv_device.c
@@ -680,7 +680,7 @@ PFN_vkVoidFunction anv_GetInstanceProcAddr(
VkInstance instance,
const char* pName)
{
- return anv_lookup_entrypoint(pName);
+ return anv_lookup_entrypoint(NULL, pName);
}
/* With version 1+ of the loader interface the ICD should expose
@@ -700,10 +700,11 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_icdGetInstanceProcAddr(
}
PFN_vkVoidFunction anv_GetDeviceProcAddr(
- VkDevice device,
+ VkDevice _device,
const char* pName)
{
- return anv_lookup_entrypoint(pName);
+ ANV_FROM_HANDLE(anv_device, device, _device);
+ return anv_lookup_entrypoint(&device->info, pName);
}
static VkResult
@@ -852,8 +853,6 @@ VkResult anv_CreateDevice(
return vk_error(VK_ERROR_EXTENSION_NOT_PRESENT);
}
- anv_set_dispatch_devinfo(&physical_device->info);
-
device = anv_alloc2(&physical_device->instance->alloc, pAllocator,
sizeof(*device), 8,
VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
diff --git a/src/intel/vulkan/anv_entrypoints_gen.py b/src/intel/vulkan/anv_entrypoints_gen.py
index ebabce6..9d23dbb 100644
--- a/src/intel/vulkan/anv_entrypoints_gen.py
+++ b/src/intel/vulkan/anv_entrypoints_gen.py
@@ -214,22 +214,14 @@ for layer in [ "anv", "gen7", "gen75", "gen8", "gen9" ]:
print "};\n"
print """
-static struct gen_device_info dispatch_devinfo;
-
-void
-anv_set_dispatch_devinfo(const struct gen_device_info *devinfo)
-{
- dispatch_devinfo = *devinfo;
-}
-
static void * __attribute__ ((noinline))
-anv_resolve_entrypoint(uint32_t index)
+anv_resolve_entrypoint(const struct gen_device_info *devinfo, uint32_t index)
{
- if (dispatch_devinfo.gen == 0) {
+ if (devinfo == NULL) {
return anv_layer.entrypoints[index];
}
- switch (dispatch_devinfo.gen) {
+ switch (devinfo->gen) {
case 9:
if (gen9_layer.entrypoints[index])
return gen9_layer.entrypoints[index];
@@ -239,7 +231,7 @@ anv_resolve_entrypoint(uint32_t index)
return gen8_layer.entrypoints[index];
/* fall through */
case 7:
- if (dispatch_devinfo.is_haswell && gen75_layer.entrypoints[index])
+ if (devinfo->is_haswell && gen75_layer.entrypoints[index])
return gen75_layer.entrypoints[index];
if (gen7_layer.entrypoints[index])
@@ -301,7 +293,7 @@ print "};"
print """
void *
-anv_lookup_entrypoint(const char *name)
+anv_lookup_entrypoint(const struct gen_device_info *devinfo, const char *name)
{
static const uint32_t prime_factor = %d;
static const uint32_t prime_step = %d;
@@ -325,6 +317,6 @@ anv_lookup_entrypoint(const char *name)
if (strcmp(name, strings + e->name) != 0)
return NULL;
- return anv_resolve_entrypoint(i);
+ return anv_resolve_entrypoint(devinfo, i);
}
""" % (prime_factor, prime_step, hash_mask)
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index 72d9127..1f2bbe5 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -1804,7 +1804,8 @@ struct anv_query_pool {
struct anv_bo bo;
};
-void *anv_lookup_entrypoint(const char *name);
+void *anv_lookup_entrypoint(const struct gen_device_info *devinfo,
+ const char *name);
void anv_dump_image_to_ppm(struct anv_device *device,
struct anv_image *image, unsigned miplevel,
--
2.5.0.400.gff86faf
More information about the mesa-dev
mailing list