From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/wined3d/adapter_vk.c | 57 ++++++++++++++++++++++++--------------- dlls/wined3d/context_vk.c | 4 +-- dlls/wined3d/query.c | 4 +-- dlls/wined3d/swapchain.c | 6 ++--- dlls/wined3d/wined3d_vk.h | 10 ++++--- 5 files changed, 50 insertions(+), 31 deletions(-)
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c index 311de30f052..4a9d49996c7 100644 --- a/dlls/wined3d/adapter_vk.c +++ b/dlls/wined3d/adapter_vk.c @@ -137,7 +137,7 @@ static void adapter_vk_destroy(struct wined3d_adapter *adapter) }
static HRESULT wined3d_select_vulkan_queue_family(const struct wined3d_adapter_vk *adapter_vk, - uint32_t *queue_family_index, uint32_t *timestamp_bits) + VkQueueFlags flags, struct wined3d_queue_vk *queue) { VkPhysicalDevice physical_device = adapter_vk->physical_device; const struct wined3d_vk_info *vk_info = &adapter_vk->vk_info; @@ -153,17 +153,17 @@ static HRESULT wined3d_select_vulkan_queue_family(const struct wined3d_adapter_v
for (i = 0; i < count; ++i) { - if (queue_properties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) + if ((queue_properties[i].queueFlags & flags) == flags) { - *queue_family_index = i; - *timestamp_bits = queue_properties[i].timestampValidBits; + queue->vk_queue_family_index = i; + queue->timestamp_bits = queue_properties[i].timestampValidBits; free(queue_properties); return WINED3D_OK; } } free(queue_properties);
- WARN("Failed to find graphics queue.\n"); + WARN("Failed to find queue supporting %#x.\n", flags); return E_FAIL; }
@@ -361,39 +361,52 @@ static HRESULT adapter_vk_create_device(struct wined3d *wined3d, const struct wi const struct wined3d_vk_info *vk_info = &adapter_vk->vk_info; struct wined3d_physical_device_info physical_device_info; static const float priorities[] = {1.0f}; + VkDeviceQueueCreateInfo queue_info[2]; struct wined3d_device_vk *device_vk; VkDevice vk_device = VK_NULL_HANDLE; - VkDeviceQueueCreateInfo queue_info; VkPhysicalDevice physical_device; VkDeviceCreateInfo device_info; - uint32_t queue_family_index; - uint32_t timestamp_bits; + HRESULT hr, decode_hr; VkResult vr; - HRESULT hr;
if (!(device_vk = calloc(1, sizeof(*device_vk)))) return E_OUTOFMEMORY;
- if (FAILED(hr = wined3d_select_vulkan_queue_family(adapter_vk, &queue_family_index, ×tamp_bits))) + if (FAILED(hr = wined3d_select_vulkan_queue_family(adapter_vk, + VK_QUEUE_GRAPHICS_BIT, &device_vk->graphics_queue))) goto fail;
+ decode_hr = wined3d_select_vulkan_queue_family(adapter_vk, + VK_QUEUE_VIDEO_DECODE_BIT_KHR, &device_vk->decode_queue); + physical_device = adapter_vk->physical_device;
get_physical_device_info(adapter_vk, &physical_device_info); wined3d_disable_vulkan_features(&physical_device_info);
- queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; - queue_info.pNext = NULL; - queue_info.flags = 0; - queue_info.queueFamilyIndex = queue_family_index; - queue_info.queueCount = ARRAY_SIZE(priorities); - queue_info.pQueuePriorities = priorities; + queue_info[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + queue_info[0].pNext = NULL; + queue_info[0].flags = 0; + queue_info[0].queueFamilyIndex = device_vk->graphics_queue.vk_queue_family_index; + queue_info[0].queueCount = ARRAY_SIZE(priorities); + queue_info[0].pQueuePriorities = priorities; + device_info.queueCreateInfoCount = 1; + + if (decode_hr == S_OK) + { + queue_info[1].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + queue_info[1].pNext = NULL; + queue_info[1].flags = 0; + queue_info[1].queueFamilyIndex = device_vk->decode_queue.vk_queue_family_index; + queue_info[1].queueCount = ARRAY_SIZE(priorities); + queue_info[1].pQueuePriorities = priorities; + ++device_info.queueCreateInfoCount; + }
device_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; device_info.pNext = physical_device_info.features2.pNext; device_info.flags = 0; - device_info.queueCreateInfoCount = 1; - device_info.pQueueCreateInfos = &queue_info; + device_info.pQueueCreateInfos = queue_info; device_info.enabledLayerCount = 0; device_info.ppEnabledLayerNames = NULL; device_info.enabledExtensionCount = adapter_vk->device_extension_count; @@ -409,9 +422,11 @@ static HRESULT adapter_vk_create_device(struct wined3d *wined3d, const struct wi }
device_vk->vk_device = vk_device; - VK_CALL(vkGetDeviceQueue(vk_device, queue_family_index, 0, &device_vk->vk_queue)); - device_vk->vk_queue_family_index = queue_family_index; - device_vk->timestamp_bits = timestamp_bits; + VK_CALL(vkGetDeviceQueue(vk_device, device_vk->graphics_queue.vk_queue_family_index, + 0, &device_vk->graphics_queue.vk_queue)); + if (decode_hr == S_OK) + VK_CALL(vkGetDeviceQueue(vk_device, device_vk->decode_queue.vk_queue_family_index, + 0, &device_vk->decode_queue.vk_queue));
device_vk->vk_info = *vk_info; #define VK_DEVICE_PFN(name) \ diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c index 9147a222b9d..edc77cd5f20 100644 --- a/dlls/wined3d/context_vk.c +++ b/dlls/wined3d/context_vk.c @@ -1965,7 +1965,7 @@ void wined3d_context_vk_submit_command_buffer(struct wined3d_context_vk *context submit_info.signalSemaphoreCount = signal_semaphore_count; submit_info.pSignalSemaphores = signal_semaphores;
- if ((vr = VK_CALL(vkQueueSubmit(device_vk->vk_queue, 1, &submit_info, buffer->vk_fence))) < 0) + if ((vr = VK_CALL(vkQueueSubmit(device_vk->graphics_queue.vk_queue, 1, &submit_info, buffer->vk_fence))) < 0) ERR("Failed to submit command buffer %p, vr %s.\n", buffer->vk_command_buffer, wined3d_debug_vkresult(vr));
@@ -4167,7 +4167,7 @@ HRESULT wined3d_context_vk_init(struct wined3d_context_vk *context_vk, struct wi command_pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; command_pool_info.pNext = NULL; command_pool_info.flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT | VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; - command_pool_info.queueFamilyIndex = device_vk->vk_queue_family_index; + command_pool_info.queueFamilyIndex = device_vk->graphics_queue.vk_queue_family_index; if ((vr = VK_CALL(vkCreateCommandPool(device_vk->vk_device, &command_pool_info, NULL, &context_vk->vk_command_pool))) < 0) { diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c index a58ffbcf3d0..26e4f5e51f2 100644 --- a/dlls/wined3d/query.c +++ b/dlls/wined3d/query.c @@ -1915,7 +1915,7 @@ HRESULT wined3d_query_vk_create(struct wined3d_device *device, enum wined3d_quer break;
case WINED3D_QUERY_TYPE_TIMESTAMP: - if (!wined3d_device_vk(device)->timestamp_bits) + if (!wined3d_device_vk(device)->graphics_queue.timestamp_bits) { WARN("Timestamp queries not supported.\n"); return WINED3DERR_NOTAVAILABLE; @@ -1925,7 +1925,7 @@ HRESULT wined3d_query_vk_create(struct wined3d_device *device, enum wined3d_quer break;
case WINED3D_QUERY_TYPE_TIMESTAMP_DISJOINT: - if (!wined3d_device_vk(device)->timestamp_bits) + if (!wined3d_device_vk(device)->graphics_queue.timestamp_bits) { WARN("Timestamp queries not supported.\n"); return WINED3DERR_NOTAVAILABLE; diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index c8a624c9b8a..2811e588ecd 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -104,7 +104,7 @@ static void wined3d_swapchain_vk_destroy_vulkan_swapchain(struct wined3d_swapcha
vk_info = &wined3d_adapter_vk(device_vk->d.adapter)->vk_info;
- if ((vr = VK_CALL(vkQueueWaitIdle(device_vk->vk_queue))) < 0) + if ((vr = VK_CALL(vkQueueWaitIdle(device_vk->graphics_queue.vk_queue))) < 0) ERR("Failed to wait on queue, vr %s.\n", wined3d_debug_vkresult(vr)); free(swapchain_vk->vk_images); for (i = 0; i < swapchain_vk->image_count; ++i) @@ -898,7 +898,7 @@ static HRESULT wined3d_swapchain_vk_create_vulkan_swapchain(struct wined3d_swapc swapchain_vk->vk_surface = vk_surface;
if ((vr = VK_CALL(vkGetPhysicalDeviceSurfaceSupportKHR(adapter_vk->physical_device, - device_vk->vk_queue_family_index, vk_surface, &supported))) < 0 || !supported) + device_vk->graphics_queue.vk_queue_family_index, vk_surface, &supported))) < 0 || !supported) { ERR("Queue family does not support presentation on this surface, vr %s.\n", wined3d_debug_vkresult(vr)); goto fail; @@ -1160,7 +1160,7 @@ static VkResult wined3d_swapchain_vk_blit(struct wined3d_swapchain_vk *swapchain present_desc.pSwapchains = &swapchain_vk->vk_swapchain; present_desc.pImageIndices = &image_idx; present_desc.pResults = NULL; - if ((vr = VK_CALL(vkQueuePresentKHR(device_vk->vk_queue, &present_desc)))) + if ((vr = VK_CALL(vkQueuePresentKHR(device_vk->graphics_queue.vk_queue, &present_desc)))) WARN("Present returned vr %s.\n", wined3d_debug_vkresult(vr)); return vr; } diff --git a/dlls/wined3d/wined3d_vk.h b/dlls/wined3d/wined3d_vk.h index dd8a1bbfdb0..fd68c616c37 100644 --- a/dlls/wined3d/wined3d_vk.h +++ b/dlls/wined3d/wined3d_vk.h @@ -828,9 +828,13 @@ struct wined3d_device_vk struct wined3d_context_vk context_vk;
VkDevice vk_device; - VkQueue vk_queue; - uint32_t vk_queue_family_index; - uint32_t timestamp_bits; + + struct wined3d_queue_vk + { + VkQueue vk_queue; + uint32_t vk_queue_family_index; + int32_t timestamp_bits; + } graphics_queue, decode_queue;
struct wined3d_vk_info vk_info;