util/disk_cache: Implement disk_cache_get_function_identifier for Windows
authorJesse Natalie <jenatali@microsoft.com>
Thu, 23 Jun 2022 14:31:10 +0000 (07:31 -0700)
committerMarge Bot <emma+marge@anholt.net>
Mon, 27 Jun 2022 16:18:32 +0000 (16:18 +0000)
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17208>

src/util/disk_cache.h
src/util/disk_cache_os.c

index 978e1de..e76e136 100644 (file)
@@ -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)
index c28853d..a1d6032 100644 (file)
@@ -21,7 +21,6 @@
  * IN THE SOFTWARE.
  */
 
-#ifdef ENABLE_SHADER_CACHE
 
 #include <assert.h>
 #include <inttypes.h>
 #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;
@@ -42,6 +42,47 @@ struct cache_entry_file_data {
 };
 
 #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 */
 
 #else
@@ -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"