diff --git a/src/panfrost/vulkan/panvk_device.c b/src/panfrost/vulkan/panvk_device.c index 18fa11444e74308c78fd7495cbf321ae88d516d3..ee4c78bbc87cc338a7cf4a158a38f2040ac28916 100644 --- a/src/panfrost/vulkan/panvk_device.c +++ b/src/panfrost/vulkan/panvk_device.c @@ -418,11 +418,98 @@ panvk_physical_device_try_create(struct vk_instance *vk_instance, return VK_SUCCESS; } +void +vk_helper_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, + VkPhysicalDeviceFeatures2 *pFeatures, + struct vk_features *features) +{ + struct VkPhysicalDeviceVulkan11Features core_1_1 = features->core11; + struct VkPhysicalDeviceVulkan11Features core_1_2 = features->core12; + struct VkPhysicalDeviceVulkan11Features core_1_3 = features->core13; + + core_1_1.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, + core_1_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, + core_1_3.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, + + pFeatures->features = features.core; + + vk_foreach_struct(ext, pFeatures->pNext) + { + if (vk_get_physical_device_core_1_1_feature_ext(ext, &core_1_1)) + continue; + if (vk_get_physical_device_core_1_2_feature_ext(ext, &core_1_2)) + continue; + if (vk_get_physical_device_core_1_3_feature_ext(ext, &core_1_3)) + continue; + + switch (ext->sType) { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: { + VkPhysicalDeviceConditionalRenderingFeaturesEXT *feat = + (VkPhysicalDeviceConditionalRenderingFeaturesEXT *) ext; + feat->conditionalRendering = features->conditionalRendering; + feat->inheritedConditionalRendering = + features->inheritedConditionalRendering; + break; + } + + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: { + VkPhysicalDeviceTransformFeedbackFeaturesEXT *feat = + (VkPhysicalDeviceTransformFeedbackFeaturesEXT *) ext; + feat->transformFeedback = features->transformFeedbackk; + feat->geometryStreams = features->geometryStreams; + break; + } + + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: { + VkPhysicalDeviceIndexTypeUint8FeaturesEXT *features = + (VkPhysicalDeviceIndexTypeUint8FeaturesEXT *)ext; + feat->indexTypeUint8 = features->indexTypeUint8; + break; + } + + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: { + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *feat = + (VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *)ext; + feat->vertexAttributeInstanceRateDivisor = features->vertexAttributeInstanceRateDivisor; + feat->vertexAttributeInstanceRateZeroDivisor = + features->vertexAttributeInstanceRateZeroDivisor; + break; + } + + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT: { + VkPhysicalDeviceDepthClipEnableFeaturesEXT *feat = + (VkPhysicalDeviceDepthClipEnableFeaturesEXT *)ext; + feat->depthClipEnable = features->depthClipEnable; + break; + } + + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: { + VkPhysicalDevice4444FormatsFeaturesEXT *feat = (void *)ext; + features->formatA4R4G4B4 = features->formatA4R4G4B4; + features->formatA4B4G4R4 = features->formatA4B4G4R4; + break; + } + + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: { + VkPhysicalDeviceCustomBorderColorFeaturesEXT *feat = (void *) ext; + feat->customBorderColors = features->customBorderColors; + feat->customBorderColorWithoutFormat = + features->customBorderColorsWithoutFormat; + break; + } + + default: + break; + } + } + + + void panvk_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2 *pFeatures) { - pFeatures->features = (VkPhysicalDeviceFeatures) { + const VkPhysicalDeviceFeatures core = (VkPhysicalDeviceFeatures) { .robustBufferAccess = true, .fullDrawIndexUint32 = true, .independentBlend = true, @@ -438,7 +525,6 @@ panvk_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, }; const VkPhysicalDeviceVulkan11Features core_1_1 = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, .storageBuffer16BitAccess = false, .uniformAndStorageBuffer16BitAccess = false, .storagePushConstant16 = false, @@ -454,7 +540,6 @@ panvk_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, }; const VkPhysicalDeviceVulkan12Features core_1_2 = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, .samplerMirrorClampToEdge = false, .drawIndirectCount = false, .storageBuffer8BitAccess = false, @@ -507,7 +592,6 @@ panvk_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, }; const VkPhysicalDeviceVulkan13Features core_1_3 = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, .robustImageAccess = false, .inlineUniformBlock = false, .descriptorBindingInlineUniformBlockUpdateAfterBind = false, @@ -525,64 +609,22 @@ panvk_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, .maintenance4 = false, }; - vk_foreach_struct(ext, pFeatures->pNext) - { - if (vk_get_physical_device_core_1_1_feature_ext(ext, &core_1_1)) - continue; - if (vk_get_physical_device_core_1_2_feature_ext(ext, &core_1_2)) - continue; - if (vk_get_physical_device_core_1_3_feature_ext(ext, &core_1_3)) - continue; - switch (ext->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: { - VkPhysicalDeviceConditionalRenderingFeaturesEXT *features = - (VkPhysicalDeviceConditionalRenderingFeaturesEXT *) ext; - features->conditionalRendering = false; - features->inheritedConditionalRendering = false; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: { - VkPhysicalDeviceTransformFeedbackFeaturesEXT *features = - (VkPhysicalDeviceTransformFeedbackFeaturesEXT *) ext; - features->transformFeedback = false; - features->geometryStreams = false; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: { - VkPhysicalDeviceIndexTypeUint8FeaturesEXT *features = - (VkPhysicalDeviceIndexTypeUint8FeaturesEXT *)ext; - features->indexTypeUint8 = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: { - VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *features = - (VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *)ext; - features->vertexAttributeInstanceRateDivisor = true; - features->vertexAttributeInstanceRateZeroDivisor = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT: { - VkPhysicalDeviceDepthClipEnableFeaturesEXT *features = - (VkPhysicalDeviceDepthClipEnableFeaturesEXT *)ext; - features->depthClipEnable = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: { - VkPhysicalDevice4444FormatsFeaturesEXT *features = (void *)ext; - features->formatA4R4G4B4 = true; - features->formatA4B4G4R4 = true; - break; - } - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: { - VkPhysicalDeviceCustomBorderColorFeaturesEXT *features = (void *) ext; - features->customBorderColors = true; - features->customBorderColorWithoutFormat = true; - break; - } - default: - break; - } - } + struct vk_features features = { + .core = core, + .core11 = core_1_1, + .core12 = core_1_2, + .core13 = core_1_3, + .indexTypeUint8 = true, + .vertexAttributeInstanceRateDivisor = true, + .vertexAttributeInstanceRateZeroDivisor = true, + .depthClipEnable = true, + .formatA4R4G4B4 = true, + .formatA4B4G4R4 = true, + .customBorderColors = true, + .customBorderColorWithoutFormat = true, + }; + + vk_helper_GetPhysicalDeviceFeatures2(physicalDevice, pFeatures, &features); } void diff --git a/src/vulkan/runtime/vk_device.h b/src/vulkan/runtime/vk_device.h index afbb4af891705959a0e115e36fdb2c8f53cbabc3..6e52388bd193da2188a45c4c4b58ffa5f5567885 100644 --- a/src/vulkan/runtime/vk_device.h +++ b/src/vulkan/runtime/vk_device.h @@ -421,6 +421,26 @@ bool vk_get_physical_device_core_1_2_property_ext(struct VkBaseOutStructure *ext bool vk_get_physical_device_core_1_3_property_ext(struct VkBaseOutStructure *ext, const VkPhysicalDeviceVulkan13Properties *core); +struct vk_features { + struct VkPhysicalDeviceFeatures core; + struct VkPhysicalDeviceVulkan11Features core11; + struct VkPhysicalDeviceVulkan12Features core12; + struct VkPhysicalDeviceVulkan13Features core13; + + VkBool32 conditionalRendering; + VkBool32 inheritedConditionalRendering; + VkBool32 transformFeedback; + VkBool32 geometryStreams; + VkBool32 indexTypeUint8; + VkBool32 vertexAttributeInstanceRateDivisor; + VkBool32 vertexAttributeInstanceRateZeroDivisor; + VkBool32 depthClipEnable; + VkBool32 formatA4R4G4B4; + VkBool32 formatA4B4G4R4; + VkBool32 customBorderColors; + VkBool32 customBorderColorWithoutFormat; +}; + #ifdef __cplusplus } #endif