Mesa (main): util/disk_cache: Implement disk_cache_get_function_identifier for Windows

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Jun 27 16:50:32 UTC 2022


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

Author: Jesse Natalie <jenatali at microsoft.com>
Date:   Thu Jun 23 07:31:10 2022 -0700

util/disk_cache: Implement disk_cache_get_function_identifier for Windows

Reviewed-by: Boris Brezillon <boris.brezillon at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17208>

---

 src/util/disk_cache.h    |  4 ++++
 src/util/disk_cache_os.c | 47 +++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 47 insertions(+), 4 deletions(-)

diff --git a/src/util/disk_cache.h b/src/util/disk_cache.h
index 978e1dee5ef..e76e1362784 100644
--- a/src/util/disk_cache.h
+++ b/src/util/disk_cache.h
@@ -34,6 +34,7 @@
 #include <stdbool.h>
 #include <sys/stat.h>
 #include "util/mesa-sha1.h"
+#include "util/detect_os.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -133,6 +134,9 @@ disk_cache_get_function_identifier(void *ptr, struct mesa_sha1 *ctx)
       return false;
    return true;
 }
+#elif DETECT_OS_WINDOWS
+bool
+disk_cache_get_function_identifier(void *ptr, struct mesa_sha1 *ctx);
 #else
 static inline bool
 disk_cache_get_function_identifier(void *ptr, struct mesa_sha1 *ctx)
diff --git a/src/util/disk_cache_os.c b/src/util/disk_cache_os.c
index c28853d8d9e..a1d60321511 100644
--- a/src/util/disk_cache_os.c
+++ b/src/util/disk_cache_os.c
@@ -21,7 +21,6 @@
  * IN THE SOFTWARE.
  */
 
-#ifdef ENABLE_SHADER_CACHE
 
 #include <assert.h>
 #include <inttypes.h>
@@ -30,17 +29,59 @@
 #include <stdlib.h>
 #include <sys/types.h>
 #include <sys/stat.h>
-#include <dirent.h>
 #include <fcntl.h>
 
 #include "util/compress.h"
 #include "util/crc32.h"
+#include "util/disk_cache.h"
+#include "util/disk_cache_os.h"
 
 struct cache_entry_file_data {
    uint32_t crc32;
    uint32_t uncompressed_size;
 };
 
+#if DETECT_OS_WINDOWS
+
+bool
+disk_cache_get_function_identifier(void *ptr, struct mesa_sha1 *ctx)
+{
+   HMODULE mod = NULL;
+   GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
+                      (LPCWSTR)ptr,
+                      &mod);
+   if (!mod)
+      return false;
+
+   WCHAR filename[MAX_PATH];
+   DWORD filename_length = GetModuleFileNameW(mod, filename, ARRAY_SIZE(filename));
+
+   if (filename_length == 0 || filename_length == ARRAY_SIZE(filename))
+      return false;
+
+   HANDLE mod_as_file = CreateFileW(
+        filename,
+        GENERIC_READ,
+        FILE_SHARE_READ,
+        NULL,
+        OPEN_EXISTING,
+        FILE_ATTRIBUTE_NORMAL,
+        NULL);
+   if (mod_as_file == INVALID_HANDLE_VALUE)
+      return false;
+
+   FILETIME time;
+   bool ret = GetFileTime(mod_as_file, NULL, NULL, &time);
+   if (ret)
+      _mesa_sha1_update(ctx, &time, sizeof(time));
+   CloseHandle(mod_as_file);
+   return ret;
+}
+
+#endif
+
+#ifdef ENABLE_SHADER_CACHE
+
 #if DETECT_OS_WINDOWS
 /* TODO: implement disk cache support on windows */
 
@@ -60,8 +101,6 @@ struct cache_entry_file_data {
 #include "util/blob.h"
 #include "util/crc32.h"
 #include "util/debug.h"
-#include "util/disk_cache.h"
-#include "util/disk_cache_os.h"
 #include "util/ralloc.h"
 #include "util/rand_xor.h"
 



More information about the mesa-commit mailing list