diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 71571bec180..95354f8fa0d 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -1105,7 +1105,8 @@ class VkHandle(object): class VkVariable(object): def __init__(self, const=False, type_info=None, type=None, name=None, pointer=None, array_len=None, - dyn_array_len=None, object_type=None, optional=False, returnedonly=False, parent=None): + dyn_array_len=None, object_type=None, optional=False, returnedonly=False, parent=None, + selection=None, selector=None): self.const = const self.type_info = type_info self.type = type @@ -1114,6 +1115,8 @@ class VkVariable(object): self.object_type = object_type self.optional = optional self.returnedonly = returnedonly + self.selection = selection + self.selector = selector self.pointer = pointer self.array_len = array_len @@ -1139,7 +1142,7 @@ class VkVariable(object): """ self.type_info = type_info self.handle = type_info["data"] if type_info["category"] == "handle" else None - self.struct = type_info["data"] if type_info["category"] == "struct" else None + self.struct = type_info["data"] if type_info["category"] == "struct" or type_info["category"] == "union" else None def get_dyn_array_len(self, prefix, conv): if isinstance(self.dyn_array_len, int): @@ -1189,7 +1192,7 @@ class VkVariable(object): return self.handle is not None def is_struct(self): - return self.struct is not None + return self.type_info["category"] == "struct" def is_union(self): return self.type_info["category"] == "union" @@ -1264,10 +1267,10 @@ class VkVariable(object): return self.needs_conversion(conv, unwrap, Direction.INPUT, False) \ or self.needs_conversion(conv, unwrap, Direction.OUTPUT, False) - return self.is_struct() and self.struct.needs_alloc(conv, unwrap) + return (self.is_struct() or self.is_union()) and self.struct.needs_alloc(conv, unwrap) def needs_host_type(self): - return self.is_struct() and self.struct.needs_host_type() + return (self.is_struct() or self.is_union()) and self.struct.needs_host_type() def get_conversions(self, unwrap, parent_const=False): """ Get a list of conversions required for this parameter if any. @@ -1281,7 +1284,7 @@ class VkVariable(object): # Collect any member conversions first, so we can guarantee # those functions will be defined prior to usage by the # 'parent' param requiring conversion. - if self.is_struct(): + if self.is_struct() or self.is_union(): struct = self.struct is_const = self.is_const() if self.is_pointer() else parent_const @@ -1335,10 +1338,10 @@ class VkVariable(object): class VkMember(VkVariable): def __init__(self, const=False, struct_fwd_decl=False,_type=None, pointer=None, name=None, array_len=None, dyn_array_len=None, optional=False, values=None, object_type=None, bit_width=None, - returnedonly=False, parent=None): + returnedonly=False, parent=None, selection=None, selector=None): VkVariable.__init__(self, const=const, type=_type, name=name, pointer=pointer, array_len=array_len, dyn_array_len=dyn_array_len, object_type=object_type, optional=optional, - returnedonly=returnedonly, parent=parent) + returnedonly=returnedonly, parent=parent, selection=selection, selector=selector) self.struct_fwd_decl = struct_fwd_decl self.values = values self.bit_width = bit_width @@ -1411,10 +1414,13 @@ class VkMember(VkVariable): LOGGER.debug("Found bit field") bit_width = int(name_elem.tail[1:]) + selection = member.get("selection").split(',') if member.get("selection") else None + selector = member.get("selector", None) + return VkMember(const=const, struct_fwd_decl=struct_fwd_decl, _type=member_type, pointer=pointer, name=name_elem.text, array_len=array_len, dyn_array_len=dyn_array_len, optional=optional, values=values, object_type=object_type, bit_width=bit_width, returnedonly=returnedonly, - parent=parent) + parent=parent, selection=selection, selector=selector) def copy(self, input, output, direction, conv, unwrap): """ Helper method for use by conversion logic to generate a C-code statement to copy this member. @@ -1457,12 +1463,13 @@ class VkMember(VkVariable): else: return "{0}{1} = wine_vk_unwrap_handle({2}{3}, {2}{1});\n".format(output, self.name, input, self.object_type) else: + selector_part = ", {0}{1}".format(input, self.selector) if self.selector else "" if direction == Direction.OUTPUT: - return "convert_{0}_host_to_{4}(&{2}{1}, &{3}{1});\n".format(self.type, self.name, input, output, win_type) + return "convert_{0}_host_to_{4}(&{2}{1}, &{3}{1}{5});\n".format(self.type, self.name, input, output, win_type, selector_part) else: ctx_param = "ctx, " if self.needs_alloc(conv, unwrap) else "" host_part = "host" if unwrap else "unwrapped_host" - return "convert_{0}_{4}_to_{6}({5}&{2}{1}, &{3}{1});\n".format(self.type, self.name, input, output, win_type, ctx_param, host_part) + return "convert_{0}_{4}_to_{6}({5}&{2}{1}, &{3}{1}{7});\n".format(self.type, self.name, input, output, win_type, ctx_param, host_part, selector_part) elif self.is_static_array(): bytes_count = "{0} * sizeof({1})".format(self.array_len, self.type) return "memcpy({0}{1}, {2}{1}, {3});\n".format(output, self.name, input, bytes_count) @@ -1548,7 +1555,7 @@ class VkMember(VkVariable): elif self.is_generic_handle(): if unwrap: return True - elif self.is_struct(): + elif self.is_struct() or self.is_union(): if self.struct.needs_conversion(conv, unwrap, direction, is_const): return True @@ -1895,7 +1902,8 @@ class VkStruct(Sequence): # Those structs don't have returnedonly in spec, but they could (should?). if name in ["VkSurfaceCapabilitiesPresentBarrierNV", - "VkCooperativeMatrixPropertiesNV"]: + "VkCooperativeMatrixPropertiesNV", + "VkPerformanceValueINTEL"]: returnedonly = True structextends = struct.attrib.get("structextends") @@ -2135,7 +2143,7 @@ class VkStruct(Sequence): return True if m.needs_alignment(): return True - if m.is_struct() and m.struct.needs_host_type(): + if (m.is_struct() or m.is_union()) and m.struct.needs_host_type(): return True def set_type_info(self, types): @@ -2230,6 +2238,9 @@ class StructConversionFunction(object): else: params = ["const {0} *in".format(win_type), "{0} *out".format(self.type)] + if self.operand[0].selection: + params.append("VkFlags selector") + # Generate parameter list if needs_alloc: body += "struct conversion_context *ctx, " @@ -2273,6 +2284,11 @@ class StructConversionFunction(object): body += " out->pNext = NULL;\n" continue + if m.selection: + body += " if (" + body += " || ".join("selector == {}".format(s) for s in m.selection) + body += ")\n " + body += " " + m.copy("in->", "out->", self.direction, self.conv, self.unwrap) if needs_extensions: diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c index 98dd8b5eb97..9e5ab4d8c3b 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -308,15 +308,84 @@ typedef struct VkBindImageMemoryInfo32 } VkBindImageMemoryInfo32; typedef VkBindImageMemoryInfo32 VkBindImageMemoryInfoKHR32; +typedef union VkDeviceOrHostAddressConstKHR32 +{ + VkDeviceAddress DECLSPEC_ALIGN(8) deviceAddress; + PTR32 hostAddress; +} VkDeviceOrHostAddressConstKHR32; + +typedef struct VkAccelerationStructureGeometryMotionTrianglesDataNV32 +{ + VkStructureType sType; + PTR32 pNext; + VkDeviceOrHostAddressConstKHR32 DECLSPEC_ALIGN(8) vertexData; +} VkAccelerationStructureGeometryMotionTrianglesDataNV32; + +typedef struct VkAccelerationStructureTrianglesOpacityMicromapEXT32 +{ + VkStructureType sType; + PTR32 pNext; + VkIndexType indexType; + VkDeviceOrHostAddressConstKHR32 DECLSPEC_ALIGN(8) indexBuffer; + VkDeviceSize DECLSPEC_ALIGN(8) indexStride; + uint32_t baseTriangle; + uint32_t usageCountsCount; + PTR32 pUsageCounts; + PTR32 ppUsageCounts; + VkMicromapEXT DECLSPEC_ALIGN(8) micromap; +} VkAccelerationStructureTrianglesOpacityMicromapEXT32; + +typedef struct VkAccelerationStructureGeometryTrianglesDataKHR32 +{ + VkStructureType sType; + PTR32 pNext; + VkFormat vertexFormat; + VkDeviceOrHostAddressConstKHR32 DECLSPEC_ALIGN(8) vertexData; + VkDeviceSize DECLSPEC_ALIGN(8) vertexStride; + uint32_t maxVertex; + VkIndexType indexType; + VkDeviceOrHostAddressConstKHR32 DECLSPEC_ALIGN(8) indexData; + VkDeviceOrHostAddressConstKHR32 DECLSPEC_ALIGN(8) transformData; +} VkAccelerationStructureGeometryTrianglesDataKHR32; + +typedef struct VkAccelerationStructureGeometryAabbsDataKHR32 +{ + VkStructureType sType; + PTR32 pNext; + VkDeviceOrHostAddressConstKHR32 DECLSPEC_ALIGN(8) data; + VkDeviceSize DECLSPEC_ALIGN(8) stride; +} VkAccelerationStructureGeometryAabbsDataKHR32; + +typedef struct VkAccelerationStructureGeometryInstancesDataKHR32 +{ + VkStructureType sType; + PTR32 pNext; + VkBool32 arrayOfPointers; + VkDeviceOrHostAddressConstKHR32 DECLSPEC_ALIGN(8) data; +} VkAccelerationStructureGeometryInstancesDataKHR32; + +typedef union VkAccelerationStructureGeometryDataKHR32 +{ + VkAccelerationStructureGeometryTrianglesDataKHR32 DECLSPEC_ALIGN(8) triangles; + VkAccelerationStructureGeometryAabbsDataKHR32 DECLSPEC_ALIGN(8) aabbs; + VkAccelerationStructureGeometryInstancesDataKHR32 DECLSPEC_ALIGN(8) instances; +} VkAccelerationStructureGeometryDataKHR32; + typedef struct VkAccelerationStructureGeometryKHR32 { VkStructureType sType; PTR32 pNext; VkGeometryTypeKHR geometryType; - VkAccelerationStructureGeometryDataKHR DECLSPEC_ALIGN(8) geometry; + VkAccelerationStructureGeometryDataKHR32 DECLSPEC_ALIGN(8) geometry; VkGeometryFlagsKHR flags; } VkAccelerationStructureGeometryKHR32; +typedef union VkDeviceOrHostAddressKHR32 +{ + VkDeviceAddress DECLSPEC_ALIGN(8) deviceAddress; + PTR32 hostAddress; +} VkDeviceOrHostAddressKHR32; + typedef struct VkAccelerationStructureBuildGeometryInfoKHR32 { VkStructureType sType; @@ -329,7 +398,7 @@ typedef struct VkAccelerationStructureBuildGeometryInfoKHR32 uint32_t geometryCount; PTR32 pGeometries; PTR32 ppGeometries; - VkDeviceOrHostAddressKHR DECLSPEC_ALIGN(8) scratchData; + VkDeviceOrHostAddressKHR32 DECLSPEC_ALIGN(8) scratchData; } VkAccelerationStructureBuildGeometryInfoKHR32; typedef struct VkMicromapBuildInfoEXT32 @@ -343,9 +412,9 @@ typedef struct VkMicromapBuildInfoEXT32 uint32_t usageCountsCount; PTR32 pUsageCounts; PTR32 ppUsageCounts; - VkDeviceOrHostAddressConstKHR DECLSPEC_ALIGN(8) data; - VkDeviceOrHostAddressKHR DECLSPEC_ALIGN(8) scratchData; - VkDeviceOrHostAddressConstKHR DECLSPEC_ALIGN(8) triangleArray; + VkDeviceOrHostAddressConstKHR32 DECLSPEC_ALIGN(8) data; + VkDeviceOrHostAddressKHR32 DECLSPEC_ALIGN(8) scratchData; + VkDeviceOrHostAddressConstKHR32 DECLSPEC_ALIGN(8) triangleArray; VkDeviceSize DECLSPEC_ALIGN(8) triangleArrayStride; } VkMicromapBuildInfoEXT32; @@ -597,7 +666,7 @@ typedef struct VkCopyAccelerationStructureToMemoryInfoKHR32 VkStructureType sType; PTR32 pNext; VkAccelerationStructureKHR DECLSPEC_ALIGN(8) src; - VkDeviceOrHostAddressKHR DECLSPEC_ALIGN(8) dst; + VkDeviceOrHostAddressKHR32 DECLSPEC_ALIGN(8) dst; VkCopyAccelerationStructureModeKHR mode; } VkCopyAccelerationStructureToMemoryInfoKHR32; @@ -705,7 +774,7 @@ typedef struct VkCopyMemoryToAccelerationStructureInfoKHR32 { VkStructureType sType; PTR32 pNext; - VkDeviceOrHostAddressConstKHR DECLSPEC_ALIGN(8) src; + VkDeviceOrHostAddressConstKHR32 DECLSPEC_ALIGN(8) src; VkAccelerationStructureKHR DECLSPEC_ALIGN(8) dst; VkCopyAccelerationStructureModeKHR mode; } VkCopyMemoryToAccelerationStructureInfoKHR32; @@ -714,7 +783,7 @@ typedef struct VkCopyMemoryToMicromapInfoEXT32 { VkStructureType sType; PTR32 pNext; - VkDeviceOrHostAddressConstKHR DECLSPEC_ALIGN(8) src; + VkDeviceOrHostAddressConstKHR32 DECLSPEC_ALIGN(8) src; VkMicromapEXT DECLSPEC_ALIGN(8) dst; VkCopyMicromapModeEXT mode; } VkCopyMemoryToMicromapInfoEXT32; @@ -733,7 +802,7 @@ typedef struct VkCopyMicromapToMemoryInfoEXT32 VkStructureType sType; PTR32 pNext; VkMicromapEXT DECLSPEC_ALIGN(8) src; - VkDeviceOrHostAddressKHR DECLSPEC_ALIGN(8) dst; + VkDeviceOrHostAddressKHR32 DECLSPEC_ALIGN(8) dst; VkCopyMicromapModeEXT mode; } VkCopyMicromapToMemoryInfoEXT32; @@ -4168,10 +4237,19 @@ typedef struct VkMicromapBuildSizesInfoEXT32 VkBool32 discardable; } VkMicromapBuildSizesInfoEXT32; +typedef union VkPerformanceValueDataINTEL32 +{ + uint32_t value32; + uint64_t DECLSPEC_ALIGN(8) value64; + float valueFloat; + VkBool32 valueBool; + PTR32 valueString; +} VkPerformanceValueDataINTEL32; + typedef struct VkPerformanceValueINTEL32 { VkPerformanceValueTypeINTEL type; - VkPerformanceValueDataINTEL DECLSPEC_ALIGN(8) data; + VkPerformanceValueDataINTEL32 DECLSPEC_ALIGN(8) data; } VkPerformanceValueINTEL32; typedef struct VkCooperativeMatrixPropertiesNV32 @@ -5486,6 +5564,14 @@ typedef struct VkPipelineExecutablePropertiesKHR32 uint32_t subgroupSize; } VkPipelineExecutablePropertiesKHR32; +typedef union VkPipelineExecutableStatisticValueKHR32 +{ + VkBool32 b32; + int64_t i64; + uint64_t DECLSPEC_ALIGN(8) u64; + double f64; +} VkPipelineExecutableStatisticValueKHR32; + typedef struct VkPipelineExecutableStatisticKHR32 { VkStructureType sType; @@ -5493,7 +5579,7 @@ typedef struct VkPipelineExecutableStatisticKHR32 char name[VK_MAX_DESCRIPTION_SIZE]; char description[VK_MAX_DESCRIPTION_SIZE]; VkPipelineExecutableStatisticFormatKHR format; - VkPipelineExecutableStatisticValueKHR DECLSPEC_ALIGN(8) value; + VkPipelineExecutableStatisticValueKHR32 DECLSPEC_ALIGN(8) value; } VkPipelineExecutableStatisticKHR32; @@ -6366,14 +6452,131 @@ static inline const VkBindImageMemoryInfo *convert_VkBindImageMemoryInfo_array_w return out; } -static inline void convert_VkAccelerationStructureGeometryKHR_win32_to_host(const VkAccelerationStructureGeometryKHR32 *in, VkAccelerationStructureGeometryKHR *out) +static inline void convert_VkDeviceOrHostAddressConstKHR_win32_to_host(const VkDeviceOrHostAddressConstKHR32 *in, VkDeviceOrHostAddressConstKHR *out) +{ + if (!in) return; + + out->deviceAddress = in->deviceAddress; + out->hostAddress = (const void *)UlongToPtr(in->hostAddress); +} + +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; +} + +static inline void convert_VkAccelerationStructureGeometryTrianglesDataKHR_win32_to_host(struct conversion_context *ctx, const VkAccelerationStructureGeometryTrianglesDataKHR32 *in, VkAccelerationStructureGeometryTrianglesDataKHR *out) +{ + const VkBaseInStructure32 *in_header; + VkBaseOutStructure *out_header = (void *)out; + + if (!in) return; + + out->sType = in->sType; + out->pNext = NULL; + out->vertexFormat = in->vertexFormat; + convert_VkDeviceOrHostAddressConstKHR_win32_to_host(&in->vertexData, &out->vertexData); + out->vertexStride = in->vertexStride; + out->maxVertex = in->maxVertex; + out->indexType = in->indexType; + convert_VkDeviceOrHostAddressConstKHR_win32_to_host(&in->indexData, &out->indexData); + convert_VkDeviceOrHostAddressConstKHR_win32_to_host(&in->transformData, &out->transformData); + + for (in_header = UlongToPtr(in->pNext); in_header; in_header = UlongToPtr(in_header->pNext)) + { + switch (in_header->sType) + { + case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV: + { + VkAccelerationStructureGeometryMotionTrianglesDataNV *out_ext = conversion_context_alloc(ctx, sizeof(*out_ext)); + const VkAccelerationStructureGeometryMotionTrianglesDataNV32 *in_ext = (const VkAccelerationStructureGeometryMotionTrianglesDataNV32 *)in_header; + out_ext->sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV; + out_ext->pNext = NULL; + convert_VkDeviceOrHostAddressConstKHR_win32_to_host(&in_ext->vertexData, &out_ext->vertexData); + out_header->pNext = (void *)out_ext; + out_header = (void *)out_ext; + break; + } + case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_TRIANGLES_OPACITY_MICROMAP_EXT: + { + VkAccelerationStructureTrianglesOpacityMicromapEXT *out_ext = conversion_context_alloc(ctx, sizeof(*out_ext)); + const VkAccelerationStructureTrianglesOpacityMicromapEXT32 *in_ext = (const VkAccelerationStructureTrianglesOpacityMicromapEXT32 *)in_header; + out_ext->sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_TRIANGLES_OPACITY_MICROMAP_EXT; + out_ext->pNext = NULL; + out_ext->indexType = in_ext->indexType; + convert_VkDeviceOrHostAddressConstKHR_win32_to_host(&in_ext->indexBuffer, &out_ext->indexBuffer); + out_ext->indexStride = in_ext->indexStride; + out_ext->baseTriangle = in_ext->baseTriangle; + out_ext->usageCountsCount = in_ext->usageCountsCount; + out_ext->pUsageCounts = (const VkMicromapUsageEXT *)UlongToPtr(in_ext->pUsageCounts); + out_ext->ppUsageCounts = convert_VkMicromapUsageEXT_pointer_array_win32_to_host(ctx, (const PTR32 *)UlongToPtr(in_ext->ppUsageCounts), in_ext->usageCountsCount); + out_ext->micromap = in_ext->micromap; + out_header->pNext = (void *)out_ext; + out_header = (void *)out_ext; + break; + } + default: + FIXME("Unhandled sType %u.", in_header->sType); + break; + } + } +} + +static inline void convert_VkAccelerationStructureGeometryAabbsDataKHR_win32_to_host(const VkAccelerationStructureGeometryAabbsDataKHR32 *in, VkAccelerationStructureGeometryAabbsDataKHR *out) +{ + if (!in) return; + + out->sType = in->sType; + out->pNext = NULL; + convert_VkDeviceOrHostAddressConstKHR_win32_to_host(&in->data, &out->data); + out->stride = in->stride; + if (in->pNext) + FIXME("Unexpected pNext\n"); +} + +static inline void convert_VkAccelerationStructureGeometryInstancesDataKHR_win32_to_host(const VkAccelerationStructureGeometryInstancesDataKHR32 *in, VkAccelerationStructureGeometryInstancesDataKHR *out) +{ + if (!in) return; + + out->sType = in->sType; + out->pNext = NULL; + out->arrayOfPointers = in->arrayOfPointers; + convert_VkDeviceOrHostAddressConstKHR_win32_to_host(&in->data, &out->data); + if (in->pNext) + FIXME("Unexpected pNext\n"); +} + +static inline void convert_VkAccelerationStructureGeometryDataKHR_win32_to_host(struct conversion_context *ctx, const VkAccelerationStructureGeometryDataKHR32 *in, VkAccelerationStructureGeometryDataKHR *out, VkFlags selector) +{ + if (!in) return; + + if (selector == VK_GEOMETRY_TYPE_TRIANGLES_KHR) + convert_VkAccelerationStructureGeometryTrianglesDataKHR_win32_to_host(ctx, &in->triangles, &out->triangles); + if (selector == VK_GEOMETRY_TYPE_AABBS_KHR) + convert_VkAccelerationStructureGeometryAabbsDataKHR_win32_to_host(&in->aabbs, &out->aabbs); + if (selector == VK_GEOMETRY_TYPE_INSTANCES_KHR) + convert_VkAccelerationStructureGeometryInstancesDataKHR_win32_to_host(&in->instances, &out->instances); +} + +static inline void convert_VkAccelerationStructureGeometryKHR_win32_to_host(struct conversion_context *ctx, const VkAccelerationStructureGeometryKHR32 *in, VkAccelerationStructureGeometryKHR *out) { if (!in) return; out->sType = in->sType; out->pNext = NULL; out->geometryType = in->geometryType; - out->geometry = in->geometry; + convert_VkAccelerationStructureGeometryDataKHR_win32_to_host(ctx, &in->geometry, &out->geometry, in->geometryType); out->flags = in->flags; if (in->pNext) FIXME("Unexpected pNext\n"); @@ -6389,7 +6592,7 @@ static inline const VkAccelerationStructureGeometryKHR *convert_VkAccelerationSt out = conversion_context_alloc(ctx, count * sizeof(*out)); for (i = 0; i < count; i++) { - convert_VkAccelerationStructureGeometryKHR_win32_to_host(&in[i], &out[i]); + convert_VkAccelerationStructureGeometryKHR_win32_to_host(ctx, &in[i], &out[i]); } return out; @@ -6408,7 +6611,7 @@ static inline const VkAccelerationStructureGeometryKHR * const*convert_VkAcceler if (in[i]) { out[i] = conversion_context_alloc(ctx, sizeof(*out[i])); - convert_VkAccelerationStructureGeometryKHR_win32_to_host((VkAccelerationStructureGeometryKHR32 *)UlongToPtr(in[i]), out[i]); + convert_VkAccelerationStructureGeometryKHR_win32_to_host(ctx, (VkAccelerationStructureGeometryKHR32 *)UlongToPtr(in[i]), out[i]); } else out[i] = NULL; @@ -6417,6 +6620,14 @@ static inline const VkAccelerationStructureGeometryKHR * const*convert_VkAcceler return (void *)out; } +static inline void convert_VkDeviceOrHostAddressKHR_win32_to_host(const VkDeviceOrHostAddressKHR32 *in, VkDeviceOrHostAddressKHR *out) +{ + if (!in) return; + + out->deviceAddress = in->deviceAddress; + out->hostAddress = (void *)UlongToPtr(in->hostAddress); +} + static inline void convert_VkAccelerationStructureBuildGeometryInfoKHR_win32_to_host(struct conversion_context *ctx, const VkAccelerationStructureBuildGeometryInfoKHR32 *in, VkAccelerationStructureBuildGeometryInfoKHR *out) { if (!in) return; @@ -6431,7 +6642,7 @@ static inline void convert_VkAccelerationStructureBuildGeometryInfoKHR_win32_to_ out->geometryCount = in->geometryCount; out->pGeometries = convert_VkAccelerationStructureGeometryKHR_array_win32_to_host(ctx, (const VkAccelerationStructureGeometryKHR32 *)UlongToPtr(in->pGeometries), in->geometryCount); out->ppGeometries = convert_VkAccelerationStructureGeometryKHR_pointer_array_win32_to_host(ctx, (const PTR32 *)UlongToPtr(in->ppGeometries), in->geometryCount); - out->scratchData = in->scratchData; + convert_VkDeviceOrHostAddressKHR_win32_to_host(&in->scratchData, &out->scratchData); if (in->pNext) FIXME("Unexpected pNext\n"); } @@ -6452,22 +6663,6 @@ static inline const VkAccelerationStructureBuildGeometryInfoKHR *convert_VkAccel return 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; -} - static inline void convert_VkMicromapBuildInfoEXT_win32_to_host(struct conversion_context *ctx, const VkMicromapBuildInfoEXT32 *in, VkMicromapBuildInfoEXT *out) { if (!in) return; @@ -6481,9 +6676,9 @@ static inline void convert_VkMicromapBuildInfoEXT_win32_to_host(struct conversio out->usageCountsCount = in->usageCountsCount; out->pUsageCounts = (const VkMicromapUsageEXT *)UlongToPtr(in->pUsageCounts); 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; + convert_VkDeviceOrHostAddressConstKHR_win32_to_host(&in->data, &out->data); + convert_VkDeviceOrHostAddressKHR_win32_to_host(&in->scratchData, &out->scratchData); + convert_VkDeviceOrHostAddressConstKHR_win32_to_host(&in->triangleArray, &out->triangleArray); out->triangleArrayStride = in->triangleArrayStride; if (in->pNext) FIXME("Unexpected pNext\n"); @@ -6980,7 +7175,7 @@ static inline void convert_VkCopyAccelerationStructureToMemoryInfoKHR_win32_to_h out->sType = in->sType; out->pNext = NULL; out->src = in->src; - out->dst = in->dst; + convert_VkDeviceOrHostAddressKHR_win32_to_host(&in->dst, &out->dst); out->mode = in->mode; if (in->pNext) FIXME("Unexpected pNext\n"); @@ -7219,7 +7414,7 @@ static inline void convert_VkCopyMemoryToAccelerationStructureInfoKHR_win32_to_h out->sType = in->sType; out->pNext = NULL; - out->src = in->src; + convert_VkDeviceOrHostAddressConstKHR_win32_to_host(&in->src, &out->src); out->dst = in->dst; out->mode = in->mode; if (in->pNext) @@ -7232,7 +7427,7 @@ static inline void convert_VkCopyMemoryToMicromapInfoEXT_win32_to_host(const VkC out->sType = in->sType; out->pNext = NULL; - out->src = in->src; + convert_VkDeviceOrHostAddressConstKHR_win32_to_host(&in->src, &out->src); out->dst = in->dst; out->mode = in->mode; if (in->pNext) @@ -7259,7 +7454,7 @@ static inline void convert_VkCopyMicromapToMemoryInfoEXT_win32_to_host(const VkC out->sType = in->sType; out->pNext = NULL; out->src = in->src; - out->dst = in->dst; + convert_VkDeviceOrHostAddressKHR_win32_to_host(&in->dst, &out->dst); out->mode = in->mode; if (in->pNext) FIXME("Unexpected pNext\n"); @@ -16788,12 +16983,34 @@ static inline void convert_VkMicromapBuildSizesInfoEXT_host_to_win32(const VkMic out->discardable = in->discardable; } -static inline void convert_VkPerformanceValueINTEL_win32_to_host(const VkPerformanceValueINTEL32 *in, VkPerformanceValueINTEL *out) +static inline void convert_VkPerformanceValueDataINTEL_win32_to_host(const VkPerformanceValueDataINTEL32 *in, VkPerformanceValueDataINTEL *out, VkFlags selector) { if (!in) return; - out->type = in->type; - out->data = in->data; + if (selector == VK_PERFORMANCE_VALUE_TYPE_UINT32_INTEL) + out->value32 = in->value32; + if (selector == VK_PERFORMANCE_VALUE_TYPE_UINT64_INTEL) + out->value64 = in->value64; + if (selector == VK_PERFORMANCE_VALUE_TYPE_FLOAT_INTEL) + out->valueFloat = in->valueFloat; + if (selector == VK_PERFORMANCE_VALUE_TYPE_BOOL_INTEL) + out->valueBool = in->valueBool; + if (selector == VK_PERFORMANCE_VALUE_TYPE_STRING_INTEL) + out->valueString = (const char *)UlongToPtr(in->valueString); +} + +static inline void convert_VkPerformanceValueDataINTEL_host_to_win32(const VkPerformanceValueDataINTEL *in, VkPerformanceValueDataINTEL32 *out, VkFlags selector) +{ + if (!in) return; + + if (selector == VK_PERFORMANCE_VALUE_TYPE_UINT32_INTEL) + out->value32 = in->value32; + if (selector == VK_PERFORMANCE_VALUE_TYPE_UINT64_INTEL) + out->value64 = in->value64; + if (selector == VK_PERFORMANCE_VALUE_TYPE_FLOAT_INTEL) + out->valueFloat = in->valueFloat; + if (selector == VK_PERFORMANCE_VALUE_TYPE_BOOL_INTEL) + out->valueBool = in->valueBool; } static inline void convert_VkPerformanceValueINTEL_host_to_win32(const VkPerformanceValueINTEL *in, VkPerformanceValueINTEL32 *out) @@ -16801,7 +17018,7 @@ static inline void convert_VkPerformanceValueINTEL_host_to_win32(const VkPerform if (!in) return; out->type = in->type; - out->data = in->data; + convert_VkPerformanceValueDataINTEL_host_to_win32(&in->data, &out->data, in->type); } static inline void convert_VkCooperativeMatrixPropertiesNV_win32_to_host(const VkCooperativeMatrixPropertiesNV32 *in, VkCooperativeMatrixPropertiesNV *out) @@ -22992,6 +23209,20 @@ static inline void convert_VkPipelineExecutablePropertiesKHR_array_host_to_win32 } } +static inline void convert_VkPipelineExecutableStatisticValueKHR_host_to_win32(const VkPipelineExecutableStatisticValueKHR *in, VkPipelineExecutableStatisticValueKHR32 *out, VkFlags selector) +{ + if (!in) return; + + if (selector == VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_BOOL32_KHR) + out->b32 = in->b32; + if (selector == VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_INT64_KHR) + out->i64 = in->i64; + if (selector == VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_UINT64_KHR) + out->u64 = in->u64; + if (selector == VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_FLOAT64_KHR) + out->f64 = in->f64; +} + static inline void convert_VkPipelineExecutableStatisticKHR_win32_to_host(const VkPipelineExecutableStatisticKHR32 *in, VkPipelineExecutableStatisticKHR *out) { if (!in) return; @@ -23009,7 +23240,7 @@ static inline void convert_VkPipelineExecutableStatisticKHR_host_to_win32(const memcpy(out->name, in->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char)); memcpy(out->description, in->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char)); out->format = in->format; - out->value = in->value; + convert_VkPipelineExecutableStatisticValueKHR_host_to_win32(&in->value, &out->value, in->format); } static inline VkPipelineExecutableStatisticKHR *convert_VkPipelineExecutableStatisticKHR_array_win32_to_host(struct conversion_context *ctx, const VkPipelineExecutableStatisticKHR32 *in, uint32_t count) @@ -36057,7 +36288,6 @@ static NTSTATUS thunk32_vkGetPerformanceParameterINTEL(void *args) TRACE("%#x, %#x, %#x\n", params->device, params->parameter, params->pValue); - convert_VkPerformanceValueINTEL_win32_to_host((VkPerformanceValueINTEL32 *)UlongToPtr(params->pValue), &pValue_host); params->result = wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkGetPerformanceParameterINTEL(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->device, params->parameter, &pValue_host); convert_VkPerformanceValueINTEL_host_to_win32(&pValue_host, (VkPerformanceValueINTEL32 *)UlongToPtr(params->pValue)); return STATUS_SUCCESS;