winevulkan: Always convert 32-bit pointer arrays.

This commit is contained in:
Jacek Caban 2022-11-12 16:51:43 +01:00 committed by Alexandre Julliard
parent 3eccac388d
commit 46f84ea226
2 changed files with 59 additions and 19 deletions

View file

@ -1306,10 +1306,6 @@ class VkVariable(object):
if not conv or not self.needs_ptr32_type() or (not self.is_pointer() and self.type == "size_t"):
return prefix + self.name
# FIXME: Use conversion instead
if self.name in ["ppUsageCounts", "ppEnabledLayerNames", "ppEnabledExtensionNames"]:
return "UlongToPtr({0}{1})".format(prefix, self.name)
cast_type = ""
if self.const:
cast_type += "const "
@ -1533,6 +1529,9 @@ class VkMember(VkVariable):
# returnedonly members don't needs input conversions
if not self.is_pointer() and self.returnedonly:
return False
# pointer arrays always need input conversion
if conv and self.is_dynamic_array() and self.pointer_array:
return True
if self.is_handle():
if unwrap and self.handle.is_wrapped():
@ -2457,21 +2456,21 @@ class ArrayConversionFunction(object):
body += " convert_{0}_{1}({2}&in[i], &out[i]);\n".format(
struct.name, conv_suffix, ctx_part)
else:
body += " if (in[i])\n"
body += " {\n"
body += " out[i] = conversion_context_alloc(ctx, sizeof(*out[i]));\n"
if struct.needs_conversion(self.conv, self.unwrap, self.direction, False):
body += " if (in[i])\n"
body += " {\n"
body += " out[i] = conversion_context_alloc(ctx, sizeof(*out[i]));\n"
if self.conv:
in_param = "({0} *)UlongToPtr(in[i])".format(win_type)
else:
in_param = "in[i]"
body += " convert_{0}_{1}({2}{3}, out[i]);\n".format(
struct.name, conv_suffix, ctx_part, in_param)
body += " }\n"
body += " else\n"
body += " out[i] = NULL;\n"
else:
body += " *out[i] = *in[i];\n".format(win_type)
body += " }\n"
body += " else\n"
body += " out[i] = NULL;\n"
body += " out[i] = UlongToPtr(in[i]);\n".format(win_type)
elif self.array.is_handle():
if self.array.pointer_array:
LOGGER.error("Unhandled handle pointer arrays")
@ -2489,6 +2488,8 @@ class ArrayConversionFunction(object):
body += " out[i] = " + handle.driver_handle(input) + ";\n"
else:
LOGGER.warning("Unhandled handle output conversion")
elif self.array.pointer_array:
body += " out[i] = UlongToPtr(in[i]);\n"
else:
body += " out[i] = in[i];\n"

View file

@ -6485,7 +6485,25 @@ static inline const VkAccelerationStructureBuildGeometryInfoKHR *convert_VkAccel
#endif /* USE_STRUCT_CONVERSION */
#if defined(USE_STRUCT_CONVERSION)
static inline void convert_VkMicromapBuildInfoEXT_win32_to_host(const VkMicromapBuildInfoEXT32 *in, VkMicromapBuildInfoEXT *out)
static inline const VkMicromapUsageEXT * const*convert_VkMicromapUsageEXT_pointer_array_win32_to_host(struct conversion_context *ctx, const PTR32 *in, uint32_t count)
{
VkMicromapUsageEXT **out;
unsigned int i;
if (!in || !count) return NULL;
out = conversion_context_alloc(ctx, count * sizeof(*out));
for (i = 0; i < count; i++)
{
out[i] = UlongToPtr(in[i]);
}
return (void *)out;
}
#endif /* USE_STRUCT_CONVERSION */
#if defined(USE_STRUCT_CONVERSION)
static inline void convert_VkMicromapBuildInfoEXT_win32_to_host(struct conversion_context *ctx, const VkMicromapBuildInfoEXT32 *in, VkMicromapBuildInfoEXT *out)
{
if (!in) return;
@ -6497,7 +6515,7 @@ static inline void convert_VkMicromapBuildInfoEXT_win32_to_host(const VkMicromap
out->dstMicromap = in->dstMicromap;
out->usageCountsCount = in->usageCountsCount;
out->pUsageCounts = (const VkMicromapUsageEXT *)UlongToPtr(in->pUsageCounts);
out->ppUsageCounts = UlongToPtr(in->ppUsageCounts);
out->ppUsageCounts = convert_VkMicromapUsageEXT_pointer_array_win32_to_host(ctx, (const PTR32 *)UlongToPtr(in->ppUsageCounts), in->usageCountsCount);
out->data = in->data;
out->scratchData = in->scratchData;
out->triangleArray = in->triangleArray;
@ -6516,7 +6534,7 @@ static inline const VkMicromapBuildInfoEXT *convert_VkMicromapBuildInfoEXT_array
out = conversion_context_alloc(ctx, count * sizeof(*out));
for (i = 0; i < count; i++)
{
convert_VkMicromapBuildInfoEXT_win32_to_host(&in[i], &out[i]);
convert_VkMicromapBuildInfoEXT_win32_to_host(ctx, &in[i], &out[i]);
}
return out;
@ -9156,6 +9174,24 @@ static inline const VkDeviceQueueCreateInfo *convert_VkDeviceQueueCreateInfo_arr
}
#endif /* USE_STRUCT_CONVERSION */
#if defined(USE_STRUCT_CONVERSION)
static inline const char * const*convert_char_pointer_array_win32_to_host(struct conversion_context *ctx, const PTR32 *in, uint32_t count)
{
char **out;
unsigned int i;
if (!in || !count) return NULL;
out = conversion_context_alloc(ctx, count * sizeof(*out));
for (i = 0; i < count; i++)
{
out[i] = UlongToPtr(in[i]);
}
return (void *)out;
}
#endif /* USE_STRUCT_CONVERSION */
#if !defined(USE_STRUCT_CONVERSION)
static inline void convert_VkDeviceCreateInfo_win64_to_host(struct conversion_context *ctx, const VkDeviceCreateInfo *in, VkDeviceCreateInfo *out)
{
@ -10985,9 +11021,9 @@ static inline void convert_VkDeviceCreateInfo_win32_to_host(struct conversion_co
out->queueCreateInfoCount = in->queueCreateInfoCount;
out->pQueueCreateInfos = convert_VkDeviceQueueCreateInfo_array_win32_to_host(ctx, (const VkDeviceQueueCreateInfo32 *)UlongToPtr(in->pQueueCreateInfos), in->queueCreateInfoCount);
out->enabledLayerCount = in->enabledLayerCount;
out->ppEnabledLayerNames = UlongToPtr(in->ppEnabledLayerNames);
out->ppEnabledLayerNames = convert_char_pointer_array_win32_to_host(ctx, (const PTR32 *)UlongToPtr(in->ppEnabledLayerNames), in->enabledLayerCount);
out->enabledExtensionCount = in->enabledExtensionCount;
out->ppEnabledExtensionNames = UlongToPtr(in->ppEnabledExtensionNames);
out->ppEnabledExtensionNames = convert_char_pointer_array_win32_to_host(ctx, (const PTR32 *)UlongToPtr(in->ppEnabledExtensionNames), in->enabledExtensionCount);
out->pEnabledFeatures = (const VkPhysicalDeviceFeatures *)UlongToPtr(in->pEnabledFeatures);
for (in_header = UlongToPtr(in->pNext); in_header; in_header = UlongToPtr(in_header->pNext))
@ -14519,9 +14555,9 @@ static inline void convert_VkInstanceCreateInfo_win32_to_host(struct conversion_
out->flags = in->flags;
out->pApplicationInfo = convert_VkApplicationInfo_array_win32_to_host(ctx, (const VkApplicationInfo32 *)UlongToPtr(in->pApplicationInfo), 1);
out->enabledLayerCount = in->enabledLayerCount;
out->ppEnabledLayerNames = UlongToPtr(in->ppEnabledLayerNames);
out->ppEnabledLayerNames = convert_char_pointer_array_win32_to_host(ctx, (const PTR32 *)UlongToPtr(in->ppEnabledLayerNames), in->enabledLayerCount);
out->enabledExtensionCount = in->enabledExtensionCount;
out->ppEnabledExtensionNames = UlongToPtr(in->ppEnabledExtensionNames);
out->ppEnabledExtensionNames = convert_char_pointer_array_win32_to_host(ctx, (const PTR32 *)UlongToPtr(in->ppEnabledExtensionNames), in->enabledExtensionCount);
for (in_header = UlongToPtr(in->pNext); in_header; in_header = UlongToPtr(in_header->pNext))
{
@ -38175,13 +38211,16 @@ static NTSTATUS thunk32_vkGetMicromapBuildSizesEXT(void *args)
} *params = args;
VkMicromapBuildInfoEXT pBuildInfo_host;
VkMicromapBuildSizesInfoEXT pSizeInfo_host;
struct conversion_context ctx;
TRACE("%#x, %#x, %#x, %#x\n", params->device, params->buildType, params->pBuildInfo, params->pSizeInfo);
convert_VkMicromapBuildInfoEXT_win32_to_host((const VkMicromapBuildInfoEXT32 *)UlongToPtr(params->pBuildInfo), &pBuildInfo_host);
init_conversion_context(&ctx);
convert_VkMicromapBuildInfoEXT_win32_to_host(&ctx, (const VkMicromapBuildInfoEXT32 *)UlongToPtr(params->pBuildInfo), &pBuildInfo_host);
convert_VkMicromapBuildSizesInfoEXT_win32_to_host((VkMicromapBuildSizesInfoEXT32 *)UlongToPtr(params->pSizeInfo), &pSizeInfo_host);
wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkGetMicromapBuildSizesEXT(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->device, params->buildType, &pBuildInfo_host, &pSizeInfo_host);
convert_VkMicromapBuildSizesInfoEXT_host_to_win32(&pSizeInfo_host, (VkMicromapBuildSizesInfoEXT32 *)UlongToPtr(params->pSizeInfo));
free_conversion_context(&ctx);
return STATUS_SUCCESS;
}