[PATCH vkd3d 1/8] libs/vkd3d: Add simple format support restrictions.
From: Józef Kucia <jkucia(a)codeweavers.com> In the long term, we may need more complex format support filtering. Signed-off-by: Józef Kucia <jkucia(a)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; } -- 2.13.6
From: Józef Kucia <jkucia(a)codeweavers.com> Signed-off-by: Józef Kucia <jkucia(a)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; -- 2.13.6
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
On 17 January 2018 at 15:18, Józef Kucia <joseph.kucia(a)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(a)codeweavers.com> Signed-off-by: Józef Kucia <jkucia(a)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); } -- 2.13.6
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
From: Józef Kucia <jkucia(a)codeweavers.com> Signed-off-by: Józef Kucia <jkucia(a)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); -- 2.13.6
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
From: Józef Kucia <jkucia(a)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(a)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(); } -- 2.13.6
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
From: Józef Kucia <jkucia(a)codeweavers.com> Signed-off-by: Józef Kucia <jkucia(a)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) -- 2.13.6
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
From: Józef Kucia <jkucia(a)codeweavers.com> Signed-off-by: Józef Kucia <jkucia(a)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 */ -- 2.13.6
On 17 January 2018 at 15:18, Józef Kucia <joseph.kucia(a)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(a)codeweavers.com>
From: Józef Kucia <jkucia(a)codeweavers.com> It's enough to load vkGetInstanceProcAddr() in a platform-specific way. Signed-off-by: Józef Kucia <jkucia(a)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) -- 2.13.6
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
participants (3)
-
Henri Verbeet -
Henri Verbeet -
Józef Kucia