diff --git a/include/vkd3d.h b/include/vkd3d.h
index 7c5f6441e9d946d03462c55d47179e850a0f7ef4..d089ada56b7234da1f854fd85abf895e82a32b79 100644
--- a/include/vkd3d.h
+++ b/include/vkd3d.h
@@ -28,8 +28,6 @@
 # include <vulkan/vulkan.h>
 #endif  /* VKD3D_NO_VULKAN_H */
 
-#include <stdbool.h>
-
 #ifdef __cplusplus
 extern "C" {
 #endif  /* __cplusplus */
@@ -45,12 +43,12 @@ enum vkd3d_structure_type
     VKD3D_FORCE_32_BIT_ENUM(VKD3D_STRUCTURE_TYPE),
 };
 
-typedef bool (*PFN_vkd3d_signal_event)(HANDLE event);
+typedef HRESULT (*PFN_vkd3d_signal_event)(HANDLE event);
 
 typedef void * (*PFN_vkd3d_thread)(void *data);
 
 typedef void * (*PFN_vkd3d_create_thread)(PFN_vkd3d_thread thread_main, void *data);
-typedef bool (*PFN_vkd3d_join_thread)(void *thread);
+typedef HRESULT (*PFN_vkd3d_join_thread)(void *thread);
 
 struct vkd3d_instance;
 
diff --git a/include/vkd3d_utils.h b/include/vkd3d_utils.h
index 06b01fc9bf80f63d4476cd02616c02665af82d5a..676d3330ed5e223d51ee31121b27181d219d9387 100644
--- a/include/vkd3d_utils.h
+++ b/include/vkd3d_utils.h
@@ -31,7 +31,7 @@ extern "C" {
 #define INFINITE (~0u)
 
 HANDLE vkd3d_create_event(void);
-bool vkd3d_signal_event(HANDLE event);
+HRESULT vkd3d_signal_event(HANDLE event);
 unsigned int vkd3d_wait_event(HANDLE event, unsigned int milliseconds);
 void vkd3d_destroy_event(HANDLE event);
 
diff --git a/libs/vkd3d-utils/vkd3d_utils_main.c b/libs/vkd3d-utils/vkd3d_utils_main.c
index adafb00bddc84af40401183b5d03d6d8317b137a..3c0d13971b6c355e8cc097fb380010764da99b06 100644
--- a/libs/vkd3d-utils/vkd3d_utils_main.c
+++ b/libs/vkd3d-utils/vkd3d_utils_main.c
@@ -159,7 +159,7 @@ unsigned int vkd3d_wait_event(HANDLE event, unsigned int milliseconds)
     return WAIT_FAILED;
 }
 
-bool vkd3d_signal_event(HANDLE event)
+HRESULT vkd3d_signal_event(HANDLE event)
 {
     struct vkd3d_event *impl = event;
     int rc;
@@ -169,13 +169,13 @@ bool vkd3d_signal_event(HANDLE event)
     if ((rc = pthread_mutex_lock(&impl->mutex)))
     {
         ERR("Failed to lock mutex, error %d.\n", rc);
-        return false;
+        return E_FAIL;
     }
     impl->is_signaled = true;
     pthread_cond_signal(&impl->cond);
     pthread_mutex_unlock(&impl->mutex);
 
-    return true;
+    return S_OK;
 }
 
 void vkd3d_destroy_event(HANDLE event)
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index 39094c24e91314cd14a90913efd7bb0ffb49689a..d9ad8f3460b8bc6838084b8b5342fdfc01d5fdfd 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -288,6 +288,7 @@ HRESULT vkd3d_fence_worker_start(struct vkd3d_fence_worker *worker,
 HRESULT vkd3d_fence_worker_stop(struct vkd3d_fence_worker *worker,
         struct d3d12_device *device)
 {
+    HRESULT hr;
     int rc;
 
     TRACE("worker %p.\n", worker);
@@ -305,9 +306,9 @@ HRESULT vkd3d_fence_worker_stop(struct vkd3d_fence_worker *worker,
 
     if (device->join_thread)
     {
-        if (!device->join_thread(worker->u.handle))
+        if (FAILED(hr = device->join_thread(worker->u.handle)))
         {
-            ERR("Failed to join fence worker thread.\n");
+            ERR("Failed to join fence worker thread, hr %#x.\n", hr);
             return E_FAIL;
         }
     }
diff --git a/programs/vkd3d-compiler/main.c b/programs/vkd3d-compiler/main.c
index 89778b8838bf5bd20b6d8b7c2701c6c0d2db4e2b..2e6566882a661d0f5a23bb0a819fb337e4b3b95d 100644
--- a/programs/vkd3d-compiler/main.c
+++ b/programs/vkd3d-compiler/main.c
@@ -17,6 +17,7 @@
  */
 
 #include <fcntl.h>
+#include <stdbool.h>
 #include <stdio.h>
 #include <sys/stat.h>
 #include <unistd.h>
diff --git a/tests/vkd3d_api.c b/tests/vkd3d_api.c
index 439cb6364eb81b2442596515d0fea1fca75c3e42..e2d9d014125aaa93569890e7cb56db06303cfaad 100644
--- a/tests/vkd3d_api.c
+++ b/tests/vkd3d_api.c
@@ -54,10 +54,10 @@ static ULONG resource_get_internal_refcount(ID3D12Resource *resource)
     return vkd3d_resource_decref(resource);
 }
 
-static bool signal_event(HANDLE event)
+static HRESULT signal_event(HANDLE event)
 {
     trace("Signal event %p.\n", event);
-    return true;
+    return S_OK;
 }
 
 static const struct vkd3d_instance_create_info instance_default_create_info =