{
V3DV_FROM_HANDLE(v3dv_physical_device, physical_device, physicalDevice);
- memset(&pFeatures->features, 0, sizeof(pFeatures->features));
-
- pFeatures->features = (VkPhysicalDeviceFeatures) {
+ struct vk_features features = {
+ /* Vulkan 1.0 */
.robustBufferAccess = true, /* This feature is mandatory */
.fullDrawIndexUint32 = false, /* Only available since V3D 4.4.9.1 */
.imageCubeArray = true,
.sparseResidencyAliased = false,
.variableMultisampleRate = false,
.inheritedQueries = true,
- };
- VkPhysicalDeviceVulkan11Features vk11 = {
+ /* Vulkan 1.1 */
.storageBuffer16BitAccess = true,
.uniformAndStorageBuffer16BitAccess = true,
.storagePushConstant16 = true,
.samplerYcbcrConversion = true,
#endif
.shaderDrawParameters = false,
- };
- VkPhysicalDeviceVulkan12Features vk12 = {
+ /* Vulkan 1.2 */
.hostQueryReset = true,
.uniformAndStorageBuffer8BitAccess = true,
.uniformBufferStandardLayout = true,
.bufferDeviceAddress = true,
.bufferDeviceAddressCaptureReplay = false,
.bufferDeviceAddressMultiDevice = false,
- };
- VkPhysicalDeviceVulkan13Features vk13 = {
+ /* Vulkan 1.3 */
.inlineUniformBlock = true,
/* Inline buffers work like push constants, so after their are bound
* some of their contents may be copied into the uniform stream as soon
.synchronization2 = true,
.robustImageAccess = true,
.shaderIntegerDotProduct = true,
- };
- vk_foreach_struct(ext, pFeatures->pNext) {
- if (vk_get_physical_device_core_1_1_feature_ext(ext, &vk11))
- continue;
- if (vk_get_physical_device_core_1_2_feature_ext(ext, &vk12))
- continue;
- if (vk_get_physical_device_core_1_3_feature_ext(ext, &vk13))
- continue;
+ /* VK_EXT_4444_formats */
+ .formatA4R4G4B4 = true,
+ .formatA4B4G4R4 = true,
- switch (ext->sType) {
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: {
- VkPhysicalDevice4444FormatsFeaturesEXT *features =
- (VkPhysicalDevice4444FormatsFeaturesEXT *)ext;
- features->formatA4R4G4B4 = true;
- features->formatA4B4G4R4 = true;
- break;
- }
+ /* VK_EXT_custom_border_color */
+ .customBorderColors = true,
+ .customBorderColorWithoutFormat = false,
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: {
- VkPhysicalDeviceCustomBorderColorFeaturesEXT *features =
- (VkPhysicalDeviceCustomBorderColorFeaturesEXT *)ext;
- features->customBorderColors = true;
- features->customBorderColorWithoutFormat = false;
- break;
- }
+ /* VK_EXT_index_type_uint8 */
+ .indexTypeUint8 = true,
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: {
- VkPhysicalDeviceIndexTypeUint8FeaturesEXT *features =
- (VkPhysicalDeviceIndexTypeUint8FeaturesEXT *)ext;
- features->indexTypeUint8 = true;
- break;
- }
+ /* VK_EXT_line_rasterization */
+ .rectangularLines = true,
+ .bresenhamLines = true,
+ .smoothLines = false,
+ .stippledRectangularLines = false,
+ .stippledBresenhamLines = false,
+ .stippledSmoothLines = false,
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: {
- VkPhysicalDeviceLineRasterizationFeaturesEXT *features =
- (VkPhysicalDeviceLineRasterizationFeaturesEXT *)ext;
- features->rectangularLines = true;
- features->bresenhamLines = true;
- features->smoothLines = false;
- features->stippledRectangularLines = false;
- features->stippledBresenhamLines = false;
- features->stippledSmoothLines = false;
- break;
- }
+ /* VK_EXT_color_write_enable */
+ .colorWriteEnable = true,
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT: {
- VkPhysicalDeviceColorWriteEnableFeaturesEXT *features = (void *) ext;
- features->colorWriteEnable = true;
- break;
- }
+ /* VK_KHR_pipeline_executable_properties */
+ .pipelineExecutableInfo = true,
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR: {
- VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR *features =
- (VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR *) ext;
- features->pipelineExecutableInfo = true;
- break;
- }
+ /* VK_EXT_provoking_vertex */
+ .provokingVertexLast = true,
+ /* FIXME: update when supporting EXT_transform_feedback */
+ .transformFeedbackPreservesProvokingVertex = false,
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT: {
- VkPhysicalDeviceProvokingVertexFeaturesEXT *features = (void *) ext;
- features->provokingVertexLast = true;
- /* FIXME: update when supporting EXT_transform_feedback */
- features->transformFeedbackPreservesProvokingVertex = false;
- break;
- }
+ /* VK_EXT_vertex_attribute_divisor */
+ .vertexAttributeInstanceRateDivisor = true,
+ .vertexAttributeInstanceRateZeroDivisor = false,
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: {
- VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *features =
- (void *) ext;
- features->vertexAttributeInstanceRateDivisor = true;
- features->vertexAttributeInstanceRateZeroDivisor = false;
- break;
- }
+ /* VK_KHR_performance_query */
+ .performanceCounterQueryPools = physical_device->caps.perfmon,
+ .performanceCounterMultipleQueryPools = false,
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR: {
- VkPhysicalDevicePerformanceQueryFeaturesKHR *features =
- (void *) ext;
+ /* VK_EXT_texel_buffer_alignment */
+ .texelBufferAlignment = true,
- features->performanceCounterQueryPools =
- physical_device->caps.perfmon;
- features->performanceCounterMultipleQueryPools = false;
- break;
- }
+ /* VK_KHR_workgroup_memory_explicit_layout */
+ .workgroupMemoryExplicitLayout = true,
+ .workgroupMemoryExplicitLayoutScalarBlockLayout = false,
+ .workgroupMemoryExplicitLayout8BitAccess = true,
+ .workgroupMemoryExplicitLayout16BitAccess = true,
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
- VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *features =
- (void *) ext;
- features->texelBufferAlignment = true;
- break;
- }
+ /* VK_EXT_border_color_swizzle */
+ .borderColorSwizzle = true,
+ .borderColorSwizzleFromImage = true,
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR: {
- VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR *features =
- (VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR *)ext;
- features->workgroupMemoryExplicitLayout = true;
- features->workgroupMemoryExplicitLayoutScalarBlockLayout = false;
- features->workgroupMemoryExplicitLayout8BitAccess = true;
- features->workgroupMemoryExplicitLayout16BitAccess = true;
- break;
- }
+ /* VK_EXT_shader_module_identifier */
+ .shaderModuleIdentifier = true,
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT: {
- VkPhysicalDeviceBorderColorSwizzleFeaturesEXT *features =
- (void *) ext;
- features->borderColorSwizzle = true;
- features->borderColorSwizzleFromImage = true;
- break;
- }
+ /* VK_EXT_depth_clip_control */
+ .depthClipControl = true,
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT: {
- VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT *features =
- (VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT *)ext;
- features->shaderModuleIdentifier = true;
- break;
- }
+ /* VK_EXT_attachment_feedback_loop_layout */
+ .attachmentFeedbackLoopLayout = true,
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT: {
- VkPhysicalDeviceDepthClipControlFeaturesEXT *features =
- (VkPhysicalDeviceDepthClipControlFeaturesEXT *)ext;
- features->depthClipControl = true;
- break;
- }
+ /* VK_EXT_primitive_topology_list_restart */
+ .primitiveTopologyListRestart = true,
+ /* FIXME: we don't support tessellation shaders yet */
+ .primitiveTopologyPatchListRestart = false,
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT: {
- VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT *features =
- (void *) ext;
- features->attachmentFeedbackLoopLayout = true;
- break;
- }
-
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: {
- VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *features =
- (void *) ext;
- features->primitiveTopologyListRestart = true;
- /* FIXME: we don't support tessellation shaders yet */
- features->primitiveTopologyPatchListRestart = false;
- break;
- }
-
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES_EXT: {
- VkPhysicalDevicePipelineRobustnessFeaturesEXT *features =
- (void *) ext;
- features->pipelineRobustness = true;
- break;
- }
+ /* VK_EXT_pipeline_robustness */
+ .pipelineRobustness = true,
+ };
- default:
- v3dv_debug_ignored_stype(ext->sType);
- break;
- }
- }
+ vk_get_physical_device_features(pFeatures, &features);
}
uint32_t