radv: create on-disk shader cache
authorTimothy Arceri <tarceri@itsqueeze.com>
Wed, 11 Oct 2017 01:00:27 +0000 (12:00 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Wed, 11 Oct 2017 21:52:38 +0000 (08:52 +1100)
This is the drivers on-disk cache intended to be used as a
fallback as opposed to the pipeline cache provided by apps.

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/vulkan/radv_device.c
src/amd/vulkan/radv_private.h
src/util/disk_cache.h

index d414d8ca85bd69273834586b4cf66d3c7c7bc35e..23f5e70321da16098f309c62da5013dfcac16ab5 100644 (file)
@@ -352,6 +352,18 @@ radv_physical_device_init(struct radv_physical_device *device,
                goto fail;
        }
 
+       /* These flags affect shader compilation. */
+       uint64_t shader_env_flags =
+               (device->instance->perftest_flags & RADV_PERFTEST_SISCHED ? 0x1 : 0) |
+               (device->instance->debug_flags & RADV_DEBUG_UNSAFE_MATH ? 0x2 : 0);
+
+       /* The gpu id is already embeded in the uuid so we just pass "radv"
+        * when creating the cache.
+        */
+       char buf[VK_UUID_SIZE + 1];
+       disk_cache_format_hex_id(buf, device->cache_uuid, VK_UUID_SIZE);
+       device->disk_cache = disk_cache_create("radv", buf, shader_env_flags);
+
        result = radv_extensions_register(instance,
                                        &device->extensions,
                                        common_device_extensions,
@@ -402,6 +414,7 @@ radv_physical_device_finish(struct radv_physical_device *device)
        radv_extensions_finish(device->instance, &device->extensions);
        radv_finish_wsi(device);
        device->ws->destroy(device->ws);
+       disk_cache_destroy(device->disk_cache);
        close(device->local_fd);
 }
 
index 548952faa97e96ab437123ef0e3b45d8d6add283..e673527811f612f35e864283f767190926342411 100644 (file)
@@ -277,6 +277,12 @@ struct radv_physical_device {
 
        bool has_rbplus; /* if RB+ register exist */
        bool rbplus_allowed; /* if RB+ is allowed */
+
+
+       /* This is the drivers on-disk cache used as a fallback as opposed to
+        * the pipeline cache defined by apps.
+        */
+       struct disk_cache *                          disk_cache;
 };
 
 struct radv_instance {
index d2e4d9a69c7b255fcf2a766d31d3b2bba10fb551..488b297ead2762f38575b0023047f746576b2502 100644 (file)
@@ -65,6 +65,21 @@ struct cache_item_metadata {
 
 struct disk_cache;
 
+static inline char *
+disk_cache_format_hex_id(char *buf, const uint8_t *hex_id, unsigned size)
+{
+   static const char hex_digits[] = "0123456789abcdef";
+   unsigned i;
+
+   for (i = 0; i < size; i += 2) {
+      buf[i] = hex_digits[hex_id[i >> 1] >> 4];
+      buf[i + 1] = hex_digits[hex_id[i >> 1] & 0x0f];
+   }
+   buf[i] = '\0';
+
+   return buf;
+}
+
 static inline bool
 disk_cache_get_function_timestamp(void *ptr, uint32_t* timestamp)
 {