From: Józef Kucia jkucia@codeweavers.com
Signed-off-by: Józef Kucia jkucia@codeweavers.com --- libs/vkd3d/device.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index b93c1696e649..c6971e33ed3a 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -1292,8 +1292,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateCommandList(ID3D12Device *if }
/* 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 void vkd3d_restrict_format_support_for_feature_level(D3D12_FEATURE_DATA_FORMAT_SUPPORT *format_support) { static const D3D12_FEATURE_DATA_FORMAT_SUPPORT blacklisted_format_features[] = { @@ -1306,7 +1305,7 @@ static void vkd3d_restrict_format_support_for_feature_level(
for (i = 0; i < ARRAY_SIZE(blacklisted_format_features); ++i) { - if (blacklisted_format_features[i].Format == format->dxgi_format) + if (blacklisted_format_features[i].Format == format_support->Format) { format_support->Support1 &= ~blacklisted_format_features[i].Support1; format_support->Support2 &= ~blacklisted_format_features[i].Support2; @@ -1463,7 +1462,7 @@ 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); + vkd3d_restrict_format_support_for_feature_level(data);
return S_OK; }
From: Józef Kucia jkucia@codeweavers.com
Signed-off-by: Józef Kucia jkucia@codeweavers.com --- demos/demo_xcb.h | 2 +- include/vkd3d.h | 2 +- libs/vkd3d/device.c | 2 +- libs/vkd3d/vkd3d.map | 2 +- tests/vkd3d_api.c | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/demos/demo_xcb.h b/demos/demo_xcb.h index ca0887c366f4..4de1149d91b0 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(vkd3d_instance_from_device(d3d12_device)); + vk_instance = vkd3d_instance_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 8886499e0ca9..ac37c26f4a9a 100644 --- a/include/vkd3d.h +++ b/include/vkd3d.h @@ -70,8 +70,8 @@ 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); +VkInstance vkd3d_instance_get_vk_instance(struct vkd3d_instance *instance); ULONG vkd3d_instance_incref(struct vkd3d_instance *instance);
HRESULT vkd3d_create_device(const struct vkd3d_device_create_info *create_info, diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index c6971e33ed3a..af3f0534def9 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -344,7 +344,7 @@ ULONG vkd3d_instance_decref(struct vkd3d_instance *instance) return refcount; }
-VkInstance vkd3d_get_vk_instance(struct vkd3d_instance *instance) +VkInstance vkd3d_instance_get_vk_instance(struct vkd3d_instance *instance) { return instance->vk_instance; } diff --git a/libs/vkd3d/vkd3d.map b/libs/vkd3d/vkd3d.map index c5157c611e91..9edc3aa5af1c 100644 --- a/libs/vkd3d/vkd3d.map +++ b/libs/vkd3d/vkd3d.map @@ -8,11 +8,11 @@ global: vkd3d_create_root_signature_deserializer; vkd3d_get_vk_device; vkd3d_get_vk_format; - vkd3d_get_vk_instance; vkd3d_get_vk_physical_device; vkd3d_get_vk_queue_family_index; vkd3d_instance_decref; vkd3d_instance_from_device; + vkd3d_instance_get_vk_instance; vkd3d_instance_incref; vkd3d_release_vk_queue; vkd3d_serialize_root_signature; diff --git a/tests/vkd3d_api.c b/tests/vkd3d_api.c index bda0c4ee1798..41b09fbcc0fa 100644 --- a/tests/vkd3d_api.c +++ b/tests/vkd3d_api.c @@ -154,7 +154,7 @@ static void test_physical_device(void)
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); + vk_instance = vkd3d_instance_get_vk_instance(instance); ok(vk_instance != VK_NULL_HANDLE, "Failed to get Vulkan instance.\n");
create_info = device_default_create_info;
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
From: Józef Kucia jkucia@codeweavers.com
Signed-off-by: Józef Kucia jkucia@codeweavers.com --- libs/vkd3d/device.c | 5 +++++ tests/vkd3d_api.c | 16 +++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index af3f0534def9..7a9951122e4d 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -221,6 +221,11 @@ static HRESULT vkd3d_instance_init(struct vkd3d_instance *instance, VkResult vr; HRESULT hr;
+ if (!create_info->signal_event_pfn) + { + ERR("Invalid signal event function pointer.\n"); + return E_INVALIDARG; + } if (!create_info->create_thread_pfn != !create_info->join_thread_pfn) { ERR("Invalid create/join thread function pointers.\n"); diff --git a/tests/vkd3d_api.c b/tests/vkd3d_api.c index 41b09fbcc0fa..c387abecc196 100644 --- a/tests/vkd3d_api.c +++ b/tests/vkd3d_api.c @@ -74,9 +74,7 @@ static void test_create_instance(void) ULONG refcount; HRESULT hr;
- memset(&create_info, 0, sizeof(create_info)); - create_info.wchar_size = sizeof(WCHAR); - + create_info = instance_default_create_info; hr = vkd3d_create_instance(&create_info, &instance); ok(hr == S_OK, "Failed to create instance, hr %#x.\n", hr); refcount = vkd3d_instance_incref(instance); @@ -85,11 +83,15 @@ static void test_create_instance(void) refcount = vkd3d_instance_decref(instance); ok(!refcount, "Instance has %u references left.\n", refcount);
- create_info.signal_event_pfn = signal_event; + create_info = instance_default_create_info; + create_info.wchar_size = 1; hr = vkd3d_create_instance(&create_info, &instance); - ok(hr == S_OK, "Failed to create instance, hr %#x.\n", hr); - refcount = vkd3d_instance_decref(instance); - ok(!refcount, "Instance has %u references left.\n", refcount); + ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr); + + create_info = instance_default_create_info; + create_info.signal_event_pfn = NULL; + hr = vkd3d_create_instance(&create_info, &instance); + ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr); }
static void test_create_device(void)
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/.gitignore | 1 + tests/vkd3d_api.c | 7 +++++++ 2 files changed, 8 insertions(+)
diff --git a/tests/.gitignore b/tests/.gitignore index 2ea34ba29578..87d1ea6590ea 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -1 +1,2 @@ d3d12 +vkd3d_api diff --git a/tests/vkd3d_api.c b/tests/vkd3d_api.c index c387abecc196..8923d8e44120 100644 --- a/tests/vkd3d_api.c +++ b/tests/vkd3d_api.c @@ -92,6 +92,13 @@ static void test_create_instance(void) create_info.signal_event_pfn = NULL; hr = vkd3d_create_instance(&create_info, &instance); ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr); + + create_info = instance_default_create_info; + create_info.vkGetInstanceProcAddr_pfn = vkGetInstanceProcAddr; + hr = vkd3d_create_instance(&create_info, &instance); + ok(hr == S_OK, "Failed to create instance, hr %#x.\n", hr); + refcount = vkd3d_instance_decref(instance); + ok(!refcount, "Instance has %u references left.\n", refcount); }
static void test_create_device(void)
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/vkd3d_api.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+)
diff --git a/tests/vkd3d_api.c b/tests/vkd3d_api.c index 8923d8e44120..8dd7c78f2326 100644 --- a/tests/vkd3d_api.c +++ b/tests/vkd3d_api.c @@ -148,6 +148,102 @@ static void test_create_device(void) ok(!refcount, "Instance has %u references left.\n", refcount); }
+static VkResult VKAPI_CALL fake_vkEnumerateDeviceExtensionProperties( + VkPhysicalDevice physical_device, const char *layer_name, + uint32_t *out_count, VkExtensionProperties *out_properties) +{ + VkExtensionProperties *properties; + uint32_t count, i, j; + VkResult vr; + + vr = vkEnumerateDeviceExtensionProperties(physical_device, layer_name, &count, NULL); + ok(vr == VK_SUCCESS, "Got unexpected VkResult %d.\n", vr); + if (!count) + { + *out_count = count; + return vr; + } + + properties = calloc(count, sizeof(*properties)); + ok(properties, "Failed to allocate memory.\n"); + + vr = vkEnumerateDeviceExtensionProperties(physical_device, layer_name, &count, properties); + ok(vr == VK_SUCCESS, "Got unexpected VkResult %d.\n", vr); + + vr = VK_SUCCESS; + for (i = 0, j = 0; i < count; ++i) + { + /* Filter out VK_KHR_maintenance1. */ + if (!strcmp(properties[i].extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) + continue; + + if (out_properties) + { + if (j < *out_count) + out_properties[j] = properties[i]; + else + vr = VK_INCOMPLETE; + } + + ++j; + } + + free(properties); + + *out_count = j; + return vr; +} + +static VkResult VKAPI_CALL fake_vkCreateDevice(VkPhysicalDevice physical_device, + const VkDeviceCreateInfo *create_info, const VkAllocationCallbacks *allocator, + VkDevice *device) +{ + uint32_t i; + + for (i = 0; i < create_info->enabledExtensionCount; ++i) + { + if (!strcmp(create_info->ppEnabledExtensionNames[i], VK_KHR_MAINTENANCE1_EXTENSION_NAME)) + return VK_ERROR_EXTENSION_NOT_PRESENT; + } + + return vkCreateDevice(physical_device, create_info, allocator, device); +} + +static PFN_vkVoidFunction VKAPI_CALL fake_vkGetInstanceProcAddr(VkInstance instance, + const char *name) +{ + if (!strcmp(name, "vkCreateDevice")) + return (PFN_vkVoidFunction)fake_vkCreateDevice; + if (!strcmp(name, "vkEnumerateDeviceExtensionProperties")) + return (PFN_vkVoidFunction)fake_vkEnumerateDeviceExtensionProperties; + + return vkGetInstanceProcAddr(instance, name); +} + +static void test_required_device_extensions(void) +{ + struct vkd3d_instance_create_info instance_create_info; + struct vkd3d_device_create_info device_create_info; + struct vkd3d_instance *instance; + ID3D12Device *device; + ULONG refcount; + HRESULT hr; + + instance_create_info = instance_default_create_info; + instance_create_info.vkGetInstanceProcAddr_pfn = fake_vkGetInstanceProcAddr; + hr = vkd3d_create_instance(&instance_create_info, &instance); + ok(hr == S_OK, "Failed to create instance, hr %#x.\n", hr); + + device_create_info = device_default_create_info; + device_create_info.instance = instance; + device_create_info.instance_create_info = NULL; + hr = vkd3d_create_device(&device_create_info, &IID_ID3D12Device, (void **)&device); + ok(hr == E_FAIL, "Failed to create device, hr %#x.\n", hr); + + refcount = vkd3d_instance_decref(instance); + ok(!refcount, "Instance has %u references left.\n", refcount); +} + static void test_physical_device(void) { struct vkd3d_device_create_info create_info; @@ -264,6 +360,7 @@ START_TEST(vkd3d_api)
run_test(test_create_instance); run_test(test_create_device); + run_test(test_required_device_extensions); run_test(test_physical_device); run_test(test_vkd3d_queue); }
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com