Skip to content

Commit 71b034c

Browse files
DadSchoorsejulliard
authored andcommitted
winevulkan: Manually fixup struct alignment for VkPipelineCreationFeedback.
We can't reasonably auto generate this because it's output in an otherwise input pNext chain. Signed-off-by: Georg Lehmann <dadschoorse@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
1 parent be8b50b commit 71b034c

File tree

4 files changed

+143
-36
lines changed

4 files changed

+143
-36
lines changed

dlls/winevulkan/make_vulkan

+8
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,8 @@ FUNCTION_OVERRIDES = {
205205
# Device functions
206206
"vkAllocateCommandBuffers" : {"dispatch" : True, "driver" : False, "thunk" : ThunkType.NONE},
207207
"vkCreateCommandPool" : {"dispatch": True, "driver" : False, "thunk" : ThunkType.NONE},
208+
"vkCreateComputePipelines" : {"dispatch": True, "driver" : False, "thunk" : ThunkType.PRIVATE},
209+
"vkCreateGraphicsPipelines" : {"dispatch": True, "driver" : False, "thunk" : ThunkType.PRIVATE},
208210
"vkDestroyCommandPool" : {"dispatch": True, "driver" : False, "thunk" : ThunkType.NONE},
209211
"vkDestroyDevice" : {"dispatch" : True, "driver" : False, "thunk" : ThunkType.NONE},
210212
"vkFreeCommandBuffers" : {"dispatch" : True, "driver" : False, "thunk" : ThunkType.NONE},
@@ -250,6 +252,9 @@ FUNCTION_OVERRIDES = {
250252
"vkGetDeviceGroupSurfacePresentModesKHR" : {"dispatch" : True, "driver" : True, "thunk" : ThunkType.PUBLIC},
251253
"vkGetPhysicalDevicePresentRectanglesKHR" : {"dispatch" : True, "driver" : True, "thunk" : ThunkType.PUBLIC},
252254

255+
# VK_KHR_ray_tracing_pipeline
256+
"vkCreateRayTracingPipelinesKHR" : {"dispatch": True, "driver" : False, "thunk" : ThunkType.PRIVATE},
257+
253258
# VK_EXT_calibrated_timestamps
254259
"vkGetPhysicalDeviceCalibrateableTimeDomainsEXT" : {"dispatch" : True, "driver" : False, "thunk" : ThunkType.NONE},
255260
"vkGetCalibratedTimestampsEXT" : {"dispatch" : True, "driver" : False, "thunk" : ThunkType.NONE},
@@ -261,6 +266,9 @@ FUNCTION_OVERRIDES = {
261266
# VK_EXT_debug_report
262267
"vkCreateDebugReportCallbackEXT" : {"dispatch": True, "driver" : False, "thunk" : ThunkType.NONE},
263268
"vkDestroyDebugReportCallbackEXT" : {"dispatch": True, "driver" : False, "thunk" : ThunkType.NONE},
269+
270+
# VK_NV_ray_tracing
271+
"vkCreateRayTracingPipelinesNV" : {"dispatch": True, "driver" : False, "thunk" : ThunkType.PRIVATE},
264272
}
265273

266274
STRUCT_CHAIN_CONVERSIONS = {

dlls/winevulkan/vulkan.c

+107
Original file line numberDiff line numberDiff line change
@@ -1758,6 +1758,113 @@ NTSTATUS wine_vkDestroyDebugReportCallbackEXT(void *args)
17581758
return STATUS_SUCCESS;
17591759
}
17601760

1761+
static void fixup_pipeline_feedback(VkPipelineCreationFeedback *feedback, uint32_t count)
1762+
{
1763+
#if defined(USE_STRUCT_CONVERSION)
1764+
struct host_pipeline_feedback
1765+
{
1766+
VkPipelineCreationFeedbackFlags flags;
1767+
uint64_t duration;
1768+
} *host_feedback;
1769+
int64_t i;
1770+
1771+
host_feedback = (void *) feedback;
1772+
1773+
for (i = count - 1; i >= 0; i--)
1774+
{
1775+
memmove(&feedback[i].duration, &host_feedback[i].duration, sizeof(uint64_t));
1776+
feedback[i].flags = host_feedback[i].flags;
1777+
}
1778+
#endif
1779+
}
1780+
1781+
static void fixup_pipeline_feedback_info(const void *pipeline_info)
1782+
{
1783+
VkPipelineCreationFeedbackCreateInfo *feedback;
1784+
1785+
feedback = wine_vk_find_struct(pipeline_info, PIPELINE_CREATION_FEEDBACK_CREATE_INFO);
1786+
1787+
if (!feedback)
1788+
return;
1789+
1790+
fixup_pipeline_feedback(feedback->pPipelineCreationFeedback, 1);
1791+
fixup_pipeline_feedback(feedback->pPipelineStageCreationFeedbacks,
1792+
feedback->pipelineStageCreationFeedbackCount);
1793+
}
1794+
1795+
NTSTATUS wine_vkCreateComputePipelines(void *args)
1796+
{
1797+
struct vkCreateComputePipelines_params *params = args;
1798+
VkResult res;
1799+
uint32_t i;
1800+
1801+
TRACE("%p, 0x%s, %u, %p, %p, %p\n", params->device, wine_dbgstr_longlong(params->pipelineCache),
1802+
params->createInfoCount, params->pCreateInfos, params->pAllocator, params->pPipelines);
1803+
1804+
res = thunk_vkCreateComputePipelines(params->device, params->pipelineCache,
1805+
params->createInfoCount, params->pCreateInfos, params->pAllocator, params->pPipelines);
1806+
1807+
for (i = 0; i < params->createInfoCount; i++)
1808+
fixup_pipeline_feedback_info(&params->pCreateInfos[i]);
1809+
1810+
return res;
1811+
}
1812+
1813+
NTSTATUS wine_vkCreateGraphicsPipelines(void *args)
1814+
{
1815+
struct vkCreateGraphicsPipelines_params *params = args;
1816+
VkResult res;
1817+
uint32_t i;
1818+
1819+
TRACE("%p, 0x%s, %u, %p, %p, %p\n", params->device, wine_dbgstr_longlong(params->pipelineCache),
1820+
params->createInfoCount, params->pCreateInfos, params->pAllocator, params->pPipelines);
1821+
1822+
res = thunk_vkCreateGraphicsPipelines(params->device, params->pipelineCache,
1823+
params->createInfoCount, params->pCreateInfos, params->pAllocator, params->pPipelines);
1824+
1825+
for (i = 0; i < params->createInfoCount; i++)
1826+
fixup_pipeline_feedback_info(&params->pCreateInfos[i]);
1827+
1828+
return res;
1829+
}
1830+
1831+
NTSTATUS wine_vkCreateRayTracingPipelinesKHR(void *args)
1832+
{
1833+
struct vkCreateRayTracingPipelinesKHR_params *params = args;
1834+
VkResult res;
1835+
uint32_t i;
1836+
1837+
TRACE("%p, 0x%s, 0x%s, %u, %p, %p, %p\n", params->device,
1838+
wine_dbgstr_longlong(params->deferredOperation), wine_dbgstr_longlong(params->pipelineCache),
1839+
params->createInfoCount, params->pCreateInfos, params->pAllocator, params->pPipelines);
1840+
1841+
res = thunk_vkCreateRayTracingPipelinesKHR(params->device, params->deferredOperation, params->pipelineCache,
1842+
params->createInfoCount, params->pCreateInfos, params->pAllocator, params->pPipelines);
1843+
1844+
for (i = 0; i < params->createInfoCount; i++)
1845+
fixup_pipeline_feedback_info(&params->pCreateInfos[i]);
1846+
1847+
return res;
1848+
}
1849+
1850+
NTSTATUS wine_vkCreateRayTracingPipelinesNV(void *args)
1851+
{
1852+
struct vkCreateRayTracingPipelinesNV_params *params = args;
1853+
VkResult res;
1854+
uint32_t i;
1855+
1856+
TRACE("%p, 0x%s, %u, %p, %p, %p\n", params->device, wine_dbgstr_longlong(params->pipelineCache),
1857+
params->createInfoCount, params->pCreateInfos, params->pAllocator, params->pPipelines);
1858+
1859+
res = thunk_vkCreateRayTracingPipelinesNV(params->device, params->pipelineCache,
1860+
params->createInfoCount, params->pCreateInfos, params->pAllocator, params->pPipelines);
1861+
1862+
for (i = 0; i < params->createInfoCount; i++)
1863+
fixup_pipeline_feedback_info(&params->pCreateInfos[i]);
1864+
1865+
return res;
1866+
}
1867+
17611868
BOOL WINAPI wine_vk_is_available_instance_function(VkInstance instance, const char *name)
17621869
{
17631870
return !!vk_funcs->p_vkGetInstanceProcAddr(instance->instance, name);

dlls/winevulkan/vulkan_thunks.c

+20-36
Original file line numberDiff line numberDiff line change
@@ -7155,22 +7155,18 @@ static NTSTATUS wine_vkCreateBufferView(void *args)
71557155
#endif
71567156
}
71577157

7158-
static NTSTATUS wine_vkCreateComputePipelines(void *args)
7158+
VkResult thunk_vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines)
71597159
{
7160-
struct vkCreateComputePipelines_params *params = args;
71617160
#if defined(USE_STRUCT_CONVERSION)
71627161
VkResult result;
71637162
VkComputePipelineCreateInfo_host *pCreateInfos_host;
7164-
TRACE("%p, 0x%s, %u, %p, %p, %p\n", params->device, wine_dbgstr_longlong(params->pipelineCache), params->createInfoCount, params->pCreateInfos, params->pAllocator, params->pPipelines);
7163+
pCreateInfos_host = convert_VkComputePipelineCreateInfo_array_win_to_host(pCreateInfos, createInfoCount);
7164+
result = device->funcs.p_vkCreateComputePipelines(device->device, pipelineCache, createInfoCount, pCreateInfos_host, NULL, pPipelines);
71657165

7166-
pCreateInfos_host = convert_VkComputePipelineCreateInfo_array_win_to_host(params->pCreateInfos, params->createInfoCount);
7167-
result = params->device->funcs.p_vkCreateComputePipelines(params->device->device, params->pipelineCache, params->createInfoCount, pCreateInfos_host, NULL, params->pPipelines);
7168-
7169-
free_VkComputePipelineCreateInfo_array(pCreateInfos_host, params->createInfoCount);
7166+
free_VkComputePipelineCreateInfo_array(pCreateInfos_host, createInfoCount);
71707167
return result;
71717168
#else
7172-
TRACE("%p, 0x%s, %u, %p, %p, %p\n", params->device, wine_dbgstr_longlong(params->pipelineCache), params->createInfoCount, params->pCreateInfos, params->pAllocator, params->pPipelines);
7173-
return params->device->funcs.p_vkCreateComputePipelines(params->device->device, params->pipelineCache, params->createInfoCount, params->pCreateInfos, NULL, params->pPipelines);
7169+
return device->funcs.p_vkCreateComputePipelines(device->device, pipelineCache, createInfoCount, pCreateInfos, NULL, pPipelines);
71747170
#endif
71757171
}
71767172

@@ -7288,22 +7284,18 @@ static NTSTATUS wine_vkCreateFramebuffer(void *args)
72887284
#endif
72897285
}
72907286

7291-
static NTSTATUS wine_vkCreateGraphicsPipelines(void *args)
7287+
VkResult thunk_vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines)
72927288
{
7293-
struct vkCreateGraphicsPipelines_params *params = args;
72947289
#if defined(USE_STRUCT_CONVERSION)
72957290
VkResult result;
72967291
VkGraphicsPipelineCreateInfo_host *pCreateInfos_host;
7297-
TRACE("%p, 0x%s, %u, %p, %p, %p\n", params->device, wine_dbgstr_longlong(params->pipelineCache), params->createInfoCount, params->pCreateInfos, params->pAllocator, params->pPipelines);
7298-
7299-
pCreateInfos_host = convert_VkGraphicsPipelineCreateInfo_array_win_to_host(params->pCreateInfos, params->createInfoCount);
7300-
result = params->device->funcs.p_vkCreateGraphicsPipelines(params->device->device, params->pipelineCache, params->createInfoCount, pCreateInfos_host, NULL, params->pPipelines);
7292+
pCreateInfos_host = convert_VkGraphicsPipelineCreateInfo_array_win_to_host(pCreateInfos, createInfoCount);
7293+
result = device->funcs.p_vkCreateGraphicsPipelines(device->device, pipelineCache, createInfoCount, pCreateInfos_host, NULL, pPipelines);
73017294

7302-
free_VkGraphicsPipelineCreateInfo_array(pCreateInfos_host, params->createInfoCount);
7295+
free_VkGraphicsPipelineCreateInfo_array(pCreateInfos_host, createInfoCount);
73037296
return result;
73047297
#else
7305-
TRACE("%p, 0x%s, %u, %p, %p, %p\n", params->device, wine_dbgstr_longlong(params->pipelineCache), params->createInfoCount, params->pCreateInfos, params->pAllocator, params->pPipelines);
7306-
return params->device->funcs.p_vkCreateGraphicsPipelines(params->device->device, params->pipelineCache, params->createInfoCount, params->pCreateInfos, NULL, params->pPipelines);
7298+
return device->funcs.p_vkCreateGraphicsPipelines(device->device, pipelineCache, createInfoCount, pCreateInfos, NULL, pPipelines);
73077299
#endif
73087300
}
73097301

@@ -7386,41 +7378,33 @@ static NTSTATUS wine_vkCreateQueryPool(void *args)
73867378
return params->device->funcs.p_vkCreateQueryPool(params->device->device, params->pCreateInfo, NULL, params->pQueryPool);
73877379
}
73887380

7389-
static NTSTATUS wine_vkCreateRayTracingPipelinesKHR(void *args)
7381+
VkResult thunk_vkCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkRayTracingPipelineCreateInfoKHR *pCreateInfos, const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines)
73907382
{
7391-
struct vkCreateRayTracingPipelinesKHR_params *params = args;
73927383
#if defined(USE_STRUCT_CONVERSION)
73937384
VkResult result;
73947385
VkRayTracingPipelineCreateInfoKHR_host *pCreateInfos_host;
7395-
TRACE("%p, 0x%s, 0x%s, %u, %p, %p, %p\n", params->device, wine_dbgstr_longlong(params->deferredOperation), wine_dbgstr_longlong(params->pipelineCache), params->createInfoCount, params->pCreateInfos, params->pAllocator, params->pPipelines);
7386+
pCreateInfos_host = convert_VkRayTracingPipelineCreateInfoKHR_array_win_to_host(pCreateInfos, createInfoCount);
7387+
result = device->funcs.p_vkCreateRayTracingPipelinesKHR(device->device, deferredOperation, pipelineCache, createInfoCount, pCreateInfos_host, NULL, pPipelines);
73967388

7397-
pCreateInfos_host = convert_VkRayTracingPipelineCreateInfoKHR_array_win_to_host(params->pCreateInfos, params->createInfoCount);
7398-
result = params->device->funcs.p_vkCreateRayTracingPipelinesKHR(params->device->device, params->deferredOperation, params->pipelineCache, params->createInfoCount, pCreateInfos_host, NULL, params->pPipelines);
7399-
7400-
free_VkRayTracingPipelineCreateInfoKHR_array(pCreateInfos_host, params->createInfoCount);
7389+
free_VkRayTracingPipelineCreateInfoKHR_array(pCreateInfos_host, createInfoCount);
74017390
return result;
74027391
#else
7403-
TRACE("%p, 0x%s, 0x%s, %u, %p, %p, %p\n", params->device, wine_dbgstr_longlong(params->deferredOperation), wine_dbgstr_longlong(params->pipelineCache), params->createInfoCount, params->pCreateInfos, params->pAllocator, params->pPipelines);
7404-
return params->device->funcs.p_vkCreateRayTracingPipelinesKHR(params->device->device, params->deferredOperation, params->pipelineCache, params->createInfoCount, params->pCreateInfos, NULL, params->pPipelines);
7392+
return device->funcs.p_vkCreateRayTracingPipelinesKHR(device->device, deferredOperation, pipelineCache, createInfoCount, pCreateInfos, NULL, pPipelines);
74057393
#endif
74067394
}
74077395

7408-
static NTSTATUS wine_vkCreateRayTracingPipelinesNV(void *args)
7396+
VkResult thunk_vkCreateRayTracingPipelinesNV(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkRayTracingPipelineCreateInfoNV *pCreateInfos, const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines)
74097397
{
7410-
struct vkCreateRayTracingPipelinesNV_params *params = args;
74117398
#if defined(USE_STRUCT_CONVERSION)
74127399
VkResult result;
74137400
VkRayTracingPipelineCreateInfoNV_host *pCreateInfos_host;
7414-
TRACE("%p, 0x%s, %u, %p, %p, %p\n", params->device, wine_dbgstr_longlong(params->pipelineCache), params->createInfoCount, params->pCreateInfos, params->pAllocator, params->pPipelines);
7415-
7416-
pCreateInfos_host = convert_VkRayTracingPipelineCreateInfoNV_array_win_to_host(params->pCreateInfos, params->createInfoCount);
7417-
result = params->device->funcs.p_vkCreateRayTracingPipelinesNV(params->device->device, params->pipelineCache, params->createInfoCount, pCreateInfos_host, NULL, params->pPipelines);
7401+
pCreateInfos_host = convert_VkRayTracingPipelineCreateInfoNV_array_win_to_host(pCreateInfos, createInfoCount);
7402+
result = device->funcs.p_vkCreateRayTracingPipelinesNV(device->device, pipelineCache, createInfoCount, pCreateInfos_host, NULL, pPipelines);
74187403

7419-
free_VkRayTracingPipelineCreateInfoNV_array(pCreateInfos_host, params->createInfoCount);
7404+
free_VkRayTracingPipelineCreateInfoNV_array(pCreateInfos_host, createInfoCount);
74207405
return result;
74217406
#else
7422-
TRACE("%p, 0x%s, %u, %p, %p, %p\n", params->device, wine_dbgstr_longlong(params->pipelineCache), params->createInfoCount, params->pCreateInfos, params->pAllocator, params->pPipelines);
7423-
return params->device->funcs.p_vkCreateRayTracingPipelinesNV(params->device->device, params->pipelineCache, params->createInfoCount, params->pCreateInfos, NULL, params->pPipelines);
7407+
return device->funcs.p_vkCreateRayTracingPipelinesNV(device->device, pipelineCache, createInfoCount, pCreateInfos, NULL, pPipelines);
74247408
#endif
74257409
}
74267410

dlls/winevulkan/vulkan_thunks.h

+8
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,14 @@
1717
/* Functions for which we have custom implementations outside of the thunks. */
1818
NTSTATUS wine_vkAllocateCommandBuffers(void *args) DECLSPEC_HIDDEN;
1919
NTSTATUS wine_vkCreateCommandPool(void *args) DECLSPEC_HIDDEN;
20+
NTSTATUS wine_vkCreateComputePipelines(void *args) DECLSPEC_HIDDEN;
2021
NTSTATUS wine_vkCreateDebugReportCallbackEXT(void *args) DECLSPEC_HIDDEN;
2122
NTSTATUS wine_vkCreateDebugUtilsMessengerEXT(void *args) DECLSPEC_HIDDEN;
2223
NTSTATUS wine_vkCreateDevice(void *args) DECLSPEC_HIDDEN;
24+
NTSTATUS wine_vkCreateGraphicsPipelines(void *args) DECLSPEC_HIDDEN;
2325
NTSTATUS wine_vkCreateInstance(void *args) DECLSPEC_HIDDEN;
26+
NTSTATUS wine_vkCreateRayTracingPipelinesKHR(void *args) DECLSPEC_HIDDEN;
27+
NTSTATUS wine_vkCreateRayTracingPipelinesNV(void *args) DECLSPEC_HIDDEN;
2428
NTSTATUS wine_vkCreateWin32SurfaceKHR(void *args) DECLSPEC_HIDDEN;
2529
NTSTATUS wine_vkDestroyCommandPool(void *args) DECLSPEC_HIDDEN;
2630
NTSTATUS wine_vkDestroyDebugReportCallbackEXT(void *args) DECLSPEC_HIDDEN;
@@ -55,6 +59,10 @@ NTSTATUS wine_vkGetPhysicalDeviceSurfaceCapabilities2KHR(void *args) DECLSPEC_HI
5559
NTSTATUS wine_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(void *args) DECLSPEC_HIDDEN;
5660

5761
/* Private thunks */
62+
VkResult thunk_vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) DECLSPEC_HIDDEN;
63+
VkResult thunk_vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) DECLSPEC_HIDDEN;
64+
VkResult thunk_vkCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkRayTracingPipelineCreateInfoKHR *pCreateInfos, const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) DECLSPEC_HIDDEN;
65+
VkResult thunk_vkCreateRayTracingPipelinesNV(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkRayTracingPipelineCreateInfoNV *pCreateInfos, const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) DECLSPEC_HIDDEN;
5866
VkResult thunk_vkGetPhysicalDeviceImageFormatProperties2(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2 *pImageFormatInfo, VkImageFormatProperties2 *pImageFormatProperties) DECLSPEC_HIDDEN;
5967
VkResult thunk_vkGetPhysicalDeviceImageFormatProperties2KHR(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2 *pImageFormatInfo, VkImageFormatProperties2 *pImageFormatProperties) DECLSPEC_HIDDEN;
6068
VkResult thunk_vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo, VkSurfaceCapabilities2KHR *pSurfaceCapabilities) DECLSPEC_HIDDEN;

0 commit comments

Comments
 (0)