anv: Make entrypoint resolution take a gen_device_info

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@jlekstrand.net>
This commit is contained in:
Jason Ekstrand
2016-10-07 15:47:45 -07:00
parent 4c9dec80ed
commit 6d557ae403
3 changed files with 12 additions and 20 deletions

View File

@@ -682,7 +682,7 @@ PFN_vkVoidFunction anv_GetInstanceProcAddr(
VkInstance instance, VkInstance instance,
const char* pName) 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 /* With version 1+ of the loader interface the ICD should expose
@@ -702,10 +702,11 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_icdGetInstanceProcAddr(
} }
PFN_vkVoidFunction anv_GetDeviceProcAddr( PFN_vkVoidFunction anv_GetDeviceProcAddr(
VkDevice device, VkDevice _device,
const char* pName) const char* pName)
{ {
return anv_lookup_entrypoint(pName); ANV_FROM_HANDLE(anv_device, device, _device);
return anv_lookup_entrypoint(&device->info, pName);
} }
static VkResult static VkResult
@@ -854,8 +855,6 @@ VkResult anv_CreateDevice(
return vk_error(VK_ERROR_EXTENSION_NOT_PRESENT); return vk_error(VK_ERROR_EXTENSION_NOT_PRESENT);
} }
anv_set_dispatch_devinfo(&physical_device->info);
device = anv_alloc2(&physical_device->instance->alloc, pAllocator, device = anv_alloc2(&physical_device->instance->alloc, pAllocator,
sizeof(*device), 8, sizeof(*device), 8,
VK_SYSTEM_ALLOCATION_SCOPE_DEVICE); VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);

View File

@@ -214,22 +214,14 @@ for layer in [ "anv", "gen7", "gen75", "gen8", "gen9" ]:
print "};\n" print "};\n"
print """ 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)) 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]; return anv_layer.entrypoints[index];
} }
switch (dispatch_devinfo.gen) { switch (devinfo->gen) {
case 9: case 9:
if (gen9_layer.entrypoints[index]) if (gen9_layer.entrypoints[index])
return gen9_layer.entrypoints[index]; return gen9_layer.entrypoints[index];
@@ -239,7 +231,7 @@ anv_resolve_entrypoint(uint32_t index)
return gen8_layer.entrypoints[index]; return gen8_layer.entrypoints[index];
/* fall through */ /* fall through */
case 7: case 7:
if (dispatch_devinfo.is_haswell && gen75_layer.entrypoints[index]) if (devinfo->is_haswell && gen75_layer.entrypoints[index])
return gen75_layer.entrypoints[index]; return gen75_layer.entrypoints[index];
if (gen7_layer.entrypoints[index]) if (gen7_layer.entrypoints[index])
@@ -301,7 +293,7 @@ print "};"
print """ print """
void * 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_factor = %d;
static const uint32_t prime_step = %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) if (strcmp(name, strings + e->name) != 0)
return NULL; return NULL;
return anv_resolve_entrypoint(i); return anv_resolve_entrypoint(devinfo, i);
} }
""" % (prime_factor, prime_step, hash_mask) """ % (prime_factor, prime_step, hash_mask)

View File

@@ -1805,7 +1805,8 @@ struct anv_query_pool {
struct anv_bo bo; 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, void anv_dump_image_to_ppm(struct anv_device *device,
struct anv_image *image, unsigned miplevel, struct anv_image *image, unsigned miplevel,