Wine-devel
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
April 2019
- 82 participants
- 743 discussions
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/winevulkan/make_vulkan | 1 -
dlls/winevulkan/vulkan_thunks.c | 25 ++++++++++++++
dlls/winevulkan/vulkan_thunks.h | 2 ++
include/wine/vulkan.h | 61 +++++++++++++++++++++++++++++++++
4 files changed, 88 insertions(+), 1 deletion(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
index 0aed3653086f..9d76f8084a5c 100755
--- a/dlls/winevulkan/make_vulkan
+++ b/dlls/winevulkan/make_vulkan
@@ -112,7 +112,6 @@ BLACKLISTED_EXTENSIONS = [
# Relates to external_semaphore and needs type conversions in bitflags.
"VK_KHR_shared_presentable_image", # Needs WSI work.
"VK_KHR_win32_keyed_mutex",
- "VK_NV_cooperative_matrix",
"VK_NV_dedicated_allocation_image_aliasing",
# Extensions for other platforms
diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c
index 8c9b67087673..03842f2674f3 100644
--- a/dlls/winevulkan/vulkan_thunks.c
+++ b/dlls/winevulkan/vulkan_thunks.c
@@ -1945,6 +1945,23 @@ VkResult convert_VkDeviceCreateInfo_struct_chain(const void *pNext, VkDeviceCrea
break;
}
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV:
+ {
+ const VkPhysicalDeviceCooperativeMatrixFeaturesNV *in = (const VkPhysicalDeviceCooperativeMatrixFeaturesNV *)in_header;
+ VkPhysicalDeviceCooperativeMatrixFeaturesNV *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->cooperativeMatrix = in->cooperativeMatrix;
+ out->cooperativeMatrixRobustBufferAccess = in->cooperativeMatrixRobustBufferAccess;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT:
{
const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT *in = (const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT *)in_header;
@@ -3534,6 +3551,12 @@ static VkResult WINAPI wine_vkGetMemoryHostPointerPropertiesEXT(VkDevice device,
return device->funcs.p_vkGetMemoryHostPointerPropertiesEXT(device->device, handleType, pHostPointer, pMemoryHostPointerProperties);
}
+static VkResult WINAPI wine_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkCooperativeMatrixPropertiesNV *pProperties)
+{
+ TRACE("%p, %p, %p\n", physicalDevice, pPropertyCount, pProperties);
+ return physicalDevice->instance->funcs.p_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(physicalDevice->phys_dev, pPropertyCount, pProperties);
+}
+
void WINAPI wine_vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures)
{
TRACE("%p, %p\n", physicalDevice, pFeatures);
@@ -4226,6 +4249,7 @@ static const struct vulkan_func vk_instance_dispatch_table[] =
{"vkEnumeratePhysicalDeviceGroups", &wine_vkEnumeratePhysicalDeviceGroups},
{"vkEnumeratePhysicalDeviceGroupsKHR", &wine_vkEnumeratePhysicalDeviceGroupsKHR},
{"vkEnumeratePhysicalDevices", &wine_vkEnumeratePhysicalDevices},
+ {"vkGetPhysicalDeviceCooperativeMatrixPropertiesNV", &wine_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV},
{"vkGetPhysicalDeviceExternalBufferProperties", &wine_vkGetPhysicalDeviceExternalBufferProperties},
{"vkGetPhysicalDeviceExternalBufferPropertiesKHR", &wine_vkGetPhysicalDeviceExternalBufferPropertiesKHR},
{"vkGetPhysicalDeviceExternalFenceProperties", &wine_vkGetPhysicalDeviceExternalFenceProperties},
@@ -4380,6 +4404,7 @@ static const char * const vk_device_extensions[] =
"VK_KHR_vulkan_memory_model",
"VK_NV_clip_space_w_scaling",
"VK_NV_compute_shader_derivatives",
+ "VK_NV_cooperative_matrix",
"VK_NV_corner_sampled_image",
"VK_NV_dedicated_allocation",
"VK_NV_device_diagnostic_checkpoints",
diff --git a/dlls/winevulkan/vulkan_thunks.h b/dlls/winevulkan/vulkan_thunks.h
index 71ede947d793..d39cab76ac82 100644
--- a/dlls/winevulkan/vulkan_thunks.h
+++ b/dlls/winevulkan/vulkan_thunks.h
@@ -1180,6 +1180,7 @@ struct vulkan_instance_funcs
VkResult (*p_vkEnumeratePhysicalDeviceGroups)(VkInstance, uint32_t *, VkPhysicalDeviceGroupProperties *);
VkResult (*p_vkEnumeratePhysicalDeviceGroupsKHR)(VkInstance, uint32_t *, VkPhysicalDeviceGroupProperties *);
VkResult (*p_vkEnumeratePhysicalDevices)(VkInstance, uint32_t *, VkPhysicalDevice *);
+ VkResult (*p_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV)(VkPhysicalDevice, uint32_t *, VkCooperativeMatrixPropertiesNV *);
void (*p_vkGetPhysicalDeviceFeatures)(VkPhysicalDevice, VkPhysicalDeviceFeatures *);
void (*p_vkGetPhysicalDeviceFeatures2)(VkPhysicalDevice, VkPhysicalDeviceFeatures2 *);
void (*p_vkGetPhysicalDeviceFeatures2KHR)(VkPhysicalDevice, VkPhysicalDeviceFeatures2 *);
@@ -1467,6 +1468,7 @@ struct vulkan_instance_funcs
USE_VK_FUNC(vkEnumeratePhysicalDeviceGroups) \
USE_VK_FUNC(vkEnumeratePhysicalDeviceGroupsKHR) \
USE_VK_FUNC(vkEnumeratePhysicalDevices) \
+ USE_VK_FUNC(vkGetPhysicalDeviceCooperativeMatrixPropertiesNV) \
USE_VK_FUNC(vkGetPhysicalDeviceFeatures) \
USE_VK_FUNC(vkGetPhysicalDeviceFeatures2) \
USE_VK_FUNC(vkGetPhysicalDeviceFeatures2KHR) \
diff --git a/include/wine/vulkan.h b/include/wine/vulkan.h
index 454587336d72..50513a1a2e8c 100644
--- a/include/wine/vulkan.h
+++ b/include/wine/vulkan.h
@@ -310,6 +310,8 @@
#define VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME "VK_EXT_buffer_device_address"
#define VK_EXT_SEPARATE_STENCIL_USAGE_SPEC_VERSION 1
#define VK_EXT_SEPARATE_STENCIL_USAGE_EXTENSION_NAME "VK_EXT_separate_stencil_usage"
+#define VK_NV_COOPERATIVE_MATRIX_SPEC_VERSION 1
+#define VK_NV_COOPERATIVE_MATRIX_EXTENSION_NAME "VK_NV_cooperative_matrix"
#define VK_EXT_YCBCR_IMAGE_ARRAYS_SPEC_VERSION 1
#define VK_EXT_YCBCR_IMAGE_ARRAYS_EXTENSION_NAME "VK_EXT_ycbcr_image_arrays"
#define VK_EXT_HOST_QUERY_RESET_SPEC_VERSION 1
@@ -791,6 +793,22 @@ typedef enum VkComponentSwizzle
VK_COMPONENT_SWIZZLE_MAX_ENUM = 0x7fffffff,
} VkComponentSwizzle;
+typedef enum VkComponentTypeNV
+{
+ VK_COMPONENT_TYPE_FLOAT16_NV = 0,
+ VK_COMPONENT_TYPE_FLOAT32_NV = 1,
+ VK_COMPONENT_TYPE_FLOAT64_NV = 2,
+ VK_COMPONENT_TYPE_SINT8_NV = 3,
+ VK_COMPONENT_TYPE_SINT16_NV = 4,
+ VK_COMPONENT_TYPE_SINT32_NV = 5,
+ VK_COMPONENT_TYPE_SINT64_NV = 6,
+ VK_COMPONENT_TYPE_UINT8_NV = 7,
+ VK_COMPONENT_TYPE_UINT16_NV = 8,
+ VK_COMPONENT_TYPE_UINT32_NV = 9,
+ VK_COMPONENT_TYPE_UINT64_NV = 10,
+ VK_COMPONENT_TYPE_NV_MAX_ENUM = 0x7fffffff,
+} VkComponentTypeNV;
+
typedef enum VkCompositeAlphaFlagBitsKHR
{
VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR = 0x00000001,
@@ -1798,6 +1816,15 @@ typedef enum VkSamplerYcbcrRange
VK_SAMPLER_YCBCR_RANGE_MAX_ENUM = 0x7fffffff,
} VkSamplerYcbcrRange;
+typedef enum VkScopeNV
+{
+ VK_SCOPE_DEVICE_NV = 1,
+ VK_SCOPE_WORKGROUP_NV = 2,
+ VK_SCOPE_SUBGROUP_NV = 3,
+ VK_SCOPE_QUEUE_FAMILY_NV = 5,
+ VK_SCOPE_NV_MAX_ENUM = 0x7fffffff,
+} VkScopeNV;
+
typedef enum VkSemaphoreImportFlagBits
{
VK_SEMAPHORE_IMPORT_TEMPORARY_BIT = 0x00000001,
@@ -2121,6 +2148,9 @@ typedef enum VkStructureType
VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT = 1000244001,
VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT = 1000244002,
VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT = 1000246000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV = 1000249000,
+ VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_NV = 1000249001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV = 1000249002,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT = 1000252000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT = 1000261000,
VK_STRUCTURE_TYPE_MAX_ENUM = 0x7fffffff,
@@ -2387,6 +2417,20 @@ typedef struct VkConditionalRenderingBeginInfoEXT
VkConditionalRenderingFlagsEXT flags;
} VkConditionalRenderingBeginInfoEXT;
+typedef struct VkCooperativeMatrixPropertiesNV
+{
+ VkStructureType sType;
+ void *pNext;
+ uint32_t MSize;
+ uint32_t NSize;
+ uint32_t KSize;
+ VkComponentTypeNV AType;
+ VkComponentTypeNV BType;
+ VkComponentTypeNV CType;
+ VkComponentTypeNV DType;
+ VkScopeNV scope;
+} VkCooperativeMatrixPropertiesNV;
+
typedef struct VkDedicatedAllocationBufferCreateInfoNV
{
VkStructureType sType;
@@ -2719,6 +2763,13 @@ typedef struct VkPhysicalDeviceConservativeRasterizationPropertiesEXT
VkBool32 conservativeRasterizationPostDepthCoverage;
} VkPhysicalDeviceConservativeRasterizationPropertiesEXT;
+typedef struct VkPhysicalDeviceCooperativeMatrixPropertiesNV
+{
+ VkStructureType sType;
+ void *pNext;
+ VkShaderStageFlags cooperativeMatrixSupportedStages;
+} VkPhysicalDeviceCooperativeMatrixPropertiesNV;
+
typedef struct VkPhysicalDeviceDepthStencilResolvePropertiesKHR
{
VkStructureType sType;
@@ -3735,6 +3786,14 @@ typedef struct VkPhysicalDeviceBufferAddressFeaturesEXT
VkBool32 bufferDeviceAddressMultiDevice;
} VkPhysicalDeviceBufferAddressFeaturesEXT;
+typedef struct VkPhysicalDeviceCooperativeMatrixFeaturesNV
+{
+ VkStructureType sType;
+ void *pNext;
+ VkBool32 cooperativeMatrix;
+ VkBool32 cooperativeMatrixRobustBufferAccess;
+} VkPhysicalDeviceCooperativeMatrixFeaturesNV;
+
typedef struct VkPhysicalDeviceDepthClipEnableFeaturesEXT
{
VkStructureType sType;
@@ -5493,6 +5552,7 @@ typedef void (VKAPI_PTR *PFN_vkGetImageSparseMemoryRequirements2KHR)(VkDevice, c
typedef void (VKAPI_PTR *PFN_vkGetImageSubresourceLayout)(VkDevice, VkImage, const VkImageSubresource *, VkSubresourceLayout *);
typedef PFN_vkVoidFunction (VKAPI_PTR *PFN_vkGetInstanceProcAddr)(VkInstance, const char *);
typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryHostPointerPropertiesEXT)(VkDevice, VkExternalMemoryHandleTypeFlagBits, const void *, VkMemoryHostPointerPropertiesEXT *);
+typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV)(VkPhysicalDevice, uint32_t *, VkCooperativeMatrixPropertiesNV *);
typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalBufferProperties)(VkPhysicalDevice, const VkPhysicalDeviceExternalBufferInfo *, VkExternalBufferProperties *);
typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR)(VkPhysicalDevice, const VkPhysicalDeviceExternalBufferInfo *, VkExternalBufferProperties *);
typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalFenceProperties)(VkPhysicalDevice, const VkPhysicalDeviceExternalFenceInfo *, VkExternalFenceProperties *);
@@ -5754,6 +5814,7 @@ void VKAPI_CALL vkGetImageSparseMemoryRequirements2KHR(VkDevice device, const Vk
void VKAPI_CALL vkGetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource, VkSubresourceLayout *pLayout);
PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *pName);
VkResult VKAPI_CALL vkGetMemoryHostPointerPropertiesEXT(VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, const void *pHostPointer, VkMemoryHostPointerPropertiesEXT *pMemoryHostPointerProperties);
+VkResult VKAPI_CALL vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkCooperativeMatrixPropertiesNV *pProperties);
void VKAPI_CALL vkGetPhysicalDeviceExternalBufferProperties(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfo *pExternalBufferInfo, VkExternalBufferProperties *pExternalBufferProperties);
void VKAPI_CALL vkGetPhysicalDeviceExternalBufferPropertiesKHR(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfo *pExternalBufferInfo, VkExternalBufferProperties *pExternalBufferProperties);
void VKAPI_CALL vkGetPhysicalDeviceExternalFenceProperties(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfo *pExternalFenceInfo, VkExternalFenceProperties *pExternalFenceProperties);
--
2.21.0
1
0
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/winevulkan/make_vulkan | 1 -
dlls/winevulkan/vulkan_thunks.c | 17 +++++++++++++++++
include/wine/vulkan.h | 10 ++++++++++
3 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
index 851c554e3dff..0aed3653086f 100755
--- a/dlls/winevulkan/make_vulkan
+++ b/dlls/winevulkan/make_vulkan
@@ -105,7 +105,6 @@ BLACKLISTED_EXTENSIONS = [
"VK_EXT_full_screen_exclusive",
"VK_EXT_hdr_metadata", # Needs WSI work.
"VK_EXT_pipeline_creation_feedback",
- "VK_EXT_ycbcr_image_arrays",
"VK_GOOGLE_display_timing",
"VK_KHR_external_fence_win32",
"VK_KHR_external_memory_win32",
diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c
index 87944657adee..8c9b67087673 100644
--- a/dlls/winevulkan/vulkan_thunks.c
+++ b/dlls/winevulkan/vulkan_thunks.c
@@ -1945,6 +1945,22 @@ VkResult convert_VkDeviceCreateInfo_struct_chain(const void *pNext, VkDeviceCrea
break;
}
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT:
+ {
+ const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT *in = (const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT *)in_header;
+ VkPhysicalDeviceYcbcrImageArraysFeaturesEXT *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->ycbcrImageArrays = in->ycbcrImageArrays;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
default:
FIXME("Application requested a linked structure of type %u.\n", in_header->sType);
}
@@ -4324,6 +4340,7 @@ static const char * const vk_device_extensions[] =
"VK_EXT_transform_feedback",
"VK_EXT_validation_cache",
"VK_EXT_vertex_attribute_divisor",
+ "VK_EXT_ycbcr_image_arrays",
"VK_GOOGLE_decorate_string",
"VK_GOOGLE_hlsl_functionality1",
"VK_IMG_filter_cubic",
diff --git a/include/wine/vulkan.h b/include/wine/vulkan.h
index ecdabe40714f..454587336d72 100644
--- a/include/wine/vulkan.h
+++ b/include/wine/vulkan.h
@@ -310,6 +310,8 @@
#define VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME "VK_EXT_buffer_device_address"
#define VK_EXT_SEPARATE_STENCIL_USAGE_SPEC_VERSION 1
#define VK_EXT_SEPARATE_STENCIL_USAGE_EXTENSION_NAME "VK_EXT_separate_stencil_usage"
+#define VK_EXT_YCBCR_IMAGE_ARRAYS_SPEC_VERSION 1
+#define VK_EXT_YCBCR_IMAGE_ARRAYS_EXTENSION_NAME "VK_EXT_ycbcr_image_arrays"
#define VK_EXT_HOST_QUERY_RESET_SPEC_VERSION 1
#define VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME "VK_EXT_host_query_reset"
@@ -2119,6 +2121,7 @@ typedef enum VkStructureType
VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT = 1000244001,
VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT = 1000244002,
VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT = 1000246000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT = 1000252000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT = 1000261000,
VK_STRUCTURE_TYPE_MAX_ENUM = 0x7fffffff,
} VkStructureType;
@@ -3126,6 +3129,13 @@ typedef struct VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT
uint32_t maxVertexAttribDivisor;
} VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT;
+typedef struct VkPhysicalDeviceYcbcrImageArraysFeaturesEXT
+{
+ VkStructureType sType;
+ void *pNext;
+ VkBool32 ycbcrImageArrays;
+} VkPhysicalDeviceYcbcrImageArraysFeaturesEXT;
+
typedef struct VkPipelineColorBlendAdvancedStateCreateInfoEXT
{
VkStructureType sType;
--
2.21.0
1
0
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/winevulkan/make_vulkan | 1 -
dlls/winevulkan/vulkan_thunks.c | 18 ++++++++++++++++++
include/wine/vulkan.h | 11 +++++++++++
3 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
index be3996c37921..851c554e3dff 100755
--- a/dlls/winevulkan/make_vulkan
+++ b/dlls/winevulkan/make_vulkan
@@ -110,7 +110,6 @@ BLACKLISTED_EXTENSIONS = [
"VK_KHR_external_fence_win32",
"VK_KHR_external_memory_win32",
"VK_KHR_external_semaphore_win32",
- "VK_KHR_shader_float16_int8",
# Relates to external_semaphore and needs type conversions in bitflags.
"VK_KHR_shared_presentable_image", # Needs WSI work.
"VK_KHR_win32_keyed_mutex",
diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c
index e80bb7c022a1..87944657adee 100644
--- a/dlls/winevulkan/vulkan_thunks.c
+++ b/dlls/winevulkan/vulkan_thunks.c
@@ -1526,6 +1526,23 @@ VkResult convert_VkDeviceCreateInfo_struct_chain(const void *pNext, VkDeviceCrea
break;
}
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR:
+ {
+ const VkPhysicalDeviceFloat16Int8FeaturesKHR *in = (const VkPhysicalDeviceFloat16Int8FeaturesKHR *)in_header;
+ VkPhysicalDeviceFloat16Int8FeaturesKHR *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->shaderFloat16 = in->shaderFloat16;
+ out->shaderInt8 = in->shaderInt8;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT:
{
const VkPhysicalDeviceHostQueryResetFeaturesEXT *in = (const VkPhysicalDeviceHostQueryResetFeaturesEXT *)in_header;
@@ -4337,6 +4354,7 @@ static const char * const vk_device_extensions[] =
"VK_KHR_sampler_ycbcr_conversion",
"VK_KHR_shader_atomic_int64",
"VK_KHR_shader_draw_parameters",
+ "VK_KHR_shader_float16_int8",
"VK_KHR_shader_float_controls",
"VK_KHR_storage_buffer_storage_class",
"VK_KHR_swapchain",
diff --git a/include/wine/vulkan.h b/include/wine/vulkan.h
index 3a80b88bbfea..ecdabe40714f 100644
--- a/include/wine/vulkan.h
+++ b/include/wine/vulkan.h
@@ -158,6 +158,8 @@
#define VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME "VK_KHR_push_descriptor"
#define VK_EXT_CONDITIONAL_RENDERING_SPEC_VERSION 1
#define VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME "VK_EXT_conditional_rendering"
+#define VK_KHR_SHADER_FLOAT16_INT8_SPEC_VERSION 1
+#define VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME "VK_KHR_shader_float16_int8"
#define VK_KHR_16BIT_STORAGE_SPEC_VERSION 1
#define VK_KHR_16BIT_STORAGE_EXTENSION_NAME "VK_KHR_16bit_storage"
#define VK_KHR_INCREMENTAL_PRESENT_SPEC_VERSION 1
@@ -1988,6 +1990,7 @@ typedef enum VkStructureType
VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT = 1000081000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT = 1000081001,
VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT = 1000081002,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR = 1000082000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES = 1000083000,
VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR = 1000084000,
VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO = 1000085000,
@@ -3752,6 +3755,14 @@ typedef struct VkPhysicalDeviceExternalImageFormatInfo
VkExternalMemoryHandleTypeFlagBits handleType;
} VkPhysicalDeviceExternalImageFormatInfo;
+typedef struct VkPhysicalDeviceFloat16Int8FeaturesKHR
+{
+ VkStructureType sType;
+ void *pNext;
+ VkBool32 shaderFloat16;
+ VkBool32 shaderInt8;
+} VkPhysicalDeviceFloat16Int8FeaturesKHR;
+
typedef struct VkPhysicalDeviceGroupProperties
{
VkStructureType sType;
--
2.21.0
1
0
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/winevulkan/make_vulkan | 1 -
dlls/winevulkan/vulkan_thunks.c | 8 ++++++++
dlls/winevulkan/vulkan_thunks.h | 2 ++
include/wine/vulkan.h | 31 +++++++++++++++++++++++++++++++
4 files changed, 41 insertions(+), 1 deletion(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
index f6a63cb2af68..be3996c37921 100755
--- a/dlls/winevulkan/make_vulkan
+++ b/dlls/winevulkan/make_vulkan
@@ -102,7 +102,6 @@ BLACKLISTED_EXTENSIONS = [
"VK_AMD_display_native_hdr",
"VK_EXT_calibrated_timestamps",
"VK_EXT_display_control", # Requires VK_EXT_display_surface_counter
- "VK_EXT_external_memory_host",
"VK_EXT_full_screen_exclusive",
"VK_EXT_hdr_metadata", # Needs WSI work.
"VK_EXT_pipeline_creation_feedback",
diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c
index b2b0037fc4ce..e80bb7c022a1 100644
--- a/dlls/winevulkan/vulkan_thunks.c
+++ b/dlls/winevulkan/vulkan_thunks.c
@@ -3495,6 +3495,12 @@ void WINAPI wine_vkGetImageSubresourceLayout(VkDevice device, VkImage image, con
#endif
}
+static VkResult WINAPI wine_vkGetMemoryHostPointerPropertiesEXT(VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, const void *pHostPointer, VkMemoryHostPointerPropertiesEXT *pMemoryHostPointerProperties)
+{
+ TRACE("%p, %#x, %p, %p\n", device, handleType, pHostPointer, pMemoryHostPointerProperties);
+ return device->funcs.p_vkGetMemoryHostPointerPropertiesEXT(device->device, handleType, pHostPointer, pMemoryHostPointerProperties);
+}
+
void WINAPI wine_vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures)
{
TRACE("%p, %p\n", physicalDevice, pFeatures);
@@ -4143,6 +4149,7 @@ static const struct vulkan_func vk_device_dispatch_table[] =
{"vkGetImageSparseMemoryRequirements2", &wine_vkGetImageSparseMemoryRequirements2},
{"vkGetImageSparseMemoryRequirements2KHR", &wine_vkGetImageSparseMemoryRequirements2KHR},
{"vkGetImageSubresourceLayout", &wine_vkGetImageSubresourceLayout},
+ {"vkGetMemoryHostPointerPropertiesEXT", &wine_vkGetMemoryHostPointerPropertiesEXT},
{"vkGetPipelineCacheData", &wine_vkGetPipelineCacheData},
{"vkGetQueryPoolResults", &wine_vkGetQueryPoolResults},
{"vkGetQueueCheckpointDataNV", &wine_vkGetQueueCheckpointDataNV},
@@ -4278,6 +4285,7 @@ static const char * const vk_device_extensions[] =
"VK_EXT_depth_range_unrestricted",
"VK_EXT_descriptor_indexing",
"VK_EXT_discard_rectangles",
+ "VK_EXT_external_memory_host",
"VK_EXT_filter_cubic",
"VK_EXT_fragment_density_map",
"VK_EXT_global_priority",
diff --git a/dlls/winevulkan/vulkan_thunks.h b/dlls/winevulkan/vulkan_thunks.h
index 5da9aa9c4cae..71ede947d793 100644
--- a/dlls/winevulkan/vulkan_thunks.h
+++ b/dlls/winevulkan/vulkan_thunks.h
@@ -1124,6 +1124,7 @@ struct vulkan_device_funcs
#else
void (*p_vkGetImageSubresourceLayout)(VkDevice, VkImage, const VkImageSubresource *, VkSubresourceLayout *);
#endif
+ VkResult (*p_vkGetMemoryHostPointerPropertiesEXT)(VkDevice, VkExternalMemoryHandleTypeFlagBits, const void *, VkMemoryHostPointerPropertiesEXT *);
VkResult (*p_vkGetPipelineCacheData)(VkDevice, VkPipelineCache, size_t *, void *);
VkResult (*p_vkGetQueryPoolResults)(VkDevice, VkQueryPool, uint32_t, uint32_t, size_t, void *, VkDeviceSize, VkQueryResultFlags);
void (*p_vkGetQueueCheckpointDataNV)(VkQueue, uint32_t *, VkCheckpointDataNV *);
@@ -1425,6 +1426,7 @@ struct vulkan_instance_funcs
USE_VK_FUNC(vkGetImageSparseMemoryRequirements2) \
USE_VK_FUNC(vkGetImageSparseMemoryRequirements2KHR) \
USE_VK_FUNC(vkGetImageSubresourceLayout) \
+ USE_VK_FUNC(vkGetMemoryHostPointerPropertiesEXT) \
USE_VK_FUNC(vkGetPipelineCacheData) \
USE_VK_FUNC(vkGetQueryPoolResults) \
USE_VK_FUNC(vkGetQueueCheckpointDataNV) \
diff --git a/include/wine/vulkan.h b/include/wine/vulkan.h
index 7a98951e0bf7..3a80b88bbfea 100644
--- a/include/wine/vulkan.h
+++ b/include/wine/vulkan.h
@@ -254,6 +254,8 @@
#define VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME "VK_EXT_global_priority"
#define VK_KHR_8BIT_STORAGE_SPEC_VERSION 1
#define VK_KHR_8BIT_STORAGE_EXTENSION_NAME "VK_KHR_8bit_storage"
+#define VK_EXT_EXTERNAL_MEMORY_HOST_SPEC_VERSION 1
+#define VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME "VK_EXT_external_memory_host"
#define VK_AMD_BUFFER_MARKER_SPEC_VERSION 1
#define VK_AMD_BUFFER_MARKER_EXTENSION_NAME "VK_AMD_buffer_marker"
#define VK_KHR_SHADER_ATOMIC_INT64_SPEC_VERSION 1
@@ -970,6 +972,8 @@ typedef enum VkExternalMemoryHandleTypeFlagBits
VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT = 0x00000010,
VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT = 0x00000020,
VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT = 0x00000040,
+ VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT = 0x00000080,
+ VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT = 0x00000100,
VK_EXTERNAL_MEMORY_HANDLE_TYPE_FLAG_BITS_MAX_ENUM = 0x7fffffff,
} VkExternalMemoryHandleTypeFlagBits;
@@ -2077,6 +2081,9 @@ typedef enum VkStructureType
VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT = 1000170001,
VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT = 1000174000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR = 1000177000,
+ VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT = 1000178000,
+ VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT = 1000178001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT = 1000178002,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR = 1000180000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD = 1000185000,
VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD = 1000189000,
@@ -2637,6 +2644,13 @@ typedef struct VkMemoryBarrier
VkAccessFlags dstAccessMask;
} VkMemoryBarrier;
+typedef struct VkMemoryHostPointerPropertiesEXT
+{
+ VkStructureType sType;
+ void *pNext;
+ uint32_t memoryTypeBits;
+} VkMemoryHostPointerPropertiesEXT;
+
typedef struct VkMemoryRequirements
{
VkDeviceSize WINE_VK_ALIGN(8) size;
@@ -4258,6 +4272,13 @@ typedef struct VkPhysicalDeviceDriverPropertiesKHR
VkConformanceVersionKHR conformanceVersion;
} VkPhysicalDeviceDriverPropertiesKHR;
+typedef struct VkPhysicalDeviceExternalMemoryHostPropertiesEXT
+{
+ VkStructureType sType;
+ void *pNext;
+ VkDeviceSize WINE_VK_ALIGN(8) minImportedHostPointerAlignment;
+} VkPhysicalDeviceExternalMemoryHostPropertiesEXT;
+
typedef struct VkPhysicalDeviceFragmentDensityMapFeaturesEXT
{
VkStructureType sType;
@@ -4867,6 +4888,14 @@ typedef struct VkImageFormatProperties2
VkImageFormatProperties WINE_VK_ALIGN(8) imageFormatProperties;
} VkImageFormatProperties2;
+typedef struct VkImportMemoryHostPointerInfoEXT
+{
+ VkStructureType sType;
+ const void *pNext;
+ VkExternalMemoryHandleTypeFlagBits handleType;
+ void *pHostPointer;
+} VkImportMemoryHostPointerInfoEXT;
+
typedef struct VkMemoryHeap
{
VkDeviceSize WINE_VK_ALIGN(8) size;
@@ -5442,6 +5471,7 @@ typedef void (VKAPI_PTR *PFN_vkGetImageSparseMemoryRequirements2)(VkDevice, cons
typedef void (VKAPI_PTR *PFN_vkGetImageSparseMemoryRequirements2KHR)(VkDevice, const VkImageSparseMemoryRequirementsInfo2 *, uint32_t *, VkSparseImageMemoryRequirements2 *);
typedef void (VKAPI_PTR *PFN_vkGetImageSubresourceLayout)(VkDevice, VkImage, const VkImageSubresource *, VkSubresourceLayout *);
typedef PFN_vkVoidFunction (VKAPI_PTR *PFN_vkGetInstanceProcAddr)(VkInstance, const char *);
+typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryHostPointerPropertiesEXT)(VkDevice, VkExternalMemoryHandleTypeFlagBits, const void *, VkMemoryHostPointerPropertiesEXT *);
typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalBufferProperties)(VkPhysicalDevice, const VkPhysicalDeviceExternalBufferInfo *, VkExternalBufferProperties *);
typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR)(VkPhysicalDevice, const VkPhysicalDeviceExternalBufferInfo *, VkExternalBufferProperties *);
typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalFenceProperties)(VkPhysicalDevice, const VkPhysicalDeviceExternalFenceInfo *, VkExternalFenceProperties *);
@@ -5702,6 +5732,7 @@ void VKAPI_CALL vkGetImageSparseMemoryRequirements2(VkDevice device, const VkIma
void VKAPI_CALL vkGetImageSparseMemoryRequirements2KHR(VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements);
void VKAPI_CALL vkGetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource, VkSubresourceLayout *pLayout);
PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *pName);
+VkResult VKAPI_CALL vkGetMemoryHostPointerPropertiesEXT(VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, const void *pHostPointer, VkMemoryHostPointerPropertiesEXT *pMemoryHostPointerProperties);
void VKAPI_CALL vkGetPhysicalDeviceExternalBufferProperties(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfo *pExternalBufferInfo, VkExternalBufferProperties *pExternalBufferProperties);
void VKAPI_CALL vkGetPhysicalDeviceExternalBufferPropertiesKHR(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfo *pExternalBufferInfo, VkExternalBufferProperties *pExternalBufferProperties);
void VKAPI_CALL vkGetPhysicalDeviceExternalFenceProperties(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfo *pExternalFenceInfo, VkExternalFenceProperties *pExternalFenceProperties);
--
2.21.0
1
0
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/winevulkan/make_vulkan | 1 -
dlls/winevulkan/vulkan_thunks.c | 17 +++++++++++++++++
include/wine/vulkan.h | 18 ++++++++++++++++++
3 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
index 46294f7054b6..f6a63cb2af68 100755
--- a/dlls/winevulkan/make_vulkan
+++ b/dlls/winevulkan/make_vulkan
@@ -105,7 +105,6 @@ BLACKLISTED_EXTENSIONS = [
"VK_EXT_external_memory_host",
"VK_EXT_full_screen_exclusive",
"VK_EXT_hdr_metadata", # Needs WSI work.
- "VK_EXT_memory_priority",
"VK_EXT_pipeline_creation_feedback",
"VK_EXT_ycbcr_image_arrays",
"VK_GOOGLE_display_timing",
diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c
index 9919642fa92d..b2b0037fc4ce 100644
--- a/dlls/winevulkan/vulkan_thunks.c
+++ b/dlls/winevulkan/vulkan_thunks.c
@@ -1894,6 +1894,22 @@ VkResult convert_VkDeviceCreateInfo_struct_chain(const void *pNext, VkDeviceCrea
break;
}
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT:
+ {
+ const VkPhysicalDeviceMemoryPriorityFeaturesEXT *in = (const VkPhysicalDeviceMemoryPriorityFeaturesEXT *)in_header;
+ VkPhysicalDeviceMemoryPriorityFeaturesEXT *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->memoryPriority = in->memoryPriority;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT:
{
const VkPhysicalDeviceBufferAddressFeaturesEXT *in = (const VkPhysicalDeviceBufferAddressFeaturesEXT *)in_header;
@@ -4268,6 +4284,7 @@ static const char * const vk_device_extensions[] =
"VK_EXT_host_query_reset",
"VK_EXT_inline_uniform_block",
"VK_EXT_memory_budget",
+ "VK_EXT_memory_priority",
"VK_EXT_pci_bus_info",
"VK_EXT_post_depth_coverage",
"VK_EXT_queue_family_foreign",
diff --git a/include/wine/vulkan.h b/include/wine/vulkan.h
index 5a48441c38ba..7a98951e0bf7 100644
--- a/include/wine/vulkan.h
+++ b/include/wine/vulkan.h
@@ -300,6 +300,8 @@
#define VK_GOOGLE_DECORATE_STRING_EXTENSION_NAME "VK_GOOGLE_decorate_string"
#define VK_EXT_MEMORY_BUDGET_SPEC_VERSION 1
#define VK_EXT_MEMORY_BUDGET_EXTENSION_NAME "VK_EXT_memory_budget"
+#define VK_EXT_MEMORY_PRIORITY_SPEC_VERSION 1
+#define VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME "VK_EXT_memory_priority"
#define VK_EXT_BUFFER_DEVICE_ADDRESS_SPEC_VERSION 2
#define VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME "VK_EXT_buffer_device_address"
#define VK_EXT_SEPARATE_STENCIL_USAGE_SPEC_VERSION 1
@@ -2101,6 +2103,8 @@ typedef enum VkStructureType
VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT = 1000218002,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT = 1000221000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT = 1000237000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT = 1000238000,
+ VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT = 1000238001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT = 1000244000,
VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT = 1000244001,
VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT = 1000244002,
@@ -2966,6 +2970,13 @@ typedef struct VkPhysicalDeviceLimits
VkDeviceSize WINE_VK_ALIGN(8) nonCoherentAtomSize;
} VkPhysicalDeviceLimits;
+typedef struct VkPhysicalDeviceMemoryPriorityFeaturesEXT
+{
+ VkStructureType sType;
+ void *pNext;
+ VkBool32 memoryPriority;
+} VkPhysicalDeviceMemoryPriorityFeaturesEXT;
+
typedef struct VkPhysicalDeviceMeshShaderPropertiesNV
{
VkStructureType sType;
@@ -3659,6 +3670,13 @@ typedef struct VkMemoryDedicatedRequirements
VkBool32 requiresDedicatedAllocation;
} VkMemoryDedicatedRequirements;
+typedef struct VkMemoryPriorityAllocateInfoEXT
+{
+ VkStructureType sType;
+ const void *pNext;
+ float priority;
+} VkMemoryPriorityAllocateInfoEXT;
+
typedef struct VkMemoryType
{
VkMemoryPropertyFlags propertyFlags;
--
2.21.0
1
0
10 Apr '19
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/winevulkan/make_vulkan | 1 -
dlls/winevulkan/vulkan_thunks.c | 17 +++++++++++++++++
include/wine/vulkan.h | 18 ++++++++++++++++++
3 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
index af3765762680..46294f7054b6 100755
--- a/dlls/winevulkan/make_vulkan
+++ b/dlls/winevulkan/make_vulkan
@@ -101,7 +101,6 @@ BLACKLISTED_EXTENSIONS = [
# Device extensions
"VK_AMD_display_native_hdr",
"VK_EXT_calibrated_timestamps",
- "VK_AMD_memory_overallocation_behavior",
"VK_EXT_display_control", # Requires VK_EXT_display_surface_counter
"VK_EXT_external_memory_host",
"VK_EXT_full_screen_exclusive",
diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c
index fc41fb00e330..9919642fa92d 100644
--- a/dlls/winevulkan/vulkan_thunks.c
+++ b/dlls/winevulkan/vulkan_thunks.c
@@ -1828,6 +1828,22 @@ VkResult convert_VkDeviceCreateInfo_struct_chain(const void *pNext, VkDeviceCrea
break;
}
+ case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD:
+ {
+ const VkDeviceMemoryOverallocationCreateInfoAMD *in = (const VkDeviceMemoryOverallocationCreateInfoAMD *)in_header;
+ VkDeviceMemoryOverallocationCreateInfoAMD *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->overallocationBehavior = in->overallocationBehavior;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
{
const VkPhysicalDeviceFragmentDensityMapFeaturesEXT *in = (const VkPhysicalDeviceFragmentDensityMapFeaturesEXT *)in_header;
@@ -4225,6 +4241,7 @@ static const char * const vk_device_extensions[] =
"VK_AMD_gcn_shader",
"VK_AMD_gpu_shader_half_float",
"VK_AMD_gpu_shader_int16",
+ "VK_AMD_memory_overallocation_behavior",
"VK_AMD_mixed_attachment_samples",
"VK_AMD_negative_viewport_height",
"VK_AMD_rasterization_order",
diff --git a/include/wine/vulkan.h b/include/wine/vulkan.h
index 2a86277fe204..5a48441c38ba 100644
--- a/include/wine/vulkan.h
+++ b/include/wine/vulkan.h
@@ -260,6 +260,8 @@
#define VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME "VK_KHR_shader_atomic_int64"
#define VK_AMD_SHADER_CORE_PROPERTIES_SPEC_VERSION 1
#define VK_AMD_SHADER_CORE_PROPERTIES_EXTENSION_NAME "VK_AMD_shader_core_properties"
+#define VK_AMD_MEMORY_OVERALLOCATION_BEHAVIOR_SPEC_VERSION 1
+#define VK_AMD_MEMORY_OVERALLOCATION_BEHAVIOR_EXTENSION_NAME "VK_AMD_memory_overallocation_behavior"
#define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION 3
#define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME "VK_EXT_vertex_attribute_divisor"
#define VK_KHR_DRIVER_PROPERTIES_SPEC_VERSION 1
@@ -1445,6 +1447,14 @@ typedef enum VkMemoryHeapFlagBits
VK_MEMORY_HEAP_FLAG_BITS_MAX_ENUM = 0x7fffffff,
} VkMemoryHeapFlagBits;
+typedef enum VkMemoryOverallocationBehaviorAMD
+{
+ VK_MEMORY_OVERALLOCATION_BEHAVIOR_DEFAULT_AMD = 0,
+ VK_MEMORY_OVERALLOCATION_BEHAVIOR_ALLOWED_AMD = 1,
+ VK_MEMORY_OVERALLOCATION_BEHAVIOR_DISALLOWED_AMD = 2,
+ VK_MEMORY_OVERALLOCATION_BEHAVIOR_AMD_MAX_ENUM = 0x7fffffff,
+} VkMemoryOverallocationBehaviorAMD;
+
typedef enum VkMemoryPropertyFlagBits
{
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT = 0x00000001,
@@ -2067,6 +2077,7 @@ typedef enum VkStructureType
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR = 1000177000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR = 1000180000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD = 1000185000,
+ VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD = 1000189000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT = 1000190000,
VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT = 1000190001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT = 1000190002,
@@ -2429,6 +2440,13 @@ typedef struct VkDeviceGroupPresentInfoKHR
VkDeviceGroupPresentModeFlagBitsKHR mode;
} VkDeviceGroupPresentInfoKHR;
+typedef struct VkDeviceMemoryOverallocationCreateInfoAMD
+{
+ VkStructureType sType;
+ const void *pNext;
+ VkMemoryOverallocationBehaviorAMD overallocationBehavior;
+} VkDeviceMemoryOverallocationCreateInfoAMD;
+
typedef struct VkDeviceQueueGlobalPriorityCreateInfoEXT
{
VkStructureType sType;
--
2.21.0
1
0
[PATCH 2/9] winevulkan: Generate conversion function for VkDeviceCreateInfo structure extensions.
by Józef Kucia 10 Apr '19
by Józef Kucia 10 Apr '19
10 Apr '19
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/winevulkan/make_vulkan | 1 +
dlls/winevulkan/vulkan.c | 168 +++------
dlls/winevulkan/vulkan_thunks.c | 579 ++++++++++++++++++++++++++++++++
dlls/winevulkan/vulkan_thunks.h | 2 +
4 files changed, 622 insertions(+), 128 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
index eb68a7be598f..af3765762680 100755
--- a/dlls/winevulkan/make_vulkan
+++ b/dlls/winevulkan/make_vulkan
@@ -221,6 +221,7 @@ FUNCTION_OVERRIDES = {
}
STRUCT_CHAIN_CONVERSIONS = [
+ "VkDeviceCreateInfo",
"VkInstanceCreateInfo",
]
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c
index 259d7d18e7c1..725bdf019e2c 100644
--- a/dlls/winevulkan/vulkan.c
+++ b/dlls/winevulkan/vulkan.c
@@ -207,128 +207,48 @@ static struct VkQueue_T *wine_vk_device_alloc_queues(struct VkDevice_T *device,
return queues;
}
-static void *convert_VkPhysicalDeviceFeatures2(const void *src)
-{
- const VkPhysicalDeviceFeatures2 *in = src;
- VkPhysicalDeviceFeatures2 *out;
-
- if (!(out = heap_alloc(sizeof(*out))))
- return NULL;
-
- *out = *in;
- out->pNext = NULL;
-
- return out;
-}
-
-static void *convert_VkDeviceGroupDeviceCreateInfo(const void *src)
-{
- const VkDeviceGroupDeviceCreateInfo *in = src;
- VkDeviceGroupDeviceCreateInfo *out;
- VkPhysicalDevice *physical_devices;
- unsigned int i;
-
- if (!(out = heap_alloc(sizeof(*out))))
- return NULL;
-
- *out = *in;
- out->pNext = NULL;
- if (!(physical_devices = heap_calloc(in->physicalDeviceCount, sizeof(*physical_devices))))
- {
- heap_free(out);
- return NULL;
- }
- for (i = 0; i < in->physicalDeviceCount; ++i)
- physical_devices[i] = in->pPhysicalDevices[i]->phys_dev;
- out->pPhysicalDevices = physical_devices;
-
- return out;
-}
-
-static void *convert_VkPhysicalDeviceHostQueryResetFeaturesEXT(const void *src)
-{
- const VkPhysicalDeviceHostQueryResetFeaturesEXT *in = src;
- VkPhysicalDeviceHostQueryResetFeaturesEXT *out;
-
- if (!(out = heap_alloc(sizeof(*out))))
- return NULL;
-
- *out = *in;
- out->pNext = NULL;
-
- return out;
-}
-
static void wine_vk_device_free_create_info(VkDeviceCreateInfo *create_info)
{
- VkPhysicalDeviceHostQueryResetFeaturesEXT *host_query_reset_features;
- VkPhysicalDeviceFeatures2 *device_features;
VkDeviceGroupDeviceCreateInfo *group_info;
- device_features = wine_vk_find_struct(create_info, PHYSICAL_DEVICE_FEATURES_2);
- group_info = wine_vk_find_struct(create_info, DEVICE_GROUP_DEVICE_CREATE_INFO);
- host_query_reset_features = wine_vk_find_struct(create_info, PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT);
- create_info->pNext = NULL;
-
- heap_free(device_features);
- if (group_info)
+ if ((group_info = wine_vk_find_struct(create_info, DEVICE_GROUP_DEVICE_CREATE_INFO)))
{
heap_free((void *)group_info->pPhysicalDevices);
- heap_free(group_info);
}
- heap_free(host_query_reset_features);
+
+ free_VkDeviceCreateInfo_struct_chain(create_info);
}
static VkResult wine_vk_device_convert_create_info(const VkDeviceCreateInfo *src,
VkDeviceCreateInfo *dst)
{
+ VkDeviceGroupDeviceCreateInfo *group_info;
unsigned int i;
+ VkResult res;
*dst = *src;
- /* Application and loader can pass in a chain of extensions through pNext.
- * We can't blindly pass these through as often these contain callbacks or
- * they can even be pass structures for loader / ICD internal use.
- */
- if (src->pNext)
+ if ((res = convert_VkDeviceCreateInfo_struct_chain(src->pNext, dst)) < 0)
{
- const VkBaseInStructure *header;
- VkBaseOutStructure *dst_header;
+ WARN("Failed to convert VkDeviceCreateInfo pNext chain, res=%d.\n", res);
+ return res;
+ }
+
+ /* FIXME: convert_VkDeviceCreateInfo_struct_chain() should unwrap handles for us. */
+ if ((group_info = wine_vk_find_struct(dst, DEVICE_GROUP_DEVICE_CREATE_INFO)))
+ {
+ VkPhysicalDevice *physical_devices;
- dst->pNext = NULL;
- dst_header = (VkBaseOutStructure *)dst;
- for (header = src->pNext; header; header = header->pNext)
+ if (!(physical_devices = heap_calloc(group_info->physicalDeviceCount, sizeof(*physical_devices))))
+ {
+ free_VkDeviceCreateInfo_struct_chain(dst);
+ return VK_ERROR_OUT_OF_HOST_MEMORY;
+ }
+ for (i = 0; i < group_info->physicalDeviceCount; ++i)
{
- switch (header->sType)
- {
- case VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO:
- /* Used for loader to ICD communication. Ignore to not confuse
- * host loader.
- */
- break;
-
- case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
- if (!(dst_header->pNext = convert_VkDeviceGroupDeviceCreateInfo(header)))
- goto err;
- dst_header = dst_header->pNext;
- break;
-
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
- if (!(dst_header->pNext = convert_VkPhysicalDeviceFeatures2(header)))
- goto err;
- dst_header = dst_header->pNext;
- break;
-
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT:
- if (!(dst_header->pNext = convert_VkPhysicalDeviceHostQueryResetFeaturesEXT(header)))
- goto err;
- dst_header = dst_header->pNext;
- break;
-
- default:
- FIXME("Application requested a linked structure of type %u.\n", header->sType);
- }
+ physical_devices[i] = group_info->pPhysicalDevices[i]->phys_dev;
}
+ group_info->pPhysicalDevices = physical_devices;
}
/* Should be filtered out by loader as ICDs don't support layers. */
@@ -343,15 +263,12 @@ static VkResult wine_vk_device_convert_create_info(const VkDeviceCreateInfo *src
if (!wine_vk_device_extension_supported(extension_name))
{
WARN("Extension %s is not supported.\n", debugstr_a(extension_name));
+ wine_vk_device_free_create_info(dst);
return VK_ERROR_EXTENSION_NOT_PRESENT;
}
}
return VK_SUCCESS;
-
-err:
- wine_vk_device_free_create_info(dst);
- return VK_ERROR_OUT_OF_HOST_MEMORY;
}
/* Helper function used for freeing a device structure. This function supports full
@@ -655,21 +572,15 @@ VkResult WINAPI wine_vkCreateDevice(VkPhysicalDevice phys_dev,
res = wine_vk_device_convert_create_info(create_info, &create_info_host);
if (res != VK_SUCCESS)
- {
- if (res != VK_ERROR_EXTENSION_NOT_PRESENT)
- ERR("Failed to convert VkDeviceCreateInfo, res=%d.\n", res);
- wine_vk_device_free(object);
- return res;
- }
+ goto fail;
res = phys_dev->instance->funcs.p_vkCreateDevice(phys_dev->phys_dev,
&create_info_host, NULL /* allocator */, &object->device);
wine_vk_device_free_create_info(&create_info_host);
if (res != VK_SUCCESS)
{
- ERR("Failed to create device.\n");
- wine_vk_device_free(object);
- return res;
+ WARN("Failed to create device, res=%d.\n", res);
+ goto fail;
}
/* Just load all function pointers we are aware off. The loader takes care of filtering.
@@ -679,7 +590,7 @@ VkResult WINAPI wine_vkCreateDevice(VkPhysicalDevice phys_dev,
#define USE_VK_FUNC(name) \
object->funcs.p_##name = (void *)vk_funcs->p_vkGetDeviceProcAddr(object->device, #name); \
if (object->funcs.p_##name == NULL) \
- TRACE("Not found %s\n", #name);
+ TRACE("Not found '%s'.\n", #name);
ALL_VK_DEVICE_FUNCS()
#undef USE_VK_FUNC
@@ -689,13 +600,12 @@ VkResult WINAPI wine_vkCreateDevice(VkPhysicalDevice phys_dev,
phys_dev->instance->funcs.p_vkGetPhysicalDeviceQueueFamilyProperties(phys_dev->phys_dev,
&max_queue_families, NULL);
object->max_queue_families = max_queue_families;
- TRACE("Max queue families: %u\n", object->max_queue_families);
+ TRACE("Max queue families: %u.\n", object->max_queue_families);
- object->queues = heap_calloc(max_queue_families, sizeof(*object->queues));
- if (!object->queues)
+ if (!(object->queues = heap_calloc(max_queue_families, sizeof(*object->queues))))
{
- wine_vk_device_free(object);
- return VK_ERROR_OUT_OF_HOST_MEMORY;
+ res = VK_ERROR_OUT_OF_HOST_MEMORY;
+ goto fail;
}
for (i = 0; i < create_info_host.queueCreateInfoCount; i++)
@@ -704,15 +614,13 @@ VkResult WINAPI wine_vkCreateDevice(VkPhysicalDevice phys_dev,
uint32_t family_index = create_info_host.pQueueCreateInfos[i].queueFamilyIndex;
uint32_t queue_count = create_info_host.pQueueCreateInfos[i].queueCount;
- TRACE("queueFamilyIndex %u, queueCount %u\n", family_index, queue_count);
+ TRACE("Queue family index %u, queue count %u.\n", family_index, queue_count);
- object->queues[family_index] = wine_vk_device_alloc_queues(object, family_index,
- queue_count, flags);
- if (!object->queues[family_index])
+ if (!(object->queues[family_index] = wine_vk_device_alloc_queues(object, family_index, queue_count, flags)))
{
- ERR("Failed to allocate memory for queues\n");
- wine_vk_device_free(object);
- return VK_ERROR_OUT_OF_HOST_MEMORY;
+ ERR("Failed to allocate memory for queues.\n");
+ res = VK_ERROR_OUT_OF_HOST_MEMORY;
+ goto fail;
}
}
@@ -721,6 +629,10 @@ VkResult WINAPI wine_vkCreateDevice(VkPhysicalDevice phys_dev,
*device = object;
TRACE("Created device %p (native device %p).\n", object, object->device);
return VK_SUCCESS;
+
+fail:
+ wine_vk_device_free(object);
+ return res;
}
VkResult WINAPI wine_vkCreateInstance(const VkInstanceCreateInfo *create_info,
diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c
index 2f0cc6218e22..fc41fb00e330 100644
--- a/dlls/winevulkan/vulkan_thunks.c
+++ b/dlls/winevulkan/vulkan_thunks.c
@@ -1343,6 +1343,585 @@ static inline void free_VkCopyDescriptorSet_array(VkCopyDescriptorSet_host *in,
#endif /* USE_STRUCT_CONVERSION */
+VkResult convert_VkDeviceCreateInfo_struct_chain(const void *pNext, VkDeviceCreateInfo *out_struct)
+{
+ VkBaseOutStructure *out_header = (VkBaseOutStructure *)out_struct;
+ const VkBaseInStructure *in_header;
+
+ out_header->pNext = NULL;
+
+ for (in_header = pNext; in_header; in_header = in_header->pNext)
+ {
+ switch (in_header->sType)
+ {
+ case VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO:
+ case VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO:
+ break;
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
+ {
+ const VkPhysicalDeviceFeatures2 *in = (const VkPhysicalDeviceFeatures2 *)in_header;
+ VkPhysicalDeviceFeatures2 *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->features = in->features;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES:
+ {
+ const VkPhysicalDeviceVariablePointerFeatures *in = (const VkPhysicalDeviceVariablePointerFeatures *)in_header;
+ VkPhysicalDeviceVariablePointerFeatures *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->variablePointersStorageBuffer = in->variablePointersStorageBuffer;
+ out->variablePointers = in->variablePointers;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES:
+ {
+ const VkPhysicalDeviceMultiviewFeatures *in = (const VkPhysicalDeviceMultiviewFeatures *)in_header;
+ VkPhysicalDeviceMultiviewFeatures *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->multiview = in->multiview;
+ out->multiviewGeometryShader = in->multiviewGeometryShader;
+ out->multiviewTessellationShader = in->multiviewTessellationShader;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
+ {
+ const VkDeviceGroupDeviceCreateInfo *in = (const VkDeviceGroupDeviceCreateInfo *)in_header;
+ VkDeviceGroupDeviceCreateInfo *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->physicalDeviceCount = in->physicalDeviceCount;
+ out->pPhysicalDevices = in->pPhysicalDevices;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES:
+ {
+ const VkPhysicalDevice16BitStorageFeatures *in = (const VkPhysicalDevice16BitStorageFeatures *)in_header;
+ VkPhysicalDevice16BitStorageFeatures *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->storageBuffer16BitAccess = in->storageBuffer16BitAccess;
+ out->uniformAndStorageBuffer16BitAccess = in->uniformAndStorageBuffer16BitAccess;
+ out->storagePushConstant16 = in->storagePushConstant16;
+ out->storageInputOutput16 = in->storageInputOutput16;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES:
+ {
+ const VkPhysicalDeviceSamplerYcbcrConversionFeatures *in = (const VkPhysicalDeviceSamplerYcbcrConversionFeatures *)in_header;
+ VkPhysicalDeviceSamplerYcbcrConversionFeatures *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->samplerYcbcrConversion = in->samplerYcbcrConversion;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES:
+ {
+ const VkPhysicalDeviceProtectedMemoryFeatures *in = (const VkPhysicalDeviceProtectedMemoryFeatures *)in_header;
+ VkPhysicalDeviceProtectedMemoryFeatures *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->protectedMemory = in->protectedMemory;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT:
+ {
+ const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT *in = (const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT *)in_header;
+ VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->advancedBlendCoherentOperations = in->advancedBlendCoherentOperations;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT:
+ {
+ const VkPhysicalDeviceInlineUniformBlockFeaturesEXT *in = (const VkPhysicalDeviceInlineUniformBlockFeaturesEXT *)in_header;
+ VkPhysicalDeviceInlineUniformBlockFeaturesEXT *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->inlineUniformBlock = in->inlineUniformBlock;
+ out->descriptorBindingInlineUniformBlockUpdateAfterBind = in->descriptorBindingInlineUniformBlockUpdateAfterBind;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES:
+ {
+ const VkPhysicalDeviceShaderDrawParameterFeatures *in = (const VkPhysicalDeviceShaderDrawParameterFeatures *)in_header;
+ VkPhysicalDeviceShaderDrawParameterFeatures *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->shaderDrawParameters = in->shaderDrawParameters;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT:
+ {
+ const VkPhysicalDeviceHostQueryResetFeaturesEXT *in = (const VkPhysicalDeviceHostQueryResetFeaturesEXT *)in_header;
+ VkPhysicalDeviceHostQueryResetFeaturesEXT *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->hostQueryReset = in->hostQueryReset;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT:
+ {
+ const VkPhysicalDeviceDescriptorIndexingFeaturesEXT *in = (const VkPhysicalDeviceDescriptorIndexingFeaturesEXT *)in_header;
+ VkPhysicalDeviceDescriptorIndexingFeaturesEXT *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->shaderInputAttachmentArrayDynamicIndexing = in->shaderInputAttachmentArrayDynamicIndexing;
+ out->shaderUniformTexelBufferArrayDynamicIndexing = in->shaderUniformTexelBufferArrayDynamicIndexing;
+ out->shaderStorageTexelBufferArrayDynamicIndexing = in->shaderStorageTexelBufferArrayDynamicIndexing;
+ out->shaderUniformBufferArrayNonUniformIndexing = in->shaderUniformBufferArrayNonUniformIndexing;
+ out->shaderSampledImageArrayNonUniformIndexing = in->shaderSampledImageArrayNonUniformIndexing;
+ out->shaderStorageBufferArrayNonUniformIndexing = in->shaderStorageBufferArrayNonUniformIndexing;
+ out->shaderStorageImageArrayNonUniformIndexing = in->shaderStorageImageArrayNonUniformIndexing;
+ out->shaderInputAttachmentArrayNonUniformIndexing = in->shaderInputAttachmentArrayNonUniformIndexing;
+ out->shaderUniformTexelBufferArrayNonUniformIndexing = in->shaderUniformTexelBufferArrayNonUniformIndexing;
+ out->shaderStorageTexelBufferArrayNonUniformIndexing = in->shaderStorageTexelBufferArrayNonUniformIndexing;
+ out->descriptorBindingUniformBufferUpdateAfterBind = in->descriptorBindingUniformBufferUpdateAfterBind;
+ out->descriptorBindingSampledImageUpdateAfterBind = in->descriptorBindingSampledImageUpdateAfterBind;
+ out->descriptorBindingStorageImageUpdateAfterBind = in->descriptorBindingStorageImageUpdateAfterBind;
+ out->descriptorBindingStorageBufferUpdateAfterBind = in->descriptorBindingStorageBufferUpdateAfterBind;
+ out->descriptorBindingUniformTexelBufferUpdateAfterBind = in->descriptorBindingUniformTexelBufferUpdateAfterBind;
+ out->descriptorBindingStorageTexelBufferUpdateAfterBind = in->descriptorBindingStorageTexelBufferUpdateAfterBind;
+ out->descriptorBindingUpdateUnusedWhilePending = in->descriptorBindingUpdateUnusedWhilePending;
+ out->descriptorBindingPartiallyBound = in->descriptorBindingPartiallyBound;
+ out->descriptorBindingVariableDescriptorCount = in->descriptorBindingVariableDescriptorCount;
+ out->runtimeDescriptorArray = in->runtimeDescriptorArray;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR:
+ {
+ const VkPhysicalDevice8BitStorageFeaturesKHR *in = (const VkPhysicalDevice8BitStorageFeaturesKHR *)in_header;
+ VkPhysicalDevice8BitStorageFeaturesKHR *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->storageBuffer8BitAccess = in->storageBuffer8BitAccess;
+ out->uniformAndStorageBuffer8BitAccess = in->uniformAndStorageBuffer8BitAccess;
+ out->storagePushConstant8 = in->storagePushConstant8;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT:
+ {
+ const VkPhysicalDeviceConditionalRenderingFeaturesEXT *in = (const VkPhysicalDeviceConditionalRenderingFeaturesEXT *)in_header;
+ VkPhysicalDeviceConditionalRenderingFeaturesEXT *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->conditionalRendering = in->conditionalRendering;
+ out->inheritedConditionalRendering = in->inheritedConditionalRendering;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR:
+ {
+ const VkPhysicalDeviceVulkanMemoryModelFeaturesKHR *in = (const VkPhysicalDeviceVulkanMemoryModelFeaturesKHR *)in_header;
+ VkPhysicalDeviceVulkanMemoryModelFeaturesKHR *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->vulkanMemoryModel = in->vulkanMemoryModel;
+ out->vulkanMemoryModelDeviceScope = in->vulkanMemoryModelDeviceScope;
+ out->vulkanMemoryModelAvailabilityVisibilityChains = in->vulkanMemoryModelAvailabilityVisibilityChains;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR:
+ {
+ const VkPhysicalDeviceShaderAtomicInt64FeaturesKHR *in = (const VkPhysicalDeviceShaderAtomicInt64FeaturesKHR *)in_header;
+ VkPhysicalDeviceShaderAtomicInt64FeaturesKHR *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->shaderBufferInt64Atomics = in->shaderBufferInt64Atomics;
+ out->shaderSharedInt64Atomics = in->shaderSharedInt64Atomics;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT:
+ {
+ const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *in = (const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *)in_header;
+ VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->vertexAttributeInstanceRateDivisor = in->vertexAttributeInstanceRateDivisor;
+ out->vertexAttributeInstanceRateZeroDivisor = in->vertexAttributeInstanceRateZeroDivisor;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT:
+ {
+ const VkPhysicalDeviceASTCDecodeFeaturesEXT *in = (const VkPhysicalDeviceASTCDecodeFeaturesEXT *)in_header;
+ VkPhysicalDeviceASTCDecodeFeaturesEXT *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->decodeModeSharedExponent = in->decodeModeSharedExponent;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT:
+ {
+ const VkPhysicalDeviceTransformFeedbackFeaturesEXT *in = (const VkPhysicalDeviceTransformFeedbackFeaturesEXT *)in_header;
+ VkPhysicalDeviceTransformFeedbackFeaturesEXT *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->transformFeedback = in->transformFeedback;
+ out->geometryStreams = in->geometryStreams;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV:
+ {
+ const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV *in = (const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV *)in_header;
+ VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->representativeFragmentTest = in->representativeFragmentTest;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV:
+ {
+ const VkPhysicalDeviceExclusiveScissorFeaturesNV *in = (const VkPhysicalDeviceExclusiveScissorFeaturesNV *)in_header;
+ VkPhysicalDeviceExclusiveScissorFeaturesNV *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->exclusiveScissor = in->exclusiveScissor;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV:
+ {
+ const VkPhysicalDeviceCornerSampledImageFeaturesNV *in = (const VkPhysicalDeviceCornerSampledImageFeaturesNV *)in_header;
+ VkPhysicalDeviceCornerSampledImageFeaturesNV *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->cornerSampledImage = in->cornerSampledImage;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV:
+ {
+ const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV *in = (const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV *)in_header;
+ VkPhysicalDeviceComputeShaderDerivativesFeaturesNV *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->computeDerivativeGroupQuads = in->computeDerivativeGroupQuads;
+ out->computeDerivativeGroupLinear = in->computeDerivativeGroupLinear;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV:
+ {
+ const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV *in = (const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV *)in_header;
+ VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->fragmentShaderBarycentric = in->fragmentShaderBarycentric;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV:
+ {
+ const VkPhysicalDeviceShaderImageFootprintFeaturesNV *in = (const VkPhysicalDeviceShaderImageFootprintFeaturesNV *)in_header;
+ VkPhysicalDeviceShaderImageFootprintFeaturesNV *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->imageFootprint = in->imageFootprint;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV:
+ {
+ const VkPhysicalDeviceShadingRateImageFeaturesNV *in = (const VkPhysicalDeviceShadingRateImageFeaturesNV *)in_header;
+ VkPhysicalDeviceShadingRateImageFeaturesNV *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->shadingRateImage = in->shadingRateImage;
+ out->shadingRateCoarseSampleOrder = in->shadingRateCoarseSampleOrder;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV:
+ {
+ const VkPhysicalDeviceMeshShaderFeaturesNV *in = (const VkPhysicalDeviceMeshShaderFeaturesNV *)in_header;
+ VkPhysicalDeviceMeshShaderFeaturesNV *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->taskShader = in->taskShader;
+ out->meshShader = in->meshShader;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
+ {
+ const VkPhysicalDeviceFragmentDensityMapFeaturesEXT *in = (const VkPhysicalDeviceFragmentDensityMapFeaturesEXT *)in_header;
+ VkPhysicalDeviceFragmentDensityMapFeaturesEXT *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->fragmentDensityMap = in->fragmentDensityMap;
+ out->fragmentDensityMapDynamic = in->fragmentDensityMapDynamic;
+ out->fragmentDensityMapNonSubsampledImages = in->fragmentDensityMapNonSubsampledImages;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT:
+ {
+ const VkPhysicalDeviceScalarBlockLayoutFeaturesEXT *in = (const VkPhysicalDeviceScalarBlockLayoutFeaturesEXT *)in_header;
+ VkPhysicalDeviceScalarBlockLayoutFeaturesEXT *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->scalarBlockLayout = in->scalarBlockLayout;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT:
+ {
+ const VkPhysicalDeviceDepthClipEnableFeaturesEXT *in = (const VkPhysicalDeviceDepthClipEnableFeaturesEXT *)in_header;
+ VkPhysicalDeviceDepthClipEnableFeaturesEXT *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->depthClipEnable = in->depthClipEnable;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT:
+ {
+ const VkPhysicalDeviceBufferAddressFeaturesEXT *in = (const VkPhysicalDeviceBufferAddressFeaturesEXT *)in_header;
+ VkPhysicalDeviceBufferAddressFeaturesEXT *out;
+
+ if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;
+
+ out->sType = in->sType;
+ out->pNext = NULL;
+ out->bufferDeviceAddress = in->bufferDeviceAddress;
+ out->bufferDeviceAddressCaptureReplay = in->bufferDeviceAddressCaptureReplay;
+ out->bufferDeviceAddressMultiDevice = in->bufferDeviceAddressMultiDevice;
+
+ out_header->pNext = (VkBaseOutStructure *)out;
+ out_header = out_header->pNext;
+ break;
+ }
+
+ default:
+ FIXME("Application requested a linked structure of type %u.\n", in_header->sType);
+ }
+ }
+
+ return VK_SUCCESS;
+
+out_of_memory:
+ free_VkDeviceCreateInfo_struct_chain(out_struct);
+ return VK_ERROR_OUT_OF_HOST_MEMORY;
+}
+
+void free_VkDeviceCreateInfo_struct_chain(VkDeviceCreateInfo *s)
+{
+ VkBaseOutStructure *header = (void *)s->pNext;
+
+ while (header)
+ {
+ void *prev = header;
+ header = header->pNext;
+ heap_free(prev);
+ }
+
+ s->pNext = NULL;
+}
+
VkResult convert_VkInstanceCreateInfo_struct_chain(const void *pNext, VkInstanceCreateInfo *out_struct)
{
VkBaseOutStructure *out_header = (VkBaseOutStructure *)out_struct;
diff --git a/dlls/winevulkan/vulkan_thunks.h b/dlls/winevulkan/vulkan_thunks.h
index 3b8a93176abd..5da9aa9c4cae 100644
--- a/dlls/winevulkan/vulkan_thunks.h
+++ b/dlls/winevulkan/vulkan_thunks.h
@@ -765,6 +765,8 @@ typedef struct VkCopyDescriptorSet_host
} VkCopyDescriptorSet_host;
+VkResult convert_VkDeviceCreateInfo_struct_chain(const void *pNext, VkDeviceCreateInfo *out_struct) DECLSPEC_HIDDEN;
+void free_VkDeviceCreateInfo_struct_chain(VkDeviceCreateInfo *s) DECLSPEC_HIDDEN;
VkResult convert_VkInstanceCreateInfo_struct_chain(const void *pNext, VkInstanceCreateInfo *out_struct) DECLSPEC_HIDDEN;
void free_VkInstanceCreateInfo_struct_chain(VkInstanceCreateInfo *s) DECLSPEC_HIDDEN;
--
2.21.0
1
0
[PATCH 1/9] winevulkan: Generate conversion function for VkInstanceCreateInfo structure extensions.
by Józef Kucia 10 Apr '19
by Józef Kucia 10 Apr '19
10 Apr '19
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/winevulkan/make_vulkan | 145 +++++++++++++++++++++++++++++---
dlls/winevulkan/vulkan.c | 31 ++-----
dlls/winevulkan/vulkan_thunks.c | 37 ++++++++
dlls/winevulkan/vulkan_thunks.h | 3 +
4 files changed, 177 insertions(+), 39 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
index 20643fa1e34c..eb68a7be598f 100755
--- a/dlls/winevulkan/make_vulkan
+++ b/dlls/winevulkan/make_vulkan
@@ -220,6 +220,10 @@ FUNCTION_OVERRIDES = {
"vkGetPhysicalDevicePresentRectanglesKHR" : {"dispatch" : True, "driver" : True, "thunk" : True},
}
+STRUCT_CHAIN_CONVERSIONS = [
+ "VkInstanceCreateInfo",
+]
+
class Direction(Enum):
""" Parameter direction: input, output, input_output. """
@@ -912,7 +916,7 @@ class VkHandle(object):
class VkMember(object):
def __init__(self, const=False, struct_fwd_decl=False,_type=None, pointer=None, name=None, array_len=None,
- dyn_array_len=None, optional=False):
+ dyn_array_len=None, optional=False, values=None):
self.const = const
self.struct_fwd_decl = struct_fwd_decl
self.name = name
@@ -922,6 +926,7 @@ class VkMember(object):
self.array_len = array_len
self.dyn_array_len = dyn_array_len
self.optional = optional
+ self.values = values
def __eq__(self, other):
""" Compare member based on name against a string.
@@ -930,10 +935,7 @@ class VkMember(object):
if certain members exist.
"""
- if self.name == other:
- return True
-
- return False
+ return self.name == other
def __repr__(self):
return "{0} {1} {2} {3} {4} {5} {6}".format(self.const, self.struct_fwd_decl, self.type, self.pointer,
@@ -952,6 +954,8 @@ class VkMember(object):
pointer = None
array_len = None
+ values = member.get("values")
+
if member.text:
if "const" in member.text:
const = True
@@ -993,7 +997,7 @@ class VkMember(object):
array_len = name_elem.tail.strip("[]")
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)
+ array_len=array_len, dyn_array_len=dyn_array_len, optional=optional, values=values)
def copy(self, input, output, direction):
""" Helper method for use by conversion logic to generate a C-code statement to copy this member. """
@@ -1739,10 +1743,7 @@ class ConversionFunction(object):
self._set_name()
def __eq__(self, other):
- if self.name != other.name:
- return False
-
- return True
+ return self.name == other.name
def _generate_array_conversion_func(self):
""" Helper function for generating a conversion function for array structs. """
@@ -1874,10 +1875,7 @@ class FreeFunction(object):
self.name = "free_{0}".format(self.type)
def __eq__(self, other):
- if self.name == other.name:
- return True
-
- return False
+ return self.name == other.name
def _generate_array_free_func(self):
""" Helper function for cleaning up temporary buffers required for array conversions. """
@@ -1939,12 +1937,119 @@ class FreeFunction(object):
return self._generate_free_func()
+class StructChainConversionFunction(object):
+ def __init__(self, direction, struct):
+ self.direction = direction
+ self.struct = struct
+ self.type = struct.name
+
+ self.name = "convert_{0}_struct_chain".format(self.type)
+
+ def __eq__(self, other):
+ return self.name == other.name
+
+ def prototype(self, postfix=""):
+ return "VkResult {0}(const void *pNext, {1} *out_struct) {2}".format(self.name, self.type, postfix).strip()
+
+ def definition(self):
+ body = self.prototype()
+ body += "\n{\n"
+
+ body += " VkBaseOutStructure *out_header = (VkBaseOutStructure *)out_struct;\n";
+ body += " const VkBaseInStructure *in_header;\n\n";
+
+ body += " out_header->pNext = NULL;\n\n"
+
+ body += " for (in_header = pNext; in_header; in_header = in_header->pNext)\n"
+ body += " {\n"
+ body += " switch (in_header->sType)\n"
+ body += " {\n"
+
+ # Ignore to not confuse host loader.
+ body += " case VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO:\n"
+ body += " case VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO:\n"
+ body += " break;\n\n"
+
+ for e in self.struct.struct_extensions:
+ if not e.required:
+ continue
+
+ stype = next(x for x in e.members if x.name == "sType")
+
+ body += " case {0}:\n".format(stype.values)
+ body += " {\n"
+
+ body += " const {0} *in = (const {0} *)in_header;\n".format(e.name)
+ body += " {0} *out;\n\n".format(e.name)
+
+ body += " if (!(out = heap_alloc(sizeof(*out)))) goto out_of_memory;\n\n"
+
+ for m in e:
+ if m.name == "pNext":
+ body += " out->pNext = NULL;\n"
+ else:
+ body += " " + m.copy("in->", "out->", self.direction)
+
+ body += "\n out_header->pNext = (VkBaseOutStructure *)out;\n"
+ body += " out_header = out_header->pNext;\n"
+ body += " break;\n"
+ body += " }\n\n"
+
+ body += " default:\n"
+ body += " FIXME(\"Application requested a linked structure of type %u.\\n\", in_header->sType);\n"
+
+ body += " }\n"
+ body += " }\n\n"
+
+ body += " return VK_SUCCESS;\n"
+
+ if any(x for x in self.struct.struct_extensions if x.required):
+ body += "\nout_of_memory:\n"
+ body += " free_{0}_struct_chain(out_struct);\n".format(self.type)
+ body += " return VK_ERROR_OUT_OF_HOST_MEMORY;\n"
+
+ body += "}\n\n"
+ return body
+
+class FreeStructChainFunction(object):
+ def __init__(self, struct):
+ self.struct = struct
+ self.type = struct.name
+
+ self.name = "free_{0}_struct_chain".format(self.type)
+
+ def __eq__(self, other):
+ return self.name == other.name
+
+ def prototype(self, postfix=""):
+ return "void {0}({1} *s) {2}".format(self.name, self.type, postfix).strip()
+
+ def definition(self):
+ body = self.prototype()
+ body += "\n{\n"
+
+ body += " VkBaseOutStructure *header = (void *)s->pNext;\n\n";
+
+ body += " while (header)\n"
+ body += " {\n"
+ body += " void *prev = header;\n"
+ body += " header = header->pNext;\n"
+ body += " heap_free(prev);\n"
+ body += " }\n\n"
+
+ body += " s->pNext = NULL;\n"
+
+ body += "}\n\n"
+ return body
+
+
class VkGenerator(object):
def __init__(self, registry):
self.registry = registry
# Build a list conversion functions for struct conversion.
self.conversions = []
+ self.struct_chain_conversions = []
self.host_structs = []
for func in self.registry.funcs.values():
if not func.is_required():
@@ -1966,6 +2071,11 @@ class VkGenerator(object):
if not any(s.name == conv.struct.name for s in self.host_structs):
self.host_structs.append(conv.struct)
+ for struct in self.registry.structs:
+ if struct.name in STRUCT_CHAIN_CONVERSIONS:
+ self.struct_chain_conversions.append(StructChainConversionFunction(Direction.INPUT, struct))
+ self.struct_chain_conversions.append(FreeStructChainFunction(struct))
+
def _generate_copyright(self, f, spec_file=False):
f.write("# " if spec_file else "/* ")
f.write("Automatically generated from Vulkan vk.xml; DO NOT EDIT!\n")
@@ -1991,6 +2101,9 @@ class VkGenerator(object):
f.write(conv.definition())
f.write("#endif /* USE_STRUCT_CONVERSION */\n\n")
+ for conv in self.struct_chain_conversions:
+ f.write(conv.definition())
+
# Create thunks for instance and device functions.
# Global functions don't go through the thunks.
for vk_func in self.registry.funcs.values():
@@ -2128,6 +2241,10 @@ class VkGenerator(object):
f.write(struct.definition(align=False, conv=True, postfix="_host"))
f.write("\n")
+ for func in self.struct_chain_conversions:
+ f.write(func.prototype(postfix="DECLSPEC_HIDDEN") + ";\n")
+ f.write("\n")
+
f.write("/* For use by vkDevice and children */\n")
f.write("struct vulkan_device_funcs\n{\n")
for vk_func in self.registry.device_funcs:
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c
index f86064c4b661..259d7d18e7c1 100644
--- a/dlls/winevulkan/vulkan.c
+++ b/dlls/winevulkan/vulkan.c
@@ -407,36 +407,15 @@ static VkResult wine_vk_instance_convert_create_info(const VkInstanceCreateInfo
VkInstanceCreateInfo *dst)
{
unsigned int i;
+ VkResult res;
*dst = *src;
- /* Application and loader can pass in a chain of extensions through pNext.
- * We can't blindly pass these through as often these contain callbacks or
- * they can even be pass structures for loader / ICD internal use. For now
- * we ignore everything in pNext chain, but we print FIXMEs.
- */
- if (src->pNext)
+ if ((res = convert_VkInstanceCreateInfo_struct_chain(src->pNext, dst)) < 0)
{
- const VkBaseInStructure *header;
-
- for (header = src->pNext; header; header = header->pNext)
- {
- switch (header->sType)
- {
- case VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO:
- /* Can be used to register new dispatchable object types
- * to the loader. We should ignore it as it will confuse the
- * host its loader.
- */
- break;
-
- default:
- FIXME("Application requested a linked structure of type %u.\n", header->sType);
- }
- }
+ WARN("Failed to convert VkInstanceCreateInfo pNext chain, res=%d.\n", res);
+ return res;
}
- /* For now don't support anything. */
- dst->pNext = NULL;
/* ICDs don't support any layers, so nothing to copy. Modern versions of the loader
* filter this data out as well.
@@ -452,6 +431,7 @@ static VkResult wine_vk_instance_convert_create_info(const VkInstanceCreateInfo
if (!wine_vk_instance_extension_supported(extension_name))
{
WARN("Extension %s is not supported.\n", debugstr_a(extension_name));
+ free_VkInstanceCreateInfo_struct_chain(dst);
return VK_ERROR_EXTENSION_NOT_PRESENT;
}
}
@@ -771,6 +751,7 @@ VkResult WINAPI wine_vkCreateInstance(const VkInstanceCreateInfo *create_info,
}
res = vk_funcs->p_vkCreateInstance(&create_info_host, NULL /* allocator */, &object->instance);
+ free_VkInstanceCreateInfo_struct_chain(&create_info_host);
if (res != VK_SUCCESS)
{
ERR("Failed to create instance, res=%d\n", res);
diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c
index e1df2aa72eae..2f0cc6218e22 100644
--- a/dlls/winevulkan/vulkan_thunks.c
+++ b/dlls/winevulkan/vulkan_thunks.c
@@ -1343,6 +1343,43 @@ static inline void free_VkCopyDescriptorSet_array(VkCopyDescriptorSet_host *in,
#endif /* USE_STRUCT_CONVERSION */
+VkResult convert_VkInstanceCreateInfo_struct_chain(const void *pNext, VkInstanceCreateInfo *out_struct)
+{
+ VkBaseOutStructure *out_header = (VkBaseOutStructure *)out_struct;
+ const VkBaseInStructure *in_header;
+
+ out_header->pNext = NULL;
+
+ for (in_header = pNext; in_header; in_header = in_header->pNext)
+ {
+ switch (in_header->sType)
+ {
+ case VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO:
+ case VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO:
+ break;
+
+ default:
+ FIXME("Application requested a linked structure of type %u.\n", in_header->sType);
+ }
+ }
+
+ return VK_SUCCESS;
+}
+
+void free_VkInstanceCreateInfo_struct_chain(VkInstanceCreateInfo *s)
+{
+ VkBaseOutStructure *header = (void *)s->pNext;
+
+ while (header)
+ {
+ void *prev = header;
+ header = header->pNext;
+ heap_free(prev);
+ }
+
+ s->pNext = NULL;
+}
+
VkResult WINAPI wine_vkAcquireNextImage2KHR(VkDevice device, const VkAcquireNextImageInfoKHR *pAcquireInfo, uint32_t *pImageIndex)
{
#if defined(USE_STRUCT_CONVERSION)
diff --git a/dlls/winevulkan/vulkan_thunks.h b/dlls/winevulkan/vulkan_thunks.h
index 6d0ed45e3c3d..3b8a93176abd 100644
--- a/dlls/winevulkan/vulkan_thunks.h
+++ b/dlls/winevulkan/vulkan_thunks.h
@@ -765,6 +765,9 @@ typedef struct VkCopyDescriptorSet_host
} VkCopyDescriptorSet_host;
+VkResult convert_VkInstanceCreateInfo_struct_chain(const void *pNext, VkInstanceCreateInfo *out_struct) DECLSPEC_HIDDEN;
+void free_VkInstanceCreateInfo_struct_chain(VkInstanceCreateInfo *s) DECLSPEC_HIDDEN;
+
/* For use by vkDevice and children */
struct vulkan_device_funcs
{
--
2.21.0
1
0
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
v2: Fix the commit message.
This are the last occurrences found by my coccinelle script.
dlls/gdi32/tests/bitmap.c | 156 +++++++++++++++++++-------------------
dlls/gdi32/tests/pen.c | 2 +-
2 files changed, 79 insertions(+), 79 deletions(-)
diff --git a/dlls/gdi32/tests/bitmap.c b/dlls/gdi32/tests/bitmap.c
index 4622de9c93..d651765006 100644
--- a/dlls/gdi32/tests/bitmap.c
+++ b/dlls/gdi32/tests/bitmap.c
@@ -3161,57 +3161,57 @@ static void test_StretchBlt(void)
DeleteObject(hBrush);
/* Top-down to top-down tests */
- srcBuffer[0] = 0xCAFED00D, srcBuffer[1] = 0xFEEDFACE;
- srcBuffer[16] = 0xFEDCBA98, srcBuffer[17] = 0x76543210;
+ srcBuffer[0] = 0xCAFED00D; srcBuffer[1] = 0xFEEDFACE;
+ srcBuffer[16] = 0xFEDCBA98; srcBuffer[17] = 0x76543210;
memset( expected, 0, get_dib_image_size( &biDst ) );
- expected[0] = 0xCAFED00D, expected[1] = 0xFEEDFACE;
- expected[16] = 0xFEDCBA98, expected[17] = 0x76543210;
+ expected[0] = 0xCAFED00D; expected[1] = 0xFEEDFACE;
+ expected[16] = 0xFEDCBA98; expected[17] = 0x76543210;
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
0, 0, 2, 2, 0, 0, 2, 2, expected, __LINE__);
- expected[0] = 0xCAFED00D, expected[1] = 0x00000000;
- expected[16] = 0x00000000, expected[17] = 0x00000000;
+ expected[0] = 0xCAFED00D; expected[1] = 0x00000000;
+ expected[16] = 0x00000000; expected[17] = 0x00000000;
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
0, 0, 1, 1, 0, 0, 1, 1, expected, __LINE__);
- expected[0] = 0xCAFED00D, expected[1] = 0xCAFED00D;
- expected[16] = 0xCAFED00D, expected[17] = 0xCAFED00D;
+ expected[0] = 0xCAFED00D; expected[1] = 0xCAFED00D;
+ expected[16] = 0xCAFED00D; expected[17] = 0xCAFED00D;
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
0, 0, 2, 2, 0, 0, 1, 1, expected, __LINE__);
/* This is an example of the dst width (height) == 1 exception, explored below */
- expected[0] = 0xCAFED00D, expected[1] = 0x00000000;
- expected[16] = 0x00000000, expected[17] = 0x00000000;
+ expected[0] = 0xCAFED00D; expected[1] = 0x00000000;
+ expected[16] = 0x00000000; expected[17] = 0x00000000;
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
0, 0, 1, 1, 0, 0, 2, 2, expected, __LINE__);
- expected[0] = 0x76543210, expected[1] = 0xFEDCBA98;
- expected[16] = 0xFEEDFACE, expected[17] = 0xCAFED00D;
+ expected[0] = 0x76543210; expected[1] = 0xFEDCBA98;
+ expected[16] = 0xFEEDFACE; expected[17] = 0xCAFED00D;
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
0, 0, 2, 2, 1, 1, -2, -2, expected, __LINE__);
- expected[0] = 0x76543210, expected[1] = 0xFEDCBA98;
- expected[16] = 0xFEEDFACE, expected[17] = 0xCAFED00D;
+ expected[0] = 0x76543210; expected[1] = 0xFEDCBA98;
+ expected[16] = 0xFEEDFACE; expected[17] = 0xCAFED00D;
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
1, 1, -2, -2, 0, 0, 2, 2, expected, __LINE__);
- expected[0] = 0xCAFED00D, expected[1] = 0x00000000;
- expected[16] = 0x00000000, expected[17] = 0x00000000;
+ expected[0] = 0xCAFED00D; expected[1] = 0x00000000;
+ expected[16] = 0x00000000; expected[17] = 0x00000000;
todo_wine check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
1, 1, -2, -2, 1, 1, -2, -2, expected, __LINE__);
- expected[0] = 0x00000000, expected[1] = 0x00000000;
- expected[16] = 0x00000000, expected[17] = 0xCAFED00D, expected[18] = 0xFEEDFACE;
- expected[32] = 0x00000000, expected[33] = 0xFEDCBA98, expected[34] = 0x76543210;
+ expected[0] = 0x00000000; expected[1] = 0x00000000;
+ expected[16] = 0x00000000; expected[17] = 0xCAFED00D; expected[18] = 0xFEEDFACE;
+ expected[32] = 0x00000000; expected[33] = 0xFEDCBA98; expected[34] = 0x76543210;
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
1, 1, 2, 2, 0, 0, 2, 2, expected, __LINE__);
/* when dst width is 1 merge src width - 1 pixels */
memset( srcBuffer, 0, get_dib_image_size( &biSrc ) );
- srcBuffer[0] = 0x0000ff00, srcBuffer[1] = 0x0000f0f0, srcBuffer[2] = 0x0000cccc, srcBuffer[3] = 0x0000aaaa;
- srcBuffer[16] = 0xFEDCBA98, srcBuffer[17] = 0x76543210;
+ srcBuffer[0] = 0x0000ff00; srcBuffer[1] = 0x0000f0f0; srcBuffer[2] = 0x0000cccc; srcBuffer[3] = 0x0000aaaa;
+ srcBuffer[16] = 0xFEDCBA98; srcBuffer[17] = 0x76543210;
memset( expected, 0, get_dib_image_size( &biDst ) );
expected[0] = srcBuffer[0];
@@ -3232,7 +3232,7 @@ static void test_StretchBlt(void)
0, 0, 1, 1, 2, 0, -2, 1, expected, __LINE__);
/* when dst width > 1 behaviour reverts to what one would expect */
- expected[0] = srcBuffer[0] & srcBuffer[1], expected[1] = srcBuffer[2] & srcBuffer[3];
+ expected[0] = srcBuffer[0] & srcBuffer[1]; expected[1] = srcBuffer[2] & srcBuffer[3];
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
0, 0, 2, 1, 0, 0, 4, 1, expected, __LINE__);
@@ -3254,21 +3254,21 @@ static void test_StretchBlt(void)
/* the destination rectangle doesn't fit in the device area */
memset( expected, 0, get_dib_image_size( &biDst ) );
- expected[17] = 0x76543210, expected[18] = 0xfedcba98;
- expected[32] = 0x0000cccc, expected[33] = 0x0000f0f0, expected[34] = 0x0000ff00;
+ expected[17] = 0x76543210; expected[18] = 0xfedcba98;
+ expected[32] = 0x0000cccc; expected[33] = 0x0000f0f0; expected[34] = 0x0000ff00;
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
2, 2, -8, -8, 0, 0, 8, 8, expected, __LINE__);
/* the source rectangle doesn't fit in the device area */
memset( expected, 0, get_dib_image_size( &biDst ) );
- expected[102] = 0x76543210, expected[103] = 0xfedcba98;
- expected[117] = 0x0000cccc, expected[118] = 0x0000f0f0, expected[119] = 0x0000ff00;
+ expected[102] = 0x76543210; expected[103] = 0xfedcba98;
+ expected[117] = 0x0000cccc; expected[118] = 0x0000f0f0; expected[119] = 0x0000ff00;
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
0, 0, 8, 8, 2, 2, -8, -8, expected, __LINE__);
memset( expected, 0, get_dib_image_size( &biDst ) );
- expected[85] = 0x76543210, expected[86] = 0xfedcba98;
- expected[99] = 0x0000aaaa, expected[100] = 0x0000cccc, expected[101] = 0x0000f0f0, expected[102] = 0x0000ff00;
+ expected[85] = 0x76543210; expected[86] = 0xfedcba98;
+ expected[99] = 0x0000aaaa; expected[100] = 0x0000cccc; expected[101] = 0x0000f0f0; expected[102] = 0x0000ff00;
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
8, 8, -18, -18, 0, 0, 18, 18, expected, __LINE__);
@@ -3277,8 +3277,8 @@ static void test_StretchBlt(void)
/* Top-down to bottom-up tests */
memset( srcBuffer, 0, get_dib_image_size( &biSrc ) );
- srcBuffer[0] = 0xCAFED00D, srcBuffer[1] = 0xFEEDFACE;
- srcBuffer[16] = 0xFEDCBA98, srcBuffer[17] = 0x76543210;
+ srcBuffer[0] = 0xCAFED00D; srcBuffer[1] = 0xFEEDFACE;
+ srcBuffer[16] = 0xFEDCBA98; srcBuffer[17] = 0x76543210;
biDst.bmiHeader.biHeight = 16;
bmpDst = CreateDIBSection(hdcScreen, &biDst, DIB_RGB_COLORS, (void**)&dstBuffer,
@@ -3287,13 +3287,13 @@ static void test_StretchBlt(void)
memset( expected, 0, get_dib_image_size( &biDst ) );
- expected[224] = 0xFEDCBA98, expected[225] = 0x76543210;
- expected[240] = 0xCAFED00D, expected[241] = 0xFEEDFACE;
+ expected[224] = 0xFEDCBA98; expected[225] = 0x76543210;
+ expected[240] = 0xCAFED00D; expected[241] = 0xFEEDFACE;
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
0, 0, 2, 2, 0, 0, 2, 2, expected, __LINE__);
- expected[224] = 0xFEEDFACE, expected[225] = 0xCAFED00D;
- expected[240] = 0x76543210, expected[241] = 0xFEDCBA98;
+ expected[224] = 0xFEEDFACE; expected[225] = 0xCAFED00D;
+ expected[240] = 0x76543210; expected[241] = 0xFEDCBA98;
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
0, 0, 2, 2, 1, 1, -2, -2, expected, __LINE__);
@@ -3304,19 +3304,19 @@ static void test_StretchBlt(void)
biSrc.bmiHeader.biHeight = 16;
bmpSrc = CreateDIBSection(hdcScreen, &biSrc, DIB_RGB_COLORS, (void**)&srcBuffer,
NULL, 0);
- srcBuffer[224] = 0xCAFED00D, srcBuffer[225] = 0xFEEDFACE;
- srcBuffer[240] = 0xFEDCBA98, srcBuffer[241] = 0x76543210;
+ srcBuffer[224] = 0xCAFED00D; srcBuffer[225] = 0xFEEDFACE;
+ srcBuffer[240] = 0xFEDCBA98; srcBuffer[241] = 0x76543210;
oldSrc = SelectObject(hdcSrc, bmpSrc);
memset( expected, 0, get_dib_image_size( &biDst ) );
- expected[224] = 0xCAFED00D, expected[225] = 0xFEEDFACE;
- expected[240] = 0xFEDCBA98, expected[241] = 0x76543210;
+ expected[224] = 0xCAFED00D; expected[225] = 0xFEEDFACE;
+ expected[240] = 0xFEDCBA98; expected[241] = 0x76543210;
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
0, 0, 2, 2, 0, 0, 2, 2, expected, __LINE__);
- expected[224] = 0x76543210, expected[225] = 0xFEDCBA98;
- expected[240] = 0xFEEDFACE, expected[241] = 0xCAFED00D;
+ expected[224] = 0x76543210; expected[225] = 0xFEDCBA98;
+ expected[240] = 0xFEEDFACE; expected[241] = 0xCAFED00D;
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
0, 0, 2, 2, 1, 1, -2, -2, expected, __LINE__);
@@ -3330,13 +3330,13 @@ static void test_StretchBlt(void)
oldDst = SelectObject(hdcDst, bmpDst);
memset( expected, 0, get_dib_image_size( &biDst ) );
- expected[0] = 0xFEDCBA98, expected[1] = 0x76543210;
- expected[16] = 0xCAFED00D, expected[17] = 0xFEEDFACE;
+ expected[0] = 0xFEDCBA98; expected[1] = 0x76543210;
+ expected[16] = 0xCAFED00D; expected[17] = 0xFEEDFACE;
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
0, 0, 2, 2, 0, 0, 2, 2, expected, __LINE__);
- expected[0] = 0xFEEDFACE, expected[1] = 0xCAFED00D;
- expected[16] = 0x76543210, expected[17] = 0xFEDCBA98;
+ expected[0] = 0xFEEDFACE; expected[1] = 0xCAFED00D;
+ expected[16] = 0x76543210; expected[17] = 0xFEDCBA98;
check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
0, 0, 2, 2, 1, 1, -2, -2, expected, __LINE__);
@@ -3349,26 +3349,26 @@ static void test_StretchBlt(void)
oldSrc = SelectObject(hdcSrc, bmpSrc);
memset( expected, 0, get_dib_image_size( &biDst ) );
- expected[0] = 0xFEEDFACE, expected[1] = 0xCAFED00D;
- expected[2] = 0x76543210, expected[3] = 0xFEDCBA98;
+ expected[0] = 0xFEEDFACE; expected[1] = 0xCAFED00D;
+ expected[2] = 0x76543210; expected[3] = 0xFEDCBA98;
memcpy(dstBuffer, expected, 4 * sizeof(*dstBuffer));
StretchBlt(hdcSrc, 0, 0, 4, 1, hdcDst, 0, 0, 4, 1, SRCCOPY );
memset(dstBuffer, 0x55, 4 * sizeof(*dstBuffer));
StretchBlt(hdcDst, 0, 0, 4, 1, hdcSrc, 0, 0, 4, 1, SRCCOPY );
- expected[0] = 0x00EDFACE, expected[1] = 0x00FED00D;
- expected[2] = 0x00543210, expected[3] = 0x00DCBA98;
+ expected[0] = 0x00EDFACE; expected[1] = 0x00FED00D;
+ expected[2] = 0x00543210; expected[3] = 0x00DCBA98;
ok(!memcmp(dstBuffer, expected, 16),
"StretchBlt expected { %08X, %08X, %08X, %08X } got { %08X, %08X, %08X, %08X }\n",
expected[0], expected[1], expected[2], expected[3],
dstBuffer[0], dstBuffer[1], dstBuffer[2], dstBuffer[3] );
- expected[0] = 0xFEEDFACE, expected[1] = 0xCAFED00D;
- expected[2] = 0x76543210, expected[3] = 0xFEDCBA98;
+ expected[0] = 0xFEEDFACE; expected[1] = 0xCAFED00D;
+ expected[2] = 0x76543210; expected[3] = 0xFEDCBA98;
memcpy(srcBuffer, expected, 4 * sizeof(*dstBuffer));
memset(dstBuffer, 0x55, 4 * sizeof(*dstBuffer));
StretchBlt(hdcDst, 0, 0, 4, 1, hdcSrc, 0, 0, 4, 1, SRCCOPY );
- expected[0] = 0x00EDFACE, expected[1] = 0x00D00DFE;
- expected[2] = 0x0010CAFE, expected[3] = 0x00765432;
+ expected[0] = 0x00EDFACE; expected[1] = 0x00D00DFE;
+ expected[2] = 0x0010CAFE; expected[3] = 0x00765432;
ok(!memcmp(dstBuffer, expected, 16),
"StretchBlt expected { %08X, %08X, %08X, %08X } got { %08X, %08X, %08X, %08X }\n",
expected[0], expected[1], expected[2], expected[3],
@@ -3530,71 +3530,71 @@ static void test_StretchDIBits(void)
DeleteObject(hBrush);
/* Top-down destination tests */
- srcBuffer[0] = 0xCAFED00D, srcBuffer[1] = 0xFEEDFACE;
- srcBuffer[2] = 0xFEDCBA98, srcBuffer[3] = 0x76543210;
+ srcBuffer[0] = 0xCAFED00D; srcBuffer[1] = 0xFEEDFACE;
+ srcBuffer[2] = 0xFEDCBA98; srcBuffer[3] = 0x76543210;
- expected[0] = 0xCAFED00D, expected[1] = 0xFEEDFACE;
- expected[2] = 0xFEDCBA98, expected[3] = 0x76543210;
+ expected[0] = 0xCAFED00D; expected[1] = 0xFEEDFACE;
+ expected[2] = 0xFEDCBA98; expected[3] = 0x76543210;
ret = check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
0, 0, 2, 2, 0, 0, 2, 2, expected, __LINE__);
ok( ret == 2, "got ret %d\n", ret );
- expected[0] = 0xCAFED00D, expected[1] = 0x00000000;
- expected[2] = 0x00000000, expected[3] = 0x00000000;
+ expected[0] = 0xCAFED00D; expected[1] = 0x00000000;
+ expected[2] = 0x00000000; expected[3] = 0x00000000;
ret = check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
0, 0, 1, 1, 0, 0, 1, 1, expected, __LINE__);
todo_wine ok( ret == 1, "got ret %d\n", ret );
- expected[0] = 0xFEDCBA98, expected[1] = 0xFEDCBA98;
- expected[2] = 0xFEDCBA98, expected[3] = 0xFEDCBA98;
+ expected[0] = 0xFEDCBA98; expected[1] = 0xFEDCBA98;
+ expected[2] = 0xFEDCBA98; expected[3] = 0xFEDCBA98;
ret = check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
0, 0, 2, 2, 0, 0, 1, 1, expected, __LINE__);
ok( ret == 2, "got ret %d\n", ret );
- expected[0] = 0x42441000, expected[1] = 0x00000000;
- expected[2] = 0x00000000, expected[3] = 0x00000000;
+ expected[0] = 0x42441000; expected[1] = 0x00000000;
+ expected[2] = 0x00000000; expected[3] = 0x00000000;
ret = check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
0, 0, 1, 1, 0, 0, 2, 2, expected, __LINE__);
ok( ret == 2, "got ret %d\n", ret );
- expected[0] = 0x00000000, expected[1] = 0x00000000;
- expected[2] = 0x00000000, expected[3] = 0x00000000;
+ expected[0] = 0x00000000; expected[1] = 0x00000000;
+ expected[2] = 0x00000000; expected[3] = 0x00000000;
ret = check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
0, 0, 2, 2, 1, 1, -2, -2, expected, __LINE__);
ok( ret == 0, "got ret %d\n", ret );
- expected[0] = 0x00000000, expected[1] = 0x00000000;
- expected[2] = 0x00000000, expected[3] = 0x00000000;
+ expected[0] = 0x00000000; expected[1] = 0x00000000;
+ expected[2] = 0x00000000; expected[3] = 0x00000000;
ret = check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
0, 0, 2, 2, 1, 1, -2, -2, expected, __LINE__);
ok( ret == 0, "got ret %d\n", ret );
- expected[0] = 0x00000000, expected[1] = 0x00000000;
- expected[2] = 0x00000000, expected[3] = 0x00000000;
+ expected[0] = 0x00000000; expected[1] = 0x00000000;
+ expected[2] = 0x00000000; expected[3] = 0x00000000;
ret = check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
1, 1, -2, -2, 1, 1, -2, -2, expected, __LINE__);
ok( ret == 0, "got ret %d\n", ret );
- expected[0] = 0x00000000, expected[1] = 0x00000000;
- expected[2] = 0x00000000, expected[3] = 0xCAFED00D;
+ expected[0] = 0x00000000; expected[1] = 0x00000000;
+ expected[2] = 0x00000000; expected[3] = 0xCAFED00D;
ret = check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
1, 1, 2, 2, 0, 0, 2, 2, expected, __LINE__);
ok( ret == 2, "got ret %d\n", ret );
- expected[0] = 0x00000000, expected[1] = 0x00000000;
- expected[2] = 0x00000000, expected[3] = 0x00000000;
+ expected[0] = 0x00000000; expected[1] = 0x00000000;
+ expected[2] = 0x00000000; expected[3] = 0x00000000;
ret = check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
2, 2, 4, 4, 0, 0, 2, 2, expected, __LINE__);
ok( ret == 2, "got ret %d\n", ret );
- expected[0] = 0x00000000, expected[1] = 0x00000000;
- expected[2] = 0x00000000, expected[3] = 0x00000000;
+ expected[0] = 0x00000000; expected[1] = 0x00000000;
+ expected[2] = 0x00000000; expected[3] = 0x00000000;
ret = check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
-4, -4, 4, 4, 0, 0, 4, 4, expected, __LINE__);
ok( ret == 2, "got ret %d\n", ret );
- expected[0] = 0x00000000, expected[1] = 0x00000000;
- expected[2] = 0xFEEDFACE, expected[3] = 0x00000000;
+ expected[0] = 0x00000000; expected[1] = 0x00000000;
+ expected[2] = 0xFEEDFACE; expected[3] = 0x00000000;
ret = check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
1, 1, -2, -2, 1, 1, 2, 2, expected, __LINE__);
ok( ret == 2, "got ret %d\n", ret );
@@ -3608,8 +3608,8 @@ static void test_StretchDIBits(void)
NULL, 0);
oldDst = SelectObject(hdcDst, bmpDst);
- expected[0] = 0xFEDCBA98, expected[1] = 0x76543210;
- expected[2] = 0xCAFED00D, expected[3] = 0xFEEDFACE;
+ expected[0] = 0xFEDCBA98; expected[1] = 0x76543210;
+ expected[2] = 0xCAFED00D; expected[3] = 0xFEEDFACE;
check_StretchDIBits_stretch(hdcDst, dstBuffer, srcBuffer,
0, 0, 2, 2, 0, 0, 2, 2, expected, __LINE__);
diff --git a/dlls/gdi32/tests/pen.c b/dlls/gdi32/tests/pen.c
index badc585f57..530272ea79 100644
--- a/dlls/gdi32/tests/pen.c
+++ b/dlls/gdi32/tests/pen.c
@@ -78,7 +78,7 @@ static void test_logpen(void)
/********************** cosmetic pens **********************/
/* CreatePenIndirect behaviour */
- lp.lopnStyle = pen[i].style,
+ lp.lopnStyle = pen[i].style;
lp.lopnWidth.x = pen[i].width;
lp.lopnWidth.y = 11; /* just in case */
lp.lopnColor = pen[i].color;
--
2.20.1
2
1
[PATCH] winebuild: Don't output private entries when generating a .def file.
by Dmitry Timoshkov 10 Apr '19
by Dmitry Timoshkov 10 Apr '19
10 Apr '19
This patch in particular fixes 32-bit build where a slightly old ming32-dlltool
chokes on krn386.exe16.ApiName entries. These are marked as PRIVATE anyway, so
they won't appear in the generated import library.
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
tools/winebuild/spec32.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/tools/winebuild/spec32.c b/tools/winebuild/spec32.c
index 04af2918c9..47be8af303 100644
--- a/tools/winebuild/spec32.c
+++ b/tools/winebuild/spec32.c
@@ -961,13 +961,15 @@ void output_def_file( DLLSPEC *spec, int include_stubs )
for (i = total = 0; i < spec->nb_entry_points; i++)
{
const ORDDEF *odp = &spec->entry_points[i];
- int is_data = 0, is_private = odp->flags & FLAG_PRIVATE;
+ int is_data = 0, is_stub = 0;
+
+ if (odp->flags & FLAG_PRIVATE) continue;
if (odp->name) name = odp->name;
else if (odp->export_name) name = odp->export_name;
else continue;
- if (!is_private) total++;
+ total++;
if (!include_stubs && odp->type == TYPE_STUB) continue;
output( " %s", name );
@@ -995,7 +997,7 @@ void output_def_file( DLLSPEC *spec, int include_stubs )
}
case TYPE_STUB:
if (!kill_at && target_cpu == CPU_x86) output( "@%d", get_args_size( odp ));
- is_private = 1;
+ is_stub = 1;
break;
default:
assert(0);
@@ -1003,7 +1005,7 @@ void output_def_file( DLLSPEC *spec, int include_stubs )
output( " @%d", odp->ordinal );
if (!odp->name || (odp->flags & FLAG_ORDINAL)) output( " NONAME" );
if (is_data) output( " DATA" );
- if (is_private) output( " PRIVATE" );
+ if (is_stub) output( " PRIVATE" );
output( "\n" );
}
if (!total) warning( "%s: Import library doesn't export anything\n", spec->file_name );
--
2.20.1
2
5