[gegl] gegl: add logic to selectively load modules based on SIMD suffix
- From: Øyvind "pippin" Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] gegl: add logic to selectively load modules based on SIMD suffix
- Date: Sun, 16 Jan 2022 07:01:59 +0000 (UTC)
commit 21681f22c52f7d46f34d0f24b99b2e3c8aac155e
Author: Øyvind Kolås <pippin gimp org>
Date: Sun Jan 16 04:25:33 2022 +0100
gegl: add logic to selectively load modules based on SIMD suffix
gegl/module/geglmoduledb.c | 136 +++++++++++++++++++++++++++++++++++++++++----
gegl/module/geglmoduledb.h | 1 +
2 files changed, 127 insertions(+), 10 deletions(-)
---
diff --git a/gegl/module/geglmoduledb.c b/gegl/module/geglmoduledb.c
index f9b654552..c3b628035 100644
--- a/gegl/module/geglmoduledb.c
+++ b/gegl/module/geglmoduledb.c
@@ -22,6 +22,7 @@
#include "geglmodule.h"
#include "geglmoduledb.h"
#include "gegldatafiles.h"
+#include "gegl-cpuaccel.h"
#include "gegl-config.h"
enum
@@ -40,6 +41,8 @@ static void gegl_module_db_finalize (GObject *object);
static void gegl_module_db_module_initialize (const GeglDatafileData *file_data,
gpointer user_data);
+static void gegl_module_db_module_search (const GeglDatafileData *file_data,
+ gpointer user_data);
static GeglModule * gegl_module_db_module_find_by_path (GeglModuleDB *db,
const char *fullpath);
@@ -225,6 +228,89 @@ gegl_module_db_get_load_inhibit (GeglModuleDB *db)
return db->load_inhibit;
}
+#ifdef ARCH_X86_64
+
+static gboolean
+gegl_str_has_one_of_suffixes (const char *str,
+ char **suffixes)
+{
+ for (int i = 0; suffixes[i]; i++)
+ {
+ if (g_str_has_suffix (str, suffixes[i]))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void
+gegl_module_db_remove_duplicates (GeglModuleDB *db)
+{
+#ifdef __APPLE__ /* G_MODULE_SUFFIX is defined to .so instead of .dylib */
+ char *suffix_list[] = {"-x86_64-v2.dylib","-x86_64-v3.dylib", NULL};
+#else
+ char *suffix_list[] = {"-x86_64-v2.so","-x86_64-v3.so", NULL};
+#endif
+
+ GList *suffix_entries = NULL;
+ int preferred = -1;
+ GeglCpuAccelFlags cpu_accel = gegl_cpu_accel_get_support ();
+ if (cpu_accel & GEGL_CPU_ACCEL_X86_64_V3) preferred = 1;
+ else if (cpu_accel & GEGL_CPU_ACCEL_X86_64_V2) preferred = 0;
+
+
+ for (GList *l = db->to_load; l; l = l->next)
+ {
+ char *filename = l->data;
+ if (gegl_str_has_one_of_suffixes (filename, suffix_list))
+ {
+ suffix_entries = g_list_prepend (suffix_entries, filename);
+ }
+ }
+
+ for (GList *l = suffix_entries; l; l = l->next)
+ {
+ db->to_load = g_list_remove (db->to_load, l->data);
+ }
+
+ if (preferred>-1)
+ {
+
+ for (GList *l = suffix_entries; l; l = l->next)
+ {
+ char *filename = l->data;
+ if (g_str_has_suffix (filename, suffix_list[preferred]))
+ {
+ char *expected = g_strdup (filename);
+ char *e = strrchr (expected, '.');
+ char *p = e;
+ while (p && p>expected && *p != 'x' ) p--;
+ if (p && *p == 'x' && p[-1] == '-'){
+ p--;
+ strcpy (p, e);
+ }
+ for (GList *l2 = db->to_load; l2; l2=l2->next)
+ {
+ char *filename2 = l2->data;
+ if (!strcmp (filename2, expected))
+ {
+ g_free (l2->data);
+ l2->data = g_strdup (filename);
+ }
+ }
+ g_free (expected);
+ }
+ }
+
+ }
+
+ while (suffix_entries)
+ {
+ g_free (suffix_entries->data);
+ suffix_entries = g_list_remove (suffix_entries, suffix_entries->data);
+ }
+}
+#endif
+
/**
* gegl_module_db_load:
* @db: A #GeglModuleDB.
@@ -243,10 +329,37 @@ gegl_module_db_load (GeglModuleDB *db,
g_return_if_fail (module_path != NULL);
if (g_module_supported ())
+ {
+ GeglModule *module;
+ gboolean load_inhibit;
+
gegl_datafiles_read_directories (module_path,
G_FILE_TEST_EXISTS,
- gegl_module_db_module_initialize,
+ gegl_module_db_module_search,
db);
+#if ARCH_X86_64
+ gegl_module_db_remove_duplicates (db);
+#endif
+ while (db->to_load)
+ {
+ char *filename = db->to_load->data;
+ load_inhibit = is_in_inhibit_list (filename,
+ db->load_inhibit);
+
+ module = gegl_module_new (filename,
+ load_inhibit,
+ db->verbose);
+
+ g_signal_connect (module, "modified",
+ G_CALLBACK (gegl_module_db_module_modified),
+ db);
+
+ db->modules = g_list_append (db->modules, module);
+ g_signal_emit (db, db_signals[ADD], 0, module);
+ db->to_load = g_list_remove (db->to_load, filename);
+ g_free (filename);
+ }
+ }
#ifdef DUMP_DB
g_list_foreach (db->modules, gegl_module_db_dump_module, NULL);
@@ -270,6 +383,7 @@ void
gegl_module_db_refresh (GeglModuleDB *db,
const gchar *module_path)
{
+#if 0
GList *kill_list = NULL;
g_return_if_fail (GEGL_IS_MODULE_DB (db));
@@ -289,6 +403,7 @@ gegl_module_db_refresh (GeglModuleDB *db,
G_FILE_TEST_EXISTS,
gegl_module_db_module_initialize,
db);
+#endif
}
/* name must be of the form lib*.so (Unix) or *.dll (Win32) */
@@ -308,10 +423,9 @@ valid_module_name (const gchar *filename)
}
}
#ifdef __APPLE__ /* G_MODULE_SUFFIX is defined to .so instead of .dylib */
- if (! gegl_datafiles_check_extension (basename, ".dylib" ) ||
- strstr (filename, ".dSYM"))
+ if (! g_str_has_suffix (basename, ".dylib" ) || strstr (filename, ".dSYM"))
#else
- if (! gegl_datafiles_check_extension (basename, "." G_MODULE_SUFFIX))
+ if (! g_str_has_suffix (basename, "." G_MODULE_SUFFIX))
#endif
{
g_free (basename);
@@ -324,9 +438,11 @@ valid_module_name (const gchar *filename)
return TRUE;
}
+
+
static void
-gegl_module_db_module_initialize (const GeglDatafileData *file_data,
- gpointer user_data)
+gegl_module_db_module_search (const GeglDatafileData *file_data,
+ gpointer user_data)
{
GeglModuleDB *db = GEGL_MODULE_DB (user_data);
GeglModule *module;
@@ -335,12 +451,11 @@ gegl_module_db_module_initialize (const GeglDatafileData *file_data,
if (! valid_module_name (file_data->filename))
return;
- /* don't load if we already know about it */
- if (gegl_module_db_module_find_by_path (db, file_data->filename))
- return;
-
+ db->to_load = g_list_prepend (db->to_load, g_strdup (file_data->filename));
+#if 0
load_inhibit = is_in_inhibit_list (file_data->filename,
db->load_inhibit);
+ g_warning ("[%s]", file_data->filename);
module = gegl_module_new (file_data->filename,
load_inhibit,
@@ -352,6 +467,7 @@ gegl_module_db_module_initialize (const GeglDatafileData *file_data,
db->modules = g_list_append (db->modules, module);
g_signal_emit (db, db_signals[ADD], 0, module);
+#endif
}
static GeglModule *
diff --git a/gegl/module/geglmoduledb.h b/gegl/module/geglmoduledb.h
index 893bc2995..dff25dd34 100644
--- a/gegl/module/geglmoduledb.h
+++ b/gegl/module/geglmoduledb.h
@@ -37,6 +37,7 @@ struct _GeglModuleDB
/*< private >*/
GList *modules;
+ GList *to_load;
gchar *load_inhibit;
gboolean verbose;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]