[PATCH v3 vkd3d 4/8] vkd3d: Try to guess application name.
Józef Kucia
joseph.kucia at gmail.com
Mon Jun 17 08:43:28 CDT 2019
From: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
Version 3: Free memory returned by realpath().
---
libs/vkd3d/device.c | 7 ++++++
libs/vkd3d/utils.c | 44 ++++++++++++++++++++++++++++++++++++++
libs/vkd3d/vkd3d_private.h | 2 ++
3 files changed, 53 insertions(+)
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index 1b651f144233..c93e6785ed01 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -466,6 +466,7 @@ static HRESULT vkd3d_instance_init(struct vkd3d_instance *instance,
bool *user_extension_supported = NULL;
VkApplicationInfo application_info;
VkInstanceCreateInfo instance_info;
+ char application_name[PATH_MAX];
uint32_t extension_count;
const char **extensions;
VkInstance vk_instance;
@@ -529,6 +530,12 @@ static HRESULT vkd3d_instance_init(struct vkd3d_instance *instance,
application_info.engineVersion = vkd3d_application_info->engine_version;
}
}
+ else if (vkd3d_get_program_name(application_name))
+ {
+ application_info.pApplicationName = application_name;
+ }
+
+ TRACE("Application: %s.\n", debugstr_a(application_info.pApplicationName));
if (!(extensions = vkd3d_calloc(extension_count, sizeof(*extensions))))
{
diff --git a/libs/vkd3d/utils.c b/libs/vkd3d/utils.c
index 4483a8d456f7..245f297587ae 100644
--- a/libs/vkd3d/utils.c
+++ b/libs/vkd3d/utils.c
@@ -602,6 +602,50 @@ HRESULT vkd3d_load_vk_device_procs(struct vkd3d_vk_device_procs *procs,
return S_OK;
}
+#ifdef _GNU_SOURCE
+
+bool vkd3d_get_program_name(char program_name[PATH_MAX])
+{
+ char *name, *p, *real_path = NULL;
+
+ if ((name = strrchr(program_invocation_name, '/')))
+ {
+ real_path = realpath("/proc/self/exe", NULL);
+
+ /* Try to strip command line arguments. */
+ if (real_path && (p = strrchr(real_path, '/'))
+ && !strncmp(real_path, program_invocation_name, strlen(real_path)))
+ {
+ name = p;
+ }
+
+ ++name;
+ }
+ else if ((name = strrchr(program_invocation_name, '\\')))
+ {
+ ++name;
+ }
+ else
+ {
+ name = program_invocation_name;
+ }
+
+ strncpy(program_name, name, PATH_MAX);
+ program_name[PATH_MAX - 1] = '\0';
+ free(real_path);
+ return true;
+}
+
+#else
+
+bool vkd3d_get_program_name(char program_name[PATH_MAX])
+{
+ *program_name = '\0';
+ return false;
+}
+
+#endif /* _GNU_SOURCE */
+
static struct vkd3d_private_data *vkd3d_private_store_get_private_data(
const struct vkd3d_private_store *store, const GUID *tag)
{
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index 3af8a9594a5e..e22549d5055d 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -1200,6 +1200,8 @@ HRESULT vkd3d_load_vk_device_procs(struct vkd3d_vk_device_procs *procs,
extern const char vkd3d_build[];
+bool vkd3d_get_program_name(char program_name[PATH_MAX]) DECLSPEC_HIDDEN;
+
static inline void vkd3d_set_thread_name(const char *name)
{
#if defined(HAVE_PTHREAD_SETNAME_NP_2)
--
2.21.0
More information about the wine-devel
mailing list