[PATCH 6/7] winevulkan: Implement vkCmdExecuteCommands.
Roderick Colenbrander
thunderbird2k at gmail.com
Wed Mar 14 02:56:14 CDT 2018
Signed-off-by: Roderick Colenbrander <thunderbird2k at gmail.com>
---
dlls/winevulkan/make_vulkan | 1 +
dlls/winevulkan/vulkan.c | 31 +++++++++++++++++++++++++++++++
dlls/winevulkan/vulkan_thunks.c | 5 -----
dlls/winevulkan/vulkan_thunks.h | 1 +
4 files changed, 33 insertions(+), 5 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
index a158d88dc8..14882eb081 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 579968d5c8..902aa2e7e6 100644
--- a/dlls/winevulkan/vulkan.c
+++ b/dlls/winevulkan/vulkan.c
@@ -440,6 +440,37 @@ 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.
+ */
+ tmp_buffers = heap_alloc(count * sizeof(VkCommandBuffer));
+ if (!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 8397a223fe..4190e7ec7d 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 188598b101..187969eed8 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.14.3
More information about the wine-devel
mailing list