[PATCH v2 6/7] winevulkan: Implement vkCmdExecuteCommands.
Józef Kucia
jkucia at codeweavers.com
Wed Mar 14 07:11:55 CDT 2018
From: Roderick Colenbrander <thunderbird2k at gmail.com>
Signed-off-by: Roderick Colenbrander <thunderbird2k at gmail.com>
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
dlls/winevulkan/make_vulkan | 1 +
dlls/winevulkan/vulkan.c | 30 ++++++++++++++++++++++++++++++
dlls/winevulkan/vulkan_thunks.c | 5 -----
dlls/winevulkan/vulkan_thunks.h | 1 +
4 files changed, 32 insertions(+), 5 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
index 56b7778f1108..cdcbfd6a3f06 100755
--- a/dlls/winevulkan/make_vulkan
+++ b/dlls/winevulkan/make_vulkan
@@ -112,6 +112,7 @@ FUNCTION_OVERRIDES = {
# Device functions
"vkAllocateCommandBuffers" : {"dispatch" : True, "driver" : False, "thunk" : False},
+ "vkCmdExecuteCommands" : {"dispatch" : True, "driver" : False, "thunk" : False},
"vkDestroyDevice" : {"dispatch" : True, "driver" : False, "thunk" : False},
"vkFreeCommandBuffers" : {"dispatch" : True, "driver" : False, "thunk" : False},
"vkGetDeviceProcAddr" : {"dispatch" : True, "driver" : True, "thunk" : False},
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c
index 94f302d84025..0a5a77dcf3aa 100644
--- a/dlls/winevulkan/vulkan.c
+++ b/dlls/winevulkan/vulkan.c
@@ -435,6 +435,36 @@ VkResult WINAPI wine_vkAllocateCommandBuffers(VkDevice device,
return VK_SUCCESS;
}
+void WINAPI wine_vkCmdExecuteCommands(VkCommandBuffer buffer, uint32_t count,
+ const VkCommandBuffer *buffers)
+{
+ VkCommandBuffer *tmp_buffers;
+ unsigned int i;
+
+ TRACE("%p %u %p\n", buffer, count, buffers);
+
+ if (!buffers || !count)
+ return;
+
+ /* Unfortunately we need a temporary buffer as our command buffers are wrapped.
+ * This call is called often and if a performance concern, we may want to use
+ * alloca as we shouldn't need much memory and it needs to be cleaned up after
+ * the call anyway.
+ */
+ if (!(tmp_buffers = heap_alloc(count * sizeof(*tmp_buffers))))
+ {
+ ERR("Failed to allocate memory for temporary command buffers\n");
+ return;
+ }
+
+ for (i = 0; i < count; i++)
+ tmp_buffers[i] = buffers[i]->command_buffer;
+
+ buffer->device->funcs.p_vkCmdExecuteCommands(buffer->command_buffer, count, tmp_buffers);
+
+ heap_free(tmp_buffers);
+}
+
VkResult WINAPI wine_vkCreateDevice(VkPhysicalDevice phys_dev,
const VkDeviceCreateInfo *create_info,
const VkAllocationCallbacks *allocator, VkDevice *device)
diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c
index 9c50612c42a2..43b4c332d7d0 100644
--- a/dlls/winevulkan/vulkan_thunks.c
+++ b/dlls/winevulkan/vulkan_thunks.c
@@ -715,11 +715,6 @@ static void WINAPI wine_vkCmdEndRenderPass(VkCommandBuffer commandBuffer)
FIXME("stub: %p\n", commandBuffer);
}
-static void WINAPI wine_vkCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers)
-{
- FIXME("stub: %p, %u, %p\n", commandBuffer, commandBufferCount, pCommandBuffers);
-}
-
static void WINAPI wine_vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data)
{
FIXME("stub: %p, 0x%s, 0x%s, 0x%s, %u\n", commandBuffer, wine_dbgstr_longlong(dstBuffer), wine_dbgstr_longlong(dstOffset), wine_dbgstr_longlong(size), data);
diff --git a/dlls/winevulkan/vulkan_thunks.h b/dlls/winevulkan/vulkan_thunks.h
index 188598b10153..187969eed878 100644
--- a/dlls/winevulkan/vulkan_thunks.h
+++ b/dlls/winevulkan/vulkan_thunks.h
@@ -17,6 +17,7 @@ BOOL wine_vk_device_extension_supported(const char *name) DECLSPEC_HIDDEN;
/* Functions for which we have custom implementations outside of the thunks. */
VkResult WINAPI wine_vkAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout, VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) DECLSPEC_HIDDEN;
VkResult WINAPI wine_vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) DECLSPEC_HIDDEN;
+void WINAPI wine_vkCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) DECLSPEC_HIDDEN;
VkResult WINAPI wine_vkCreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) DECLSPEC_HIDDEN;
VkResult WINAPI wine_vkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) DECLSPEC_HIDDEN;
VkResult WINAPI wine_vkCreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) DECLSPEC_HIDDEN;
--
2.16.1
More information about the wine-devel
mailing list