From: Józef Kucia jkucia@codeweavers.com
In the long term, we may need more complex format support filtering.
Signed-off-by: Józef Kucia jkucia@codeweavers.com ---
After this change all tests passes with recent Nvidia drivers.
--- libs/vkd3d/device.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index 5cf2ecfe8bdc..d84c5796a91b 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -1230,6 +1230,30 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateCommandList(ID3D12Device *if &IID_ID3D12GraphicsCommandList, riid, command_list); }
+/* Direct3D feature levels restrict which formats can be optionally supported. */ +static void vkd3d_restrict_format_support_for_feature_level( + D3D12_FEATURE_DATA_FORMAT_SUPPORT *format_support, const struct vkd3d_format *format) +{ + static const D3D12_FEATURE_DATA_FORMAT_SUPPORT blacklisted_format_features[] = + { + {DXGI_FORMAT_B8G8R8A8_TYPELESS, D3D12_FORMAT_SUPPORT1_TYPED_UNORDERED_ACCESS_VIEW, + D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD | D3D12_FORMAT_SUPPORT2_UAV_TYPED_STORE}, + {DXGI_FORMAT_B8G8R8A8_UNORM, D3D12_FORMAT_SUPPORT1_TYPED_UNORDERED_ACCESS_VIEW, + D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD | D3D12_FORMAT_SUPPORT2_UAV_TYPED_STORE}, + }; + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(blacklisted_format_features); ++i) + { + if (blacklisted_format_features[i].Format == format->dxgi_format) + { + format_support->Support1 &= ~blacklisted_format_features[i].Support1; + format_support->Support2 &= ~blacklisted_format_features[i].Support2; + break; + } + } +} + static HRESULT STDMETHODCALLTYPE d3d12_device_CheckFeatureSupport(ID3D12Device *iface, D3D12_FEATURE feature, void *feature_data, UINT feature_data_size) { @@ -1378,6 +1402,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CheckFeatureSupport(ID3D12Device * | D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_SIGNED_MIN_OR_MAX | D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_UNSIGNED_MIN_OR_MAX;
+ vkd3d_restrict_format_support_for_feature_level(data, format); + return S_OK; }
From: Józef Kucia jkucia@codeweavers.com
Signed-off-by: Józef Kucia jkucia@codeweavers.com ---
* We need a way to get the current Vulkan instance from a vkd3d instance object. * It makes more sense to get the current Vulkan instance from an instance object than from a device object.
--- demos/demo_xcb.h | 2 +- include/vkd3d.h | 3 ++- libs/vkd3d/device.c | 14 +++++++++----- libs/vkd3d/vkd3d.map | 1 + 4 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/demos/demo_xcb.h b/demos/demo_xcb.h index a683dcae1951..ca0887c366f4 100644 --- a/demos/demo_xcb.h +++ b/demos/demo_xcb.h @@ -344,7 +344,7 @@ static inline struct demo_swapchain *demo_swapchain_create(ID3D12CommandQueue *c if (FAILED(ID3D12CommandQueue_GetDevice(command_queue, &IID_ID3D12Device, (void **)&d3d12_device))) return NULL;
- vk_instance = vkd3d_get_vk_instance(d3d12_device); + vk_instance = vkd3d_get_vk_instance(vkd3d_instance_from_device(d3d12_device)); vk_physical_device = vkd3d_get_vk_physical_device(d3d12_device); vk_device = vkd3d_get_vk_device(d3d12_device);
diff --git a/include/vkd3d.h b/include/vkd3d.h index 78d5e2e460f5..6017e1accac6 100644 --- a/include/vkd3d.h +++ b/include/vkd3d.h @@ -67,6 +67,7 @@ struct vkd3d_device_create_info
HRESULT vkd3d_create_instance(const struct vkd3d_instance_create_info *create_info, struct vkd3d_instance **instance); +VkInstance vkd3d_get_vk_instance(struct vkd3d_instance *instance); ULONG vkd3d_instance_decref(struct vkd3d_instance *instance); ULONG vkd3d_instance_incref(struct vkd3d_instance *instance);
@@ -75,8 +76,8 @@ HRESULT vkd3d_create_device(const struct vkd3d_device_create_info *create_info, HRESULT vkd3d_create_image_resource(ID3D12Device *device, const D3D12_RESOURCE_DESC *desc, VkImage vk_image, unsigned int resource_flags, ID3D12Resource **resource); VkDevice vkd3d_get_vk_device(ID3D12Device *device); -VkInstance vkd3d_get_vk_instance(ID3D12Device *device); VkPhysicalDevice vkd3d_get_vk_physical_device(ID3D12Device *device); +struct vkd3d_instance *vkd3d_instance_from_device(ID3D12Device *device);
uint32_t vkd3d_get_vk_queue_family_index(ID3D12CommandQueue *queue); VkQueue vkd3d_acquire_vk_queue(ID3D12CommandQueue *queue); diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index d84c5796a91b..3255dd6ec09e 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -289,6 +289,11 @@ ULONG vkd3d_instance_decref(struct vkd3d_instance *instance) return refcount; }
+VkInstance vkd3d_get_vk_instance(struct vkd3d_instance *instance) +{ + return instance->vk_instance; +} + static void vkd3d_trace_physical_device(VkPhysicalDevice device, const struct vkd3d_vk_instance_procs *vk_procs) { @@ -2076,17 +2081,16 @@ VkDevice vkd3d_get_vk_device(ID3D12Device *device) return d3d12_device->vk_device; }
-VkInstance vkd3d_get_vk_instance(ID3D12Device *device) +VkPhysicalDevice vkd3d_get_vk_physical_device(ID3D12Device *device) { struct d3d12_device *d3d12_device = impl_from_ID3D12Device(device); - struct vkd3d_instance *instance = d3d12_device->vkd3d_instance;
- return instance->vk_instance; + return d3d12_device->vk_physical_device; }
-VkPhysicalDevice vkd3d_get_vk_physical_device(ID3D12Device *device) +struct vkd3d_instance *vkd3d_instance_from_device(ID3D12Device *device) { struct d3d12_device *d3d12_device = impl_from_ID3D12Device(device);
- return d3d12_device->vk_physical_device; + return d3d12_device->vkd3d_instance; } diff --git a/libs/vkd3d/vkd3d.map b/libs/vkd3d/vkd3d.map index 6f408410d763..c5157c611e91 100644 --- a/libs/vkd3d/vkd3d.map +++ b/libs/vkd3d/vkd3d.map @@ -12,6 +12,7 @@ global: vkd3d_get_vk_physical_device; vkd3d_get_vk_queue_family_index; vkd3d_instance_decref; + vkd3d_instance_from_device; vkd3d_instance_incref; vkd3d_release_vk_queue; vkd3d_serialize_root_signature;
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
On 17 January 2018 at 15:18, Józef Kucia joseph.kucia@gmail.com wrote:
diff --git a/include/vkd3d.h b/include/vkd3d.h index 78d5e2e460f5..6017e1accac6 100644 --- a/include/vkd3d.h +++ b/include/vkd3d.h @@ -67,6 +67,7 @@ struct vkd3d_device_create_info
HRESULT vkd3d_create_instance(const struct vkd3d_instance_create_info *create_info, struct vkd3d_instance **instance); +VkInstance vkd3d_get_vk_instance(struct vkd3d_instance *instance); ULONG vkd3d_instance_decref(struct vkd3d_instance *instance); ULONG vkd3d_instance_incref(struct vkd3d_instance *instance);
vkd3d_instance_get_vk_instance(), strictly speaking.
From: Józef Kucia jkucia@codeweavers.com
Signed-off-by: Józef Kucia jkucia@codeweavers.com --- Makefile.am | 1 + tests/vkd3d_api.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 1 deletion(-)
diff --git a/Makefile.am b/Makefile.am index a99fa56163f3..f796befb3672 100644 --- a/Makefile.am +++ b/Makefile.am @@ -120,6 +120,7 @@ check_PROGRAMS = $(vkd3d_tests) $(vkd3d_cross_tests) AM_DEFAULT_SOURCE_EXT = .c TESTS = $(vkd3d_tests) $(vkd3d_cross_tests) tests_d3d12_LDADD = $(LDADD) @PTHREAD_LIBS@ +tests_vkd3d_api_LDADD = libvkd3d.la @VULKAN_LIBS@
DEMOS_LDADD = $(LDADD) libvkd3d-shader.la @XCB_LIBS@ @VULKAN_LIBS@ DEMOS_CFLAGS = @XCB_CFLAGS@ diff --git a/tests/vkd3d_api.c b/tests/vkd3d_api.c index 7ca5d264781f..bda0c4ee1798 100644 --- a/tests/vkd3d_api.c +++ b/tests/vkd3d_api.c @@ -94,8 +94,8 @@ static void test_create_instance(void)
static void test_create_device(void) { + struct vkd3d_instance *instance, *tmp_instance; struct vkd3d_device_create_info create_info; - struct vkd3d_instance *instance; ID3D12Device *device; ULONG refcount; HRESULT hr; @@ -125,6 +125,8 @@ static void test_create_device(void) refcount = vkd3d_instance_incref(instance); ok(refcount >= 3, "Got unexpected refcount %u.\n", refcount); vkd3d_instance_decref(instance); + tmp_instance = vkd3d_instance_from_device(device); + ok(tmp_instance == instance, "Got instance %p, expected %p.\n", tmp_instance, instance); refcount = ID3D12Device_Release(device); ok(!refcount, "Device has %u references left.\n", refcount);
@@ -137,6 +139,61 @@ static void test_create_device(void) ok(!refcount, "Instance has %u references left.\n", refcount); }
+static void test_physical_device(void) +{ + struct vkd3d_device_create_info create_info; + VkPhysicalDevice *vk_physical_devices; + VkPhysicalDevice vk_physical_device; + struct vkd3d_instance *instance; + VkInstance vk_instance; + ID3D12Device *device; + uint32_t i, count; + ULONG refcount; + VkResult vr; + HRESULT hr; + + hr = vkd3d_create_instance(&instance_default_create_info, &instance); + ok(hr == S_OK, "Failed to create instance, hr %#x.\n", hr); + vk_instance = vkd3d_get_vk_instance(instance); + ok(vk_instance != VK_NULL_HANDLE, "Failed to get Vulkan instance.\n"); + + create_info = device_default_create_info; + create_info.instance = instance; + create_info.instance_create_info = NULL; + create_info.vk_physical_device = VK_NULL_HANDLE; + hr = vkd3d_create_device(&create_info, &IID_ID3D12Device, (void **)&device); + ok(hr == S_OK, "Failed to create device, hr %#x.\n", hr); + vk_physical_device = vkd3d_get_vk_physical_device(device); + trace("Default Vulkan physical device %p.\n", vk_physical_device); + refcount = ID3D12Device_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); + + vr = vkEnumeratePhysicalDevices(vk_instance, &count, NULL); + ok(vr == VK_SUCCESS, "Got unexpected VkResult %d.\n", vr); + vk_physical_devices = calloc(count, sizeof(*vk_physical_devices)); + ok(vk_physical_devices, "Failed to allocate memory.\n"); + vr = vkEnumeratePhysicalDevices(vk_instance, &count, vk_physical_devices); + ok(vr == VK_SUCCESS, "Got unexpected VkResult %d.\n", vr); + + for (i = 0; i < count; ++i) + { + trace("Creating device for Vulkan physical device %p.\n", vk_physical_devices[i]); + + create_info.vk_physical_device = vk_physical_devices[i]; + hr = vkd3d_create_device(&create_info, &IID_ID3D12Device, (void **)&device); + ok(hr == S_OK, "Failed to create device, hr %#x.\n", hr); + vk_physical_device = vkd3d_get_vk_physical_device(device); + ok(vk_physical_device == vk_physical_devices[i], + "Got unexpected Vulkan physical device %p.\n", vk_physical_device); + refcount = ID3D12Device_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); + } + + free(vk_physical_devices); + refcount = vkd3d_instance_decref(instance); + ok(!refcount, "Instance has %u references left.\n", refcount); +} + static void test_vkd3d_queue(void) { ID3D12CommandQueue *direct_queue, *compute_queue, *copy_queue; @@ -198,5 +255,6 @@ START_TEST(vkd3d_api)
run_test(test_create_instance); run_test(test_create_device); + run_test(test_physical_device); run_test(test_vkd3d_queue); }
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
From: Józef Kucia jkucia@codeweavers.com
Signed-off-by: Józef Kucia jkucia@codeweavers.com --- tests/d3d12.c | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-)
diff --git a/tests/d3d12.c b/tests/d3d12.c index b8b4d95d1df7..58939d24c79d 100644 --- a/tests/d3d12.c +++ b/tests/d3d12.c @@ -330,7 +330,7 @@ static HANDLE create_thread(thread_main_pfn main_pfn, void *user_data)
static bool join_thread(HANDLE thread) { - int ret; + unsigned int ret;
ret = WaitForSingleObject(thread, INFINITE); CloseHandle(thread); @@ -402,8 +402,7 @@ static HRESULT wait_for_fence(ID3D12Fence *fence, UINT64 value)
ret = wait_event(event, INFINITE); destroy_event(event); - - return ret == WAIT_OBJECT_0; + return ret == WAIT_OBJECT_0 ? S_OK : E_FAIL; }
#define wait_queue_idle(a, b) wait_queue_idle_(__LINE__, a, b) @@ -414,12 +413,12 @@ static void wait_queue_idle_(unsigned int line, ID3D12Device *device, ID3D12Comm
hr = ID3D12Device_CreateFence(device, 0, D3D12_FENCE_FLAG_NONE, &IID_ID3D12Fence, (void **)&fence); - ok_(line)(SUCCEEDED(hr), "Failed to create fence, hr %#x.\n", hr); + ok_(line)(hr == S_OK, "Failed to create fence, hr %#x.\n", hr);
hr = ID3D12CommandQueue_Signal(queue, fence, 1); - ok_(line)(SUCCEEDED(hr), "Failed to signal fence, hr %#x.\n", hr); + ok_(line)(hr == S_OK, "Failed to signal fence, hr %#x.\n", hr); hr = wait_for_fence(fence, 1); - ok_(line)(SUCCEEDED(hr), "Failed to wait for fence, hr %#x.\n", hr); + ok_(line)(hr == S_OK, "Failed to wait for fence, hr %#x.\n", hr);
ID3D12Fence_Release(fence); } @@ -3022,7 +3021,7 @@ static void test_cpu_signal_fence(void)
/* Basic tests with single event. */ event1 = create_event(); - ok(!!event1, "Failed to create event.\n"); + ok(event1, "Failed to create event.\n"); ret = wait_event(event1, 0); ok(ret == WAIT_TIMEOUT, "Got unexpected return value %#x.\n", ret);
@@ -3114,7 +3113,7 @@ static void test_cpu_signal_fence(void) ok(value == 0, "Got unexpected value %"PRIu64".\n", value);
event2 = create_event(); - ok(!!event2, "Failed to create event.\n"); + ok(event2, "Failed to create event.\n");
ret = wait_event(event1, 0); ok(ret == WAIT_TIMEOUT, "Got unexpected return value %#x.\n", ret); @@ -3297,7 +3296,7 @@ static void test_gpu_signal_fence(void)
/* Basic tests with single event. */ event1 = create_event(); - ok(!!event1, "Failed to create event.\n"); + ok(event1, "Failed to create event.\n"); ret = wait_event(event1, 0); ok(ret == WAIT_TIMEOUT, "Got unexpected return value %#x.\n", ret);
@@ -3372,7 +3371,7 @@ static void test_gpu_signal_fence(void) ok(value == 0, "Got unexpected value %"PRIu64".\n", value);
event2 = create_event(); - ok(!!event2, "Failed to create event.\n"); + ok(event2, "Failed to create event.\n");
ret = wait_event(event1, 0); ok(ret == WAIT_TIMEOUT, "Got unexpected return value %#x.\n", ret); @@ -3508,12 +3507,12 @@ struct multithread_fence_wait_data static void fence_event_wait_main(void *untyped_data) { struct multithread_fence_wait_data *data = untyped_data; + unsigned int ret; HANDLE event; HRESULT hr; - int ret;
event = create_event(); - ok(!!event, "Failed to create event.\n"); + ok(event, "Failed to create event.\n");
hr = ID3D12Fence_SetEventOnCompletion(data->fence, data->value, event); ok(SUCCEEDED(hr), "Failed to set event on completion, hr %#x.\n", hr); @@ -3563,7 +3562,7 @@ static void test_multithread_fence_wait(void)
thread_data.event = create_event(); thread_data.value = 0; - ok(!!thread_data.event, "Failed to create event.\n"); + ok(thread_data.event, "Failed to create event.\n"); hr = ID3D12Device_CreateFence(device, thread_data.value, D3D12_FENCE_FLAG_NONE, &IID_ID3D12Fence, (void **)&thread_data.fence); ok(SUCCEEDED(hr), "Failed to create fence, hr %#x.\n", hr); @@ -3571,7 +3570,7 @@ static void test_multithread_fence_wait(void) /* Signal fence on host. */ ++thread_data.value; thread = create_thread(fence_event_wait_main, &thread_data); - ok(!!thread, "Failed to create thread.\n"); + ok(thread, "Failed to create thread.\n"); ret = wait_event(thread_data.event, INFINITE); ok(ret == WAIT_OBJECT_0, "Failed to wait for thread start, return value %#x.\n", ret);
@@ -3582,7 +3581,7 @@ static void test_multithread_fence_wait(void)
++thread_data.value; thread = create_thread(fence_busy_wait_main, &thread_data); - ok(!!thread, "Failed to create thread.\n"); + ok(thread, "Failed to create thread.\n"); ret = wait_event(thread_data.event, INFINITE); ok(ret == WAIT_OBJECT_0, "Failed to wait for thread start, return value %#x.\n", ret);
@@ -3594,7 +3593,7 @@ static void test_multithread_fence_wait(void) /* Signal fence on device. */ ++thread_data.value; thread = create_thread(fence_event_wait_main, &thread_data); - ok(!!thread, "Failed to create thread.\n"); + ok(thread, "Failed to create thread.\n"); ret = wait_event(thread_data.event, INFINITE); ok(ret == WAIT_OBJECT_0, "Failed to wait for thread start, return value %#x.\n", ret);
@@ -3605,7 +3604,7 @@ static void test_multithread_fence_wait(void)
++thread_data.value; thread = create_thread(fence_busy_wait_main, &thread_data); - ok(!!thread, "Failed to create thread.\n"); + ok(thread, "Failed to create thread.\n"); ret = wait_event(thread_data.event, INFINITE); ok(ret == WAIT_OBJECT_0, "Failed to wait for thread start, return value %#x.\n", ret);
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
From: Józef Kucia jkucia@codeweavers.com
include/private/vkd3d_test.h:276:22: warning: format string is not a string literal (potentially insecure) [-Wformat-security] vkd3d_test_debug(name);
Signed-off-by: Józef Kucia jkucia@codeweavers.com --- include/private/vkd3d_test.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/private/vkd3d_test.h b/include/private/vkd3d_test.h index 888436ab3e8b..8e657ac02c49 100644 --- a/include/private/vkd3d_test.h +++ b/include/private/vkd3d_test.h @@ -273,7 +273,7 @@ typedef void (*vkd3d_test_pfn)(void);
static inline void vkd3d_run_test(const char *name, vkd3d_test_pfn test_pfn) { - vkd3d_test_debug(name); + vkd3d_test_debug("%s", name); test_pfn(); }
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
From: Józef Kucia jkucia@codeweavers.com
Signed-off-by: Józef Kucia jkucia@codeweavers.com ---
In Wine, we want Wine Vulkan driver to load libvulkan for us, mainly so we can use VK_KHR_win32_surface.
VK_KHR_win32_surface has the following advantages: * child windows rendering has to be handled only in Wine Vulkan driver, * platform specific Vulkan WSI extensions are handled only in Wine Vulkan drivers.
--- include/vkd3d.h | 9 ++++++++ libs/vkd3d-utils/vkd3d_utils_main.c | 1 + libs/vkd3d/device.c | 46 +++++++++++++++++++++++++++++-------- libs/vkd3d/utils.c | 4 ++-- libs/vkd3d/vkd3d_private.h | 4 ++-- libs/vkd3d/vulkan_procs.h | 2 +- 6 files changed, 52 insertions(+), 14 deletions(-)
diff --git a/include/vkd3d.h b/include/vkd3d.h index 6017e1accac6..5ae7603013e0 100644 --- a/include/vkd3d.h +++ b/include/vkd3d.h @@ -43,12 +43,21 @@ typedef bool (*vkd3d_join_thread_pfn)(void *thread);
struct vkd3d_instance;
+struct vkd3d_vulkan_procs_info +{ + PFN_vkCreateInstance vkCreateInstance; + PFN_vkDestroyInstance vkDestroyInstance; + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr; + PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; +}; + struct vkd3d_instance_create_info { vkd3d_signal_event_pfn signal_event_pfn; vkd3d_create_thread_pfn create_thread_pfn; vkd3d_join_thread_pfn join_thread_pfn; size_t wchar_size; + const struct vkd3d_vulkan_procs_info *vulkan_procs_info; };
struct vkd3d_device_create_info diff --git a/libs/vkd3d-utils/vkd3d_utils_main.c b/libs/vkd3d-utils/vkd3d_utils_main.c index 9fe61a1bb4da..2ea0a16beefa 100644 --- a/libs/vkd3d-utils/vkd3d_utils_main.c +++ b/libs/vkd3d-utils/vkd3d_utils_main.c @@ -41,6 +41,7 @@ HRESULT WINAPI D3D12CreateDevice(IUnknown *adapter, instance_create_info.create_thread_pfn = NULL; instance_create_info.join_thread_pfn = NULL; instance_create_info.wchar_size = sizeof(WCHAR); + instance_create_info.vulkan_procs_info = NULL;
device_create_info.minimum_feature_level = minimum_feature_level; device_create_info.instance = NULL; diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index 3255dd6ec09e..62271dbb11a9 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -136,13 +136,15 @@ static unsigned int vkd3d_enable_extensions(const char *extensions[], return i; }
-static void vkd3d_init_instance_caps(struct vkd3d_vulkan_info *vulkan_info) +static void vkd3d_init_instance_caps(struct vkd3d_instance *instance) { + const struct vkd3d_vulkan_procs_info *vk_procs = &instance->vk_global_procs; + struct vkd3d_vulkan_info *vulkan_info = &instance->vk_info; VkExtensionProperties *vk_extensions; uint32_t count; VkResult vr;
- if ((vr = vkEnumerateInstanceExtensionProperties(NULL, &count, NULL)) < 0) + if ((vr = vk_procs->vkEnumerateInstanceExtensionProperties(NULL, &count, NULL)) < 0) { ERR("Failed to enumerate instance extensions, vr %d.\n", vr); return; @@ -154,7 +156,7 @@ static void vkd3d_init_instance_caps(struct vkd3d_vulkan_info *vulkan_info) return;
TRACE("Enumerating %u instance extensions.\n", count); - if ((vr = vkEnumerateInstanceExtensionProperties(NULL, &count, vk_extensions)) < 0) + if ((vr = vk_procs->vkEnumerateInstanceExtensionProperties(NULL, &count, vk_extensions)) < 0) { ERR("Failed to enumerate instance extensions, vr %d.\n", vr); vkd3d_free(vk_extensions); @@ -169,9 +171,28 @@ static void vkd3d_init_instance_caps(struct vkd3d_vulkan_info *vulkan_info) vkd3d_free(vk_extensions); }
+static bool vkd3d_init_vk_global_procs(struct vkd3d_instance *instance, + const struct vkd3d_vulkan_procs_info *vulkan_procs_info) +{ + struct vkd3d_vulkan_procs_info *procs = &instance->vk_global_procs; + + if (vulkan_procs_info) + { + *procs = *vulkan_procs_info; + return true; + } + + procs->vkCreateInstance = vkCreateInstance; + procs->vkDestroyInstance = vkDestroyInstance; + procs->vkGetInstanceProcAddr = vkGetInstanceProcAddr; + procs->vkEnumerateInstanceExtensionProperties = vkEnumerateInstanceExtensionProperties; + return true; +} + static HRESULT vkd3d_instance_init(struct vkd3d_instance *instance, const struct vkd3d_instance_create_info *create_info) { + const struct vkd3d_vulkan_procs_info *vk_global_procs = &instance->vk_global_procs; const char *extensions[MAX_INSTANCE_EXTENSION_COUNT]; VkApplicationInfo application_info; VkInstanceCreateInfo instance_info; @@ -195,8 +216,14 @@ static HRESULT vkd3d_instance_init(struct vkd3d_instance *instance, instance->join_thread = create_info->join_thread_pfn; instance->wchar_size = create_info->wchar_size;
+ if (!vkd3d_init_vk_global_procs(instance, create_info->vulkan_procs_info)) + { + ERR("Failed to initialize Vulkan global procs.\n"); + return E_FAIL; + } + memset(&instance->vk_info, 0, sizeof(instance->vk_info)); - vkd3d_init_instance_caps(&instance->vk_info); + vkd3d_init_instance_caps(instance);
application_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; application_info.pNext = NULL; @@ -218,16 +245,16 @@ static HRESULT vkd3d_instance_init(struct vkd3d_instance *instance, &instance->vk_info); instance_info.ppEnabledExtensionNames = extensions;
- if ((vr = vkCreateInstance(&instance_info, NULL, &vk_instance))) + if ((vr = vk_global_procs->vkCreateInstance(&instance_info, NULL, &vk_instance))) { ERR("Failed to create Vulkan instance, vr %d.\n", vr); return hresult_from_vk_result(vr); }
- if (FAILED(hr = vkd3d_load_vk_instance_procs(&instance->vk_procs, vk_instance))) + if (FAILED(hr = vkd3d_load_vk_instance_procs(&instance->vk_procs, vk_global_procs, vk_instance))) { ERR("Failed to load instance procs, hr %#x.\n", hr); - vkDestroyInstance(vk_instance, NULL); + vk_global_procs->vkDestroyInstance(vk_instance, NULL); return hr; }
@@ -872,7 +899,8 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device, VkPhysicalDev if (FAILED(hr = vkd3d_load_vk_device_procs(&device->vk_procs, vk_procs, vk_device))) { ERR("Failed to load device procs, hr %#x.\n", hr); - vkDestroyDevice(vk_device, NULL); + if (device->vk_procs.vkDestroyDevice) + device->vk_procs.vkDestroyDevice(vk_device, NULL); return hr; }
@@ -884,7 +912,7 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device, VkPhysicalDev copy_queue_family_index, copy_queue_timestamp_bits))) { ERR("Failed to create queues, hr %#x.\n", hr); - vkDestroyDevice(vk_device, NULL); + device->vk_procs.vkDestroyDevice(vk_device, NULL); return hr; }
diff --git a/libs/vkd3d/utils.c b/libs/vkd3d/utils.c index f94dce50daa3..84141aadb9fb 100644 --- a/libs/vkd3d/utils.c +++ b/libs/vkd3d/utils.c @@ -351,14 +351,14 @@ HRESULT hresult_from_vk_result(VkResult vr) }
#define LOAD_INSTANCE_PFN(name) \ - if (!(procs->name = (void *)vkGetInstanceProcAddr(instance, #name))) \ + if (!(procs->name = (void *)global_procs->vkGetInstanceProcAddr(instance, #name))) \ { \ ERR("Could not get instance proc addr for '" #name "'.\n"); \ return E_FAIL; \ }
HRESULT vkd3d_load_vk_instance_procs(struct vkd3d_vk_instance_procs *procs, - VkInstance instance) + const struct vkd3d_vulkan_procs_info *global_procs, VkInstance instance) { memset(procs, 0, sizeof(*procs));
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index eca6895784b8..f32b64a58cef 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -87,6 +87,7 @@ struct vkd3d_instance size_t wchar_size;
struct vkd3d_vulkan_info vk_info; + struct vkd3d_vulkan_procs_info vk_global_procs;
LONG refcount; }; @@ -747,7 +748,7 @@ const char *debug_vk_queue_flags(VkQueueFlags flags) DECLSPEC_HIDDEN; HRESULT hresult_from_vk_result(VkResult vr) DECLSPEC_HIDDEN;
HRESULT vkd3d_load_vk_instance_procs(struct vkd3d_vk_instance_procs *procs, - VkInstance instance) DECLSPEC_HIDDEN; + const struct vkd3d_vulkan_procs_info *global_procs, VkInstance instance) DECLSPEC_HIDDEN; HRESULT vkd3d_load_vk_device_procs(struct vkd3d_vk_device_procs *procs, const struct vkd3d_vk_instance_procs *parent_procs, VkDevice device) DECLSPEC_HIDDEN;
@@ -759,6 +760,5 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(const VkInstanceCreateInfo *crea VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *layer_name, uint32_t *property_count, VkExtensionProperties *properties); VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks *allocator); -VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, const VkAllocationCallbacks *allocator);
#endif /* __VKD3D_PRIVATE_H */ diff --git a/libs/vkd3d/vulkan_procs.h b/libs/vkd3d/vulkan_procs.h index 8875cb24b490..b1ec77df7358 100644 --- a/libs/vkd3d/vulkan_procs.h +++ b/libs/vkd3d/vulkan_procs.h @@ -44,6 +44,7 @@ VK_INSTANCE_PFN(vkGetPhysicalDeviceQueueFamilyProperties) VK_INSTANCE_PFN(vkGetPhysicalDeviceSparseImageFormatProperties)
/* Device functions (obtained by vkGetDeviceProcAddr). */ +VK_DEVICE_PFN(vkDestroyDevice) /* Load vkDestroyDevice() first. */ VK_DEVICE_PFN(vkAllocateCommandBuffers) VK_DEVICE_PFN(vkAllocateDescriptorSets) VK_DEVICE_PFN(vkAllocateMemory) @@ -118,7 +119,6 @@ VK_DEVICE_PFN(vkDestroyBufferView) VK_DEVICE_PFN(vkDestroyCommandPool) VK_DEVICE_PFN(vkDestroyDescriptorPool) VK_DEVICE_PFN(vkDestroyDescriptorSetLayout) -VK_DEVICE_PFN(vkDestroyDevice) VK_DEVICE_PFN(vkDestroyEvent) VK_DEVICE_PFN(vkDestroyFence) VK_DEVICE_PFN(vkDestroyFramebuffer)
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
From: Józef Kucia jkucia@codeweavers.com
Signed-off-by: Józef Kucia jkucia@codeweavers.com ---
It doesn't make much sense to link directly to libvulkan after the previous patch.
--- Makefile.am | 2 +- configure.ac | 5 +++++ libs/vkd3d/device.c | 34 ++++++++++++++++++++++++++++++---- libs/vkd3d/vkd3d_private.h | 10 +--------- 4 files changed, 37 insertions(+), 14 deletions(-)
diff --git a/Makefile.am b/Makefile.am index f796befb3672..d8212b7ca80d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -89,7 +89,7 @@ libvkd3d_la_SOURCES = \ libs/vkd3d/vkd3d_main.c \ libs/vkd3d/vkd3d_private.h \ libs/vkd3d/vulkan_procs.h -libvkd3d_la_LIBADD = libvkd3d-common.la libvkd3d-shader.la @PTHREAD_LIBS@ @VULKAN_LIBS@ +libvkd3d_la_LIBADD = libvkd3d-common.la libvkd3d-shader.la @DL_LIBS@ @PTHREAD_LIBS@ if HAVE_LD_VERSION_SCRIPT libvkd3d_la_LDFLAGS = -Wl,--version-script=$(srcdir)/libs/vkd3d/vkd3d.map endif diff --git a/configure.ac b/configure.ac index b886058fef51..8a39fef7d2b9 100644 --- a/configure.ac +++ b/configure.ac @@ -62,6 +62,11 @@ m4_ifdef([PKG_PROG_PKG_CONFIG], [PKG_PROG_PKG_CONFIG], [m4_fatal([pkg-config aut
AC_CHECK_LIB([m], [ceilf])
+AC_ARG_VAR([DL_LIBS], [linker flags for dl]) +AC_CHECK_LIB([dl], [dlopen], + [AC_SUBST([DL_LIBS], ["-ldl"])], + [AC_MSG_ERROR([libdl not found.])]) + AC_ARG_VAR([PTHREAD_LIBS], [linker flags for pthreads]) AC_CHECK_LIB([pthread], [pthread_create], [AC_SUBST([PTHREAD_LIBS], ["-lpthread"])], diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index 62271dbb11a9..72253207cfd7 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -18,6 +18,8 @@
#include "vkd3d_private.h"
+#include <dlfcn.h> + struct vkd3d_optional_extension_info { const char *extension_name; @@ -176,16 +178,34 @@ static bool vkd3d_init_vk_global_procs(struct vkd3d_instance *instance, { struct vkd3d_vulkan_procs_info *procs = &instance->vk_global_procs;
+ instance->libvulkan = NULL; + if (vulkan_procs_info) { *procs = *vulkan_procs_info; return true; }
- procs->vkCreateInstance = vkCreateInstance; - procs->vkDestroyInstance = vkDestroyInstance; - procs->vkGetInstanceProcAddr = vkGetInstanceProcAddr; - procs->vkEnumerateInstanceExtensionProperties = vkEnumerateInstanceExtensionProperties; + if (!(instance->libvulkan = dlopen("libvulkan.so.1", RTLD_NOW))) + { + ERR("Failed to load libvulkan.\n"); + return false; + } + +#define LOAD_PROC(name) \ + if (!(procs->name = dlsym(instance->libvulkan, #name))) \ + { \ + ERR("Could not get proc addr for '" #name "'.\n"); \ + dlclose(instance->libvulkan); \ + instance->libvulkan = NULL; \ + return false; \ + } + LOAD_PROC(vkCreateInstance) + LOAD_PROC(vkDestroyInstance) + LOAD_PROC(vkGetInstanceProcAddr) + LOAD_PROC(vkEnumerateInstanceExtensionProperties) +#undef LOAD_PROC + return true; }
@@ -248,6 +268,8 @@ static HRESULT vkd3d_instance_init(struct vkd3d_instance *instance, if ((vr = vk_global_procs->vkCreateInstance(&instance_info, NULL, &vk_instance))) { ERR("Failed to create Vulkan instance, vr %d.\n", vr); + if (instance->libvulkan) + dlclose(instance->libvulkan); return hresult_from_vk_result(vr); }
@@ -255,6 +277,8 @@ static HRESULT vkd3d_instance_init(struct vkd3d_instance *instance, { ERR("Failed to load instance procs, hr %#x.\n", hr); vk_global_procs->vkDestroyInstance(vk_instance, NULL); + if (instance->libvulkan) + dlclose(instance->libvulkan); return hr; }
@@ -310,6 +334,8 @@ ULONG vkd3d_instance_decref(struct vkd3d_instance *instance) { const struct vkd3d_vk_instance_procs *vk_procs = &instance->vk_procs; VK_CALL(vkDestroyInstance(instance->vk_instance, NULL)); + if (instance->libvulkan) + dlclose(instance->libvulkan); vkd3d_free(instance); }
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index f32b64a58cef..44d90b9c907b 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -88,6 +88,7 @@ struct vkd3d_instance
struct vkd3d_vulkan_info vk_info; struct vkd3d_vulkan_procs_info vk_global_procs; + void *libvulkan;
LONG refcount; }; @@ -752,13 +753,4 @@ HRESULT vkd3d_load_vk_instance_procs(struct vkd3d_vk_instance_procs *procs, HRESULT vkd3d_load_vk_device_procs(struct vkd3d_vk_device_procs *procs, const struct vkd3d_vk_instance_procs *parent_procs, VkDevice device) DECLSPEC_HIDDEN;
-/* We link directly to the loader library and use the following exported functions. */ -VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, - const char *name); -VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(const VkInstanceCreateInfo *create_info, - const VkAllocationCallbacks *allocator, VkInstance *instance); -VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *layer_name, - uint32_t *property_count, VkExtensionProperties *properties); -VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks *allocator); - #endif /* __VKD3D_PRIVATE_H */
On 17 January 2018 at 15:18, Józef Kucia joseph.kucia@gmail.com wrote:
diff --git a/configure.ac b/configure.ac index b886058fef51..8a39fef7d2b9 100644 --- a/configure.ac +++ b/configure.ac @@ -62,6 +62,11 @@ m4_ifdef([PKG_PROG_PKG_CONFIG], [PKG_PROG_PKG_CONFIG], [m4_fatal([pkg-config aut
AC_CHECK_LIB([m], [ceilf])
+AC_ARG_VAR([DL_LIBS], [linker flags for dl]) +AC_CHECK_LIB([dl], [dlopen],
[AC_SUBST([DL_LIBS], ["-ldl"])],
[AC_MSG_ERROR([libdl not found.])])
I'm not sure we should necessarily care a lot about non-Linux systems at this point, but IIRC on at least some sytems dlopen() is part of libc.
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
From: Józef Kucia jkucia@codeweavers.com
It's enough to load vkGetInstanceProcAddr() in a platform-specific way.
Signed-off-by: Józef Kucia jkucia@codeweavers.com --- include/vkd3d.h | 12 ++----- libs/vkd3d-utils/vkd3d_utils_main.c | 2 +- libs/vkd3d/device.c | 64 +++++++++++++++++++------------------ libs/vkd3d/utils.c | 23 ++++++++++++- libs/vkd3d/vkd3d_private.h | 13 ++++++-- libs/vkd3d/vulkan_procs.h | 2 +- 6 files changed, 71 insertions(+), 45 deletions(-)
diff --git a/include/vkd3d.h b/include/vkd3d.h index 5ae7603013e0..8886499e0ca9 100644 --- a/include/vkd3d.h +++ b/include/vkd3d.h @@ -43,21 +43,15 @@ typedef bool (*vkd3d_join_thread_pfn)(void *thread);
struct vkd3d_instance;
-struct vkd3d_vulkan_procs_info -{ - PFN_vkCreateInstance vkCreateInstance; - PFN_vkDestroyInstance vkDestroyInstance; - PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr; - PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; -}; - struct vkd3d_instance_create_info { vkd3d_signal_event_pfn signal_event_pfn; vkd3d_create_thread_pfn create_thread_pfn; vkd3d_join_thread_pfn join_thread_pfn; size_t wchar_size; - const struct vkd3d_vulkan_procs_info *vulkan_procs_info; + + /* If set to NULL, libvkd3d loads libvulkan. */ + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr_pfn; };
struct vkd3d_device_create_info diff --git a/libs/vkd3d-utils/vkd3d_utils_main.c b/libs/vkd3d-utils/vkd3d_utils_main.c index 2ea0a16beefa..f68c47badd5c 100644 --- a/libs/vkd3d-utils/vkd3d_utils_main.c +++ b/libs/vkd3d-utils/vkd3d_utils_main.c @@ -41,7 +41,7 @@ HRESULT WINAPI D3D12CreateDevice(IUnknown *adapter, instance_create_info.create_thread_pfn = NULL; instance_create_info.join_thread_pfn = NULL; instance_create_info.wchar_size = sizeof(WCHAR); - instance_create_info.vulkan_procs_info = NULL; + instance_create_info.vkGetInstanceProcAddr_pfn = NULL;
device_create_info.minimum_feature_level = minimum_feature_level; device_create_info.instance = NULL; diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index 72253207cfd7..b93c1696e649 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -140,7 +140,7 @@ static unsigned int vkd3d_enable_extensions(const char *extensions[],
static void vkd3d_init_instance_caps(struct vkd3d_instance *instance) { - const struct vkd3d_vulkan_procs_info *vk_procs = &instance->vk_global_procs; + const struct vkd3d_vk_global_procs *vk_procs = &instance->vk_global_procs; struct vkd3d_vulkan_info *vulkan_info = &instance->vk_info; VkExtensionProperties *vk_extensions; uint32_t count; @@ -173,46 +173,47 @@ static void vkd3d_init_instance_caps(struct vkd3d_instance *instance) vkd3d_free(vk_extensions); }
-static bool vkd3d_init_vk_global_procs(struct vkd3d_instance *instance, - const struct vkd3d_vulkan_procs_info *vulkan_procs_info) +static HRESULT vkd3d_init_vk_global_procs(struct vkd3d_instance *instance, + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr) { - struct vkd3d_vulkan_procs_info *procs = &instance->vk_global_procs; - - instance->libvulkan = NULL; + HRESULT hr;
- if (vulkan_procs_info) + if (!vkGetInstanceProcAddr) { - *procs = *vulkan_procs_info; - return true; - } + if (!(instance->libvulkan = dlopen("libvulkan.so.1", RTLD_NOW))) + { + ERR("Failed to load libvulkan.\n"); + return E_FAIL; + }
- if (!(instance->libvulkan = dlopen("libvulkan.so.1", RTLD_NOW))) + if (!(vkGetInstanceProcAddr = dlsym(instance->libvulkan, "vkGetInstanceProcAddr"))) + { + ERR("Could not load function pointer for vkGetInstanceProcAddr().\n"); + dlclose(instance->libvulkan); + instance->libvulkan = NULL; + return E_FAIL; + } + } + else { - ERR("Failed to load libvulkan.\n"); - return false; + instance->libvulkan = NULL; }
-#define LOAD_PROC(name) \ - if (!(procs->name = dlsym(instance->libvulkan, #name))) \ - { \ - ERR("Could not get proc addr for '" #name "'.\n"); \ - dlclose(instance->libvulkan); \ - instance->libvulkan = NULL; \ - return false; \ + if (FAILED(hr = vkd3d_load_vk_global_procs(&instance->vk_global_procs, vkGetInstanceProcAddr))) + { + if (instance->libvulkan) + dlclose(instance->libvulkan); + instance->libvulkan = NULL; + return hr; } - LOAD_PROC(vkCreateInstance) - LOAD_PROC(vkDestroyInstance) - LOAD_PROC(vkGetInstanceProcAddr) - LOAD_PROC(vkEnumerateInstanceExtensionProperties) -#undef LOAD_PROC
- return true; + return S_OK; }
static HRESULT vkd3d_instance_init(struct vkd3d_instance *instance, const struct vkd3d_instance_create_info *create_info) { - const struct vkd3d_vulkan_procs_info *vk_global_procs = &instance->vk_global_procs; + const struct vkd3d_vk_global_procs *vk_global_procs = &instance->vk_global_procs; const char *extensions[MAX_INSTANCE_EXTENSION_COUNT]; VkApplicationInfo application_info; VkInstanceCreateInfo instance_info; @@ -236,10 +237,10 @@ static HRESULT vkd3d_instance_init(struct vkd3d_instance *instance, instance->join_thread = create_info->join_thread_pfn; instance->wchar_size = create_info->wchar_size;
- if (!vkd3d_init_vk_global_procs(instance, create_info->vulkan_procs_info)) + if (FAILED(hr = vkd3d_init_vk_global_procs(instance, create_info->vkGetInstanceProcAddr_pfn))) { - ERR("Failed to initialize Vulkan global procs.\n"); - return E_FAIL; + ERR("Failed to initialize Vulkan global procs, hr %#x.\n", hr); + return hr; }
memset(&instance->vk_info, 0, sizeof(instance->vk_info)); @@ -276,7 +277,8 @@ static HRESULT vkd3d_instance_init(struct vkd3d_instance *instance, if (FAILED(hr = vkd3d_load_vk_instance_procs(&instance->vk_procs, vk_global_procs, vk_instance))) { ERR("Failed to load instance procs, hr %#x.\n", hr); - vk_global_procs->vkDestroyInstance(vk_instance, NULL); + if (instance->vk_procs.vkDestroyInstance) + instance->vk_procs.vkDestroyInstance(vk_instance, NULL); if (instance->libvulkan) dlclose(instance->libvulkan); return hr; diff --git a/libs/vkd3d/utils.c b/libs/vkd3d/utils.c index 84141aadb9fb..a326cae583ac 100644 --- a/libs/vkd3d/utils.c +++ b/libs/vkd3d/utils.c @@ -350,6 +350,27 @@ HRESULT hresult_from_vk_result(VkResult vr) } }
+#define LOAD_GLOBAL_PFN(name) \ + if (!(procs->name = (void *)vkGetInstanceProcAddr(NULL, #name))) \ + { \ + ERR("Could not get global proc addr for '" #name "'.\n"); \ + return E_FAIL; \ + } + +HRESULT vkd3d_load_vk_global_procs(struct vkd3d_vk_global_procs *procs, + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr) +{ + memset(procs, 0, sizeof(*procs)); + + procs->vkGetInstanceProcAddr = vkGetInstanceProcAddr; + + LOAD_GLOBAL_PFN(vkCreateInstance) + LOAD_GLOBAL_PFN(vkEnumerateInstanceExtensionProperties) + + TRACE("Loaded global Vulkan procs.\n"); + return S_OK; +} + #define LOAD_INSTANCE_PFN(name) \ if (!(procs->name = (void *)global_procs->vkGetInstanceProcAddr(instance, #name))) \ { \ @@ -358,7 +379,7 @@ HRESULT hresult_from_vk_result(VkResult vr) }
HRESULT vkd3d_load_vk_instance_procs(struct vkd3d_vk_instance_procs *procs, - const struct vkd3d_vulkan_procs_info *global_procs, VkInstance instance) + const struct vkd3d_vk_global_procs *global_procs, VkInstance instance) { memset(procs, 0, sizeof(*procs));
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 44d90b9c907b..f4bae9d4c771 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -49,6 +49,13 @@ struct d3d12_command_list; struct d3d12_device;
+struct vkd3d_vk_global_procs +{ + PFN_vkCreateInstance vkCreateInstance; + PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr; +}; + #define DECLARE_VK_PFN(name) PFN_##name name; struct vkd3d_vk_instance_procs { @@ -87,7 +94,7 @@ struct vkd3d_instance size_t wchar_size;
struct vkd3d_vulkan_info vk_info; - struct vkd3d_vulkan_procs_info vk_global_procs; + struct vkd3d_vk_global_procs vk_global_procs; void *libvulkan;
LONG refcount; @@ -748,8 +755,10 @@ const char *debug_vk_queue_flags(VkQueueFlags flags) DECLSPEC_HIDDEN;
HRESULT hresult_from_vk_result(VkResult vr) DECLSPEC_HIDDEN;
+HRESULT vkd3d_load_vk_global_procs(struct vkd3d_vk_global_procs *procs, + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr) DECLSPEC_HIDDEN; HRESULT vkd3d_load_vk_instance_procs(struct vkd3d_vk_instance_procs *procs, - const struct vkd3d_vulkan_procs_info *global_procs, VkInstance instance) DECLSPEC_HIDDEN; + const struct vkd3d_vk_global_procs *global_procs, VkInstance instance) DECLSPEC_HIDDEN; HRESULT vkd3d_load_vk_device_procs(struct vkd3d_vk_device_procs *procs, const struct vkd3d_vk_instance_procs *parent_procs, VkDevice device) DECLSPEC_HIDDEN;
diff --git a/libs/vkd3d/vulkan_procs.h b/libs/vkd3d/vulkan_procs.h index b1ec77df7358..cbdcda80f2c7 100644 --- a/libs/vkd3d/vulkan_procs.h +++ b/libs/vkd3d/vulkan_procs.h @@ -29,8 +29,8 @@ #endif
/* Instance functions (obtained by vkGetInstanceProcAddr). */ +VK_INSTANCE_PFN(vkDestroyInstance) /* Load vkDestroyInstance() first. */ VK_INSTANCE_PFN(vkCreateDevice) -VK_INSTANCE_PFN(vkDestroyInstance) VK_INSTANCE_PFN(vkEnumerateDeviceExtensionProperties) VK_INSTANCE_PFN(vkEnumerateDeviceLayerProperties) VK_INSTANCE_PFN(vkEnumeratePhysicalDevices)
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com