From: Brendan Shanks bshanks@codeweavers.com
--- libs/vkd3d/device.c | 46 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index 4018a5c1..0058c6b7 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -4479,9 +4479,53 @@ HRESULT vkd3d_join_thread(struct vkd3d_instance *instance, union vkd3d_thread_ha return hr; }
+#ifdef _WIN32 +static BOOL SetThreadDescription_resolved = FALSE; +static HMODULE kernelbase = NULL; +static HRESULT (WINAPI *my_SetThreadDescription)(HANDLE, PCWSTR) = NULL; + +static void resolve_SetThreadDescription(void) +{ + kernelbase = LoadLibraryA("kernelbase.dll"); + if (!kernelbase) + return; + + my_SetThreadDescription = (HRESULT (WINAPI *)(HANDLE, PCWSTR)) GetProcAddress(kernelbase, "SetThreadDescription"); + if (!my_SetThreadDescription) + { + FreeLibrary(kernelbase); + kernelbase = NULL; + } +} +#endif + void vkd3d_set_thread_name(const char *name) { -#if defined(HAVE_PTHREAD_SETNAME_NP_2) +#ifdef _WIN32 + int ret; + WCHAR *nameW; + + if (!SetThreadDescription_resolved) + { + SetThreadDescription_resolved = TRUE; + resolve_SetThreadDescription(); + } + + if (!my_SetThreadDescription) + return; + + ret = MultiByteToWideChar(CP_UTF8, 0, name, -1, NULL, 0); + + nameW = vkd3d_malloc(ret * sizeof(WCHAR)); + if (!nameW) + return; + + ret = MultiByteToWideChar(CP_UTF8, 0, name, -1, nameW, ret); + if (ret) + my_SetThreadDescription(GetCurrentThread(), nameW); + + vkd3d_free(nameW); +#elif defined(HAVE_PTHREAD_SETNAME_NP_2) pthread_setname_np(pthread_self(), name); #elif defined(HAVE_PTHREAD_SETNAME_NP_1) pthread_setname_np(name);