Check required extension core versions
authorRicardo Garcia <rgarcia@igalia.com>
Tue, 29 Jun 2021 14:41:59 +0000 (16:41 +0200)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Thu, 8 Jul 2021 07:32:59 +0000 (07:32 +0000)
This commit adds a new test that verifies the core version requirement
of each supported extension is met.

New tests:
dEQP-VK.api.info.extension_core_versions.extension_core_versions

VK-GL-CTS issue: 2960
Components: Vulkan

Change-Id: I6c2b70c3173285dc02e3e63742ebd14ae989b30a

android/cts/master/vk-master-2021-03-01/api.txt
android/cts/master/vk-master/api.txt
external/vulkancts/framework/vulkan/vkApiExtensionDependencyInfo.inl
external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp
external/vulkancts/mustpass/master/vk-default/api.txt
external/vulkancts/scripts/gen_ext_deps.py

index 2c87781..3175f5b 100644 (file)
@@ -10,6 +10,7 @@ dEQP-VK.api.info.image_format_properties.2d.linear.g8_b8r8_2plane_444_unorm_ext
 dEQP-VK.api.info.image_format_properties.2d.linear.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
 dEQP-VK.api.info.image_format_properties.2d.linear.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
 dEQP-VK.api.info.image_format_properties.2d.linear.g16_b16r16_2plane_444_unorm_ext
+dEQP-VK.api.info.extension_core_versions.extension_core_versions
 dEQP-VK.api.info.image_format_properties2.2d.optimal.g8_b8r8_2plane_444_unorm_ext
 dEQP-VK.api.info.image_format_properties2.2d.optimal.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
 dEQP-VK.api.info.image_format_properties2.2d.optimal.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
index 0e7be2c..54e9eae 100644 (file)
@@ -1415,6 +1415,7 @@ dEQP-VK.api.info.image_format_properties.3d.linear.astc_12x10_unorm_block
 dEQP-VK.api.info.image_format_properties.3d.linear.astc_12x10_srgb_block
 dEQP-VK.api.info.image_format_properties.3d.linear.astc_12x12_unorm_block
 dEQP-VK.api.info.image_format_properties.3d.linear.astc_12x12_srgb_block
+dEQP-VK.api.info.extension_core_versions.extension_core_versions
 dEQP-VK.api.info.get_physical_device_properties2.features
 dEQP-VK.api.info.get_physical_device_properties2.properties
 dEQP-VK.api.info.get_physical_device_properties2.format_properties
index 1a83f0a..5604a56 100644 (file)
@@ -348,3 +348,250 @@ static const std::tuple<deUint32, deUint32, deUint32>     releasedApiVersions[]   =
        std::make_tuple(4198400, 1, 1),
        std::make_tuple(4194304, 1, 0),
 };
+static const std::tuple<deUint32, deUint32, const char*>       extensionRequiredCoreVersion[]   =
+{
+       std::make_tuple(1, 0, "VK_AMD_buffer_marker"),
+       std::make_tuple(1, 0, "VK_AMD_device_coherent_memory"),
+       std::make_tuple(1, 0, "VK_AMD_display_native_hdr"),
+       std::make_tuple(1, 0, "VK_AMD_draw_indirect_count"),
+       std::make_tuple(1, 0, "VK_AMD_gcn_shader"),
+       std::make_tuple(1, 0, "VK_AMD_gpu_shader_half_float"),
+       std::make_tuple(1, 0, "VK_AMD_gpu_shader_int16"),
+       std::make_tuple(1, 0, "VK_AMD_memory_overallocation_behavior"),
+       std::make_tuple(1, 0, "VK_AMD_mixed_attachment_samples"),
+       std::make_tuple(1, 0, "VK_AMD_negative_viewport_height"),
+       std::make_tuple(1, 0, "VK_AMD_pipeline_compiler_control"),
+       std::make_tuple(1, 0, "VK_AMD_rasterization_order"),
+       std::make_tuple(1, 0, "VK_AMD_shader_ballot"),
+       std::make_tuple(1, 0, "VK_AMD_shader_core_properties"),
+       std::make_tuple(1, 0, "VK_AMD_shader_core_properties2"),
+       std::make_tuple(1, 0, "VK_AMD_shader_explicit_vertex_parameter"),
+       std::make_tuple(1, 0, "VK_AMD_shader_fragment_mask"),
+       std::make_tuple(1, 0, "VK_AMD_shader_image_load_store_lod"),
+       std::make_tuple(1, 0, "VK_AMD_shader_info"),
+       std::make_tuple(1, 0, "VK_AMD_shader_trinary_minmax"),
+       std::make_tuple(1, 0, "VK_AMD_texture_gather_bias_lod"),
+       std::make_tuple(1, 0, "VK_ANDROID_external_memory_android_hardware_buffer"),
+       std::make_tuple(1, 0, "VK_EXT_4444_formats"),
+       std::make_tuple(1, 0, "VK_EXT_acquire_xlib_display"),
+       std::make_tuple(1, 0, "VK_EXT_astc_decode_mode"),
+       std::make_tuple(1, 0, "VK_EXT_blend_operation_advanced"),
+       std::make_tuple(1, 0, "VK_EXT_buffer_device_address"),
+       std::make_tuple(1, 0, "VK_EXT_calibrated_timestamps"),
+       std::make_tuple(1, 0, "VK_EXT_color_write_enable"),
+       std::make_tuple(1, 0, "VK_EXT_conditional_rendering"),
+       std::make_tuple(1, 0, "VK_EXT_conservative_rasterization"),
+       std::make_tuple(1, 0, "VK_EXT_custom_border_color"),
+       std::make_tuple(1, 0, "VK_EXT_debug_marker"),
+       std::make_tuple(1, 0, "VK_EXT_debug_report"),
+       std::make_tuple(1, 0, "VK_EXT_debug_utils"),
+       std::make_tuple(1, 0, "VK_EXT_depth_clip_enable"),
+       std::make_tuple(1, 0, "VK_EXT_depth_range_unrestricted"),
+       std::make_tuple(1, 0, "VK_EXT_descriptor_indexing"),
+       std::make_tuple(1, 0, "VK_EXT_device_memory_report"),
+       std::make_tuple(1, 0, "VK_EXT_direct_mode_display"),
+       std::make_tuple(1, 0, "VK_EXT_directfb_surface"),
+       std::make_tuple(1, 0, "VK_EXT_discard_rectangles"),
+       std::make_tuple(1, 0, "VK_EXT_display_control"),
+       std::make_tuple(1, 0, "VK_EXT_display_surface_counter"),
+       std::make_tuple(1, 0, "VK_EXT_extended_dynamic_state"),
+       std::make_tuple(1, 0, "VK_EXT_extended_dynamic_state2"),
+       std::make_tuple(1, 0, "VK_EXT_external_memory_dma_buf"),
+       std::make_tuple(1, 0, "VK_EXT_external_memory_host"),
+       std::make_tuple(1, 0, "VK_EXT_filter_cubic"),
+       std::make_tuple(1, 0, "VK_EXT_fragment_density_map"),
+       std::make_tuple(1, 0, "VK_EXT_fragment_density_map2"),
+       std::make_tuple(1, 0, "VK_EXT_fragment_shader_interlock"),
+       std::make_tuple(1, 0, "VK_EXT_full_screen_exclusive"),
+       std::make_tuple(1, 0, "VK_EXT_global_priority"),
+       std::make_tuple(1, 0, "VK_EXT_global_priority_query"),
+       std::make_tuple(1, 0, "VK_EXT_hdr_metadata"),
+       std::make_tuple(1, 0, "VK_EXT_headless_surface"),
+       std::make_tuple(1, 0, "VK_EXT_host_query_reset"),
+       std::make_tuple(1, 0, "VK_EXT_image_drm_format_modifier"),
+       std::make_tuple(1, 0, "VK_EXT_image_robustness"),
+       std::make_tuple(1, 0, "VK_EXT_index_type_uint8"),
+       std::make_tuple(1, 0, "VK_EXT_inline_uniform_block"),
+       std::make_tuple(1, 0, "VK_EXT_line_rasterization"),
+       std::make_tuple(1, 0, "VK_EXT_memory_budget"),
+       std::make_tuple(1, 0, "VK_EXT_memory_priority"),
+       std::make_tuple(1, 0, "VK_EXT_metal_surface"),
+       std::make_tuple(1, 0, "VK_EXT_pci_bus_info"),
+       std::make_tuple(1, 0, "VK_EXT_pipeline_creation_cache_control"),
+       std::make_tuple(1, 0, "VK_EXT_pipeline_creation_feedback"),
+       std::make_tuple(1, 0, "VK_EXT_post_depth_coverage"),
+       std::make_tuple(1, 0, "VK_EXT_private_data"),
+       std::make_tuple(1, 0, "VK_EXT_provoking_vertex"),
+       std::make_tuple(1, 0, "VK_EXT_queue_family_foreign"),
+       std::make_tuple(1, 0, "VK_EXT_robustness2"),
+       std::make_tuple(1, 0, "VK_EXT_sample_locations"),
+       std::make_tuple(1, 0, "VK_EXT_sampler_filter_minmax"),
+       std::make_tuple(1, 0, "VK_EXT_scalar_block_layout"),
+       std::make_tuple(1, 0, "VK_EXT_separate_stencil_usage"),
+       std::make_tuple(1, 0, "VK_EXT_shader_atomic_float"),
+       std::make_tuple(1, 0, "VK_EXT_shader_demote_to_helper_invocation"),
+       std::make_tuple(1, 0, "VK_EXT_shader_image_atomic_int64"),
+       std::make_tuple(1, 0, "VK_EXT_shader_stencil_export"),
+       std::make_tuple(1, 0, "VK_EXT_shader_subgroup_ballot"),
+       std::make_tuple(1, 0, "VK_EXT_shader_subgroup_vote"),
+       std::make_tuple(1, 0, "VK_EXT_shader_viewport_index_layer"),
+       std::make_tuple(1, 1, "VK_EXT_subgroup_size_control"),
+       std::make_tuple(1, 0, "VK_EXT_swapchain_colorspace"),
+       std::make_tuple(1, 0, "VK_EXT_texel_buffer_alignment"),
+       std::make_tuple(1, 0, "VK_EXT_texture_compression_astc_hdr"),
+       std::make_tuple(1, 0, "VK_EXT_tooling_info"),
+       std::make_tuple(1, 0, "VK_EXT_transform_feedback"),
+       std::make_tuple(1, 0, "VK_EXT_validation_cache"),
+       std::make_tuple(1, 0, "VK_EXT_validation_features"),
+       std::make_tuple(1, 0, "VK_EXT_validation_flags"),
+       std::make_tuple(1, 0, "VK_EXT_vertex_attribute_divisor"),
+       std::make_tuple(1, 0, "VK_EXT_vertex_input_dynamic_state"),
+       std::make_tuple(1, 0, "VK_EXT_video_decode_h264"),
+       std::make_tuple(1, 0, "VK_EXT_video_decode_h265"),
+       std::make_tuple(1, 0, "VK_EXT_video_encode_h264"),
+       std::make_tuple(1, 0, "VK_EXT_ycbcr_2plane_444_formats"),
+       std::make_tuple(1, 0, "VK_EXT_ycbcr_image_arrays"),
+       std::make_tuple(1, 0, "VK_FUCHSIA_external_memory"),
+       std::make_tuple(1, 0, "VK_FUCHSIA_external_semaphore"),
+       std::make_tuple(1, 0, "VK_FUCHSIA_imagepipe_surface"),
+       std::make_tuple(1, 0, "VK_GGP_frame_token"),
+       std::make_tuple(1, 0, "VK_GGP_stream_descriptor_surface"),
+       std::make_tuple(1, 0, "VK_GOOGLE_decorate_string"),
+       std::make_tuple(1, 0, "VK_GOOGLE_display_timing"),
+       std::make_tuple(1, 0, "VK_GOOGLE_hlsl_functionality1"),
+       std::make_tuple(1, 0, "VK_GOOGLE_user_type"),
+       std::make_tuple(1, 0, "VK_IMG_filter_cubic"),
+       std::make_tuple(1, 0, "VK_IMG_format_pvrtc"),
+       std::make_tuple(1, 0, "VK_INTEL_performance_query"),
+       std::make_tuple(1, 0, "VK_INTEL_shader_integer_functions2"),
+       std::make_tuple(1, 0, "VK_KHR_16bit_storage"),
+       std::make_tuple(1, 0, "VK_KHR_8bit_storage"),
+       std::make_tuple(1, 1, "VK_KHR_acceleration_structure"),
+       std::make_tuple(1, 0, "VK_KHR_android_surface"),
+       std::make_tuple(1, 0, "VK_KHR_bind_memory2"),
+       std::make_tuple(1, 0, "VK_KHR_buffer_device_address"),
+       std::make_tuple(1, 0, "VK_KHR_copy_commands2"),
+       std::make_tuple(1, 0, "VK_KHR_create_renderpass2"),
+       std::make_tuple(1, 0, "VK_KHR_dedicated_allocation"),
+       std::make_tuple(1, 0, "VK_KHR_deferred_host_operations"),
+       std::make_tuple(1, 0, "VK_KHR_depth_stencil_resolve"),
+       std::make_tuple(1, 0, "VK_KHR_descriptor_update_template"),
+       std::make_tuple(1, 0, "VK_KHR_device_group"),
+       std::make_tuple(1, 0, "VK_KHR_device_group_creation"),
+       std::make_tuple(1, 0, "VK_KHR_display"),
+       std::make_tuple(1, 0, "VK_KHR_display_swapchain"),
+       std::make_tuple(1, 0, "VK_KHR_draw_indirect_count"),
+       std::make_tuple(1, 0, "VK_KHR_driver_properties"),
+       std::make_tuple(1, 0, "VK_KHR_external_fence"),
+       std::make_tuple(1, 0, "VK_KHR_external_fence_capabilities"),
+       std::make_tuple(1, 0, "VK_KHR_external_fence_fd"),
+       std::make_tuple(1, 0, "VK_KHR_external_fence_win32"),
+       std::make_tuple(1, 0, "VK_KHR_external_memory"),
+       std::make_tuple(1, 0, "VK_KHR_external_memory_capabilities"),
+       std::make_tuple(1, 0, "VK_KHR_external_memory_fd"),
+       std::make_tuple(1, 0, "VK_KHR_external_memory_win32"),
+       std::make_tuple(1, 0, "VK_KHR_external_semaphore"),
+       std::make_tuple(1, 0, "VK_KHR_external_semaphore_capabilities"),
+       std::make_tuple(1, 0, "VK_KHR_external_semaphore_fd"),
+       std::make_tuple(1, 0, "VK_KHR_external_semaphore_win32"),
+       std::make_tuple(1, 0, "VK_KHR_fragment_shading_rate"),
+       std::make_tuple(1, 0, "VK_KHR_get_display_properties2"),
+       std::make_tuple(1, 0, "VK_KHR_get_memory_requirements2"),
+       std::make_tuple(1, 0, "VK_KHR_get_physical_device_properties2"),
+       std::make_tuple(1, 0, "VK_KHR_get_surface_capabilities2"),
+       std::make_tuple(1, 0, "VK_KHR_image_format_list"),
+       std::make_tuple(1, 0, "VK_KHR_imageless_framebuffer"),
+       std::make_tuple(1, 0, "VK_KHR_incremental_present"),
+       std::make_tuple(1, 0, "VK_KHR_maintenance1"),
+       std::make_tuple(1, 0, "VK_KHR_maintenance2"),
+       std::make_tuple(1, 0, "VK_KHR_maintenance3"),
+       std::make_tuple(1, 0, "VK_KHR_multiview"),
+       std::make_tuple(1, 0, "VK_KHR_performance_query"),
+       std::make_tuple(1, 0, "VK_KHR_pipeline_executable_properties"),
+       std::make_tuple(1, 0, "VK_KHR_pipeline_library"),
+       std::make_tuple(1, 0, "VK_KHR_portability_subset"),
+       std::make_tuple(1, 0, "VK_KHR_push_descriptor"),
+       std::make_tuple(1, 1, "VK_KHR_ray_query"),
+       std::make_tuple(1, 1, "VK_KHR_ray_tracing_pipeline"),
+       std::make_tuple(1, 0, "VK_KHR_relaxed_block_layout"),
+       std::make_tuple(1, 0, "VK_KHR_sampler_mirror_clamp_to_edge"),
+       std::make_tuple(1, 0, "VK_KHR_sampler_ycbcr_conversion"),
+       std::make_tuple(1, 0, "VK_KHR_separate_depth_stencil_layouts"),
+       std::make_tuple(1, 0, "VK_KHR_shader_atomic_int64"),
+       std::make_tuple(1, 0, "VK_KHR_shader_clock"),
+       std::make_tuple(1, 0, "VK_KHR_shader_draw_parameters"),
+       std::make_tuple(1, 0, "VK_KHR_shader_float16_int8"),
+       std::make_tuple(1, 0, "VK_KHR_shader_float_controls"),
+       std::make_tuple(1, 0, "VK_KHR_shader_non_semantic_info"),
+       std::make_tuple(1, 1, "VK_KHR_shader_subgroup_extended_types"),
+       std::make_tuple(1, 1, "VK_KHR_shader_subgroup_uniform_control_flow"),
+       std::make_tuple(1, 0, "VK_KHR_shader_terminate_invocation"),
+       std::make_tuple(1, 0, "VK_KHR_shared_presentable_image"),
+       std::make_tuple(1, 1, "VK_KHR_spirv_1_4"),
+       std::make_tuple(1, 0, "VK_KHR_storage_buffer_storage_class"),
+       std::make_tuple(1, 0, "VK_KHR_surface"),
+       std::make_tuple(1, 1, "VK_KHR_surface_protected_capabilities"),
+       std::make_tuple(1, 0, "VK_KHR_swapchain"),
+       std::make_tuple(1, 0, "VK_KHR_swapchain_mutable_format"),
+       std::make_tuple(1, 0, "VK_KHR_synchronization2"),
+       std::make_tuple(1, 0, "VK_KHR_timeline_semaphore"),
+       std::make_tuple(1, 0, "VK_KHR_uniform_buffer_standard_layout"),
+       std::make_tuple(1, 0, "VK_KHR_variable_pointers"),
+       std::make_tuple(1, 0, "VK_KHR_video_decode_queue"),
+       std::make_tuple(1, 0, "VK_KHR_video_encode_queue"),
+       std::make_tuple(1, 0, "VK_KHR_video_queue"),
+       std::make_tuple(1, 0, "VK_KHR_vulkan_memory_model"),
+       std::make_tuple(1, 0, "VK_KHR_wayland_surface"),
+       std::make_tuple(1, 0, "VK_KHR_win32_keyed_mutex"),
+       std::make_tuple(1, 0, "VK_KHR_win32_surface"),
+       std::make_tuple(1, 0, "VK_KHR_workgroup_memory_explicit_layout"),
+       std::make_tuple(1, 0, "VK_KHR_xcb_surface"),
+       std::make_tuple(1, 0, "VK_KHR_xlib_surface"),
+       std::make_tuple(1, 0, "VK_KHR_zero_initialize_workgroup_memory"),
+       std::make_tuple(1, 0, "VK_MVK_ios_surface"),
+       std::make_tuple(1, 0, "VK_MVK_macos_surface"),
+       std::make_tuple(1, 0, "VK_NN_vi_surface"),
+       std::make_tuple(1, 0, "VK_NVX_binary_import"),
+       std::make_tuple(1, 0, "VK_NVX_image_view_handle"),
+       std::make_tuple(1, 0, "VK_NVX_multiview_per_view_attributes"),
+       std::make_tuple(1, 0, "VK_NV_acquire_winrt_display"),
+       std::make_tuple(1, 0, "VK_NV_clip_space_w_scaling"),
+       std::make_tuple(1, 0, "VK_NV_compute_shader_derivatives"),
+       std::make_tuple(1, 0, "VK_NV_cooperative_matrix"),
+       std::make_tuple(1, 0, "VK_NV_corner_sampled_image"),
+       std::make_tuple(1, 0, "VK_NV_coverage_reduction_mode"),
+       std::make_tuple(1, 0, "VK_NV_dedicated_allocation"),
+       std::make_tuple(1, 0, "VK_NV_dedicated_allocation_image_aliasing"),
+       std::make_tuple(1, 0, "VK_NV_device_diagnostic_checkpoints"),
+       std::make_tuple(1, 0, "VK_NV_device_diagnostics_config"),
+       std::make_tuple(1, 1, "VK_NV_device_generated_commands"),
+       std::make_tuple(1, 0, "VK_NV_external_memory"),
+       std::make_tuple(1, 0, "VK_NV_external_memory_capabilities"),
+       std::make_tuple(1, 0, "VK_NV_external_memory_win32"),
+       std::make_tuple(1, 0, "VK_NV_fill_rectangle"),
+       std::make_tuple(1, 0, "VK_NV_fragment_coverage_to_color"),
+       std::make_tuple(1, 0, "VK_NV_fragment_shader_barycentric"),
+       std::make_tuple(1, 0, "VK_NV_fragment_shading_rate_enums"),
+       std::make_tuple(1, 0, "VK_NV_framebuffer_mixed_samples"),
+       std::make_tuple(1, 0, "VK_NV_geometry_shader_passthrough"),
+       std::make_tuple(1, 0, "VK_NV_glsl_shader"),
+       std::make_tuple(1, 0, "VK_NV_inherited_viewport_scissor"),
+       std::make_tuple(1, 0, "VK_NV_mesh_shader"),
+       std::make_tuple(1, 0, "VK_NV_ray_tracing"),
+       std::make_tuple(1, 0, "VK_NV_representative_fragment_test"),
+       std::make_tuple(1, 0, "VK_NV_sample_mask_override_coverage"),
+       std::make_tuple(1, 0, "VK_NV_scissor_exclusive"),
+       std::make_tuple(1, 0, "VK_NV_shader_image_footprint"),
+       std::make_tuple(1, 1, "VK_NV_shader_sm_builtins"),
+       std::make_tuple(1, 1, "VK_NV_shader_subgroup_partitioned"),
+       std::make_tuple(1, 0, "VK_NV_shading_rate_image"),
+       std::make_tuple(1, 0, "VK_NV_viewport_array2"),
+       std::make_tuple(1, 0, "VK_NV_viewport_swizzle"),
+       std::make_tuple(1, 0, "VK_NV_win32_keyed_mutex"),
+       std::make_tuple(1, 0, "VK_QCOM_render_pass_shader_resolve"),
+       std::make_tuple(1, 0, "VK_QCOM_render_pass_store_ops"),
+       std::make_tuple(1, 0, "VK_QCOM_render_pass_transform"),
+       std::make_tuple(1, 0, "VK_QCOM_rotated_copy_commands"),
+       std::make_tuple(1, 0, "VK_QNX_screen_surface"),
+       std::make_tuple(1, 0, "VK_VALVE_mutable_descriptor_type"),
+};
index a807ee4..3fc5041 100644 (file)
@@ -2224,6 +2224,33 @@ tcu::TestStatus enumerateDeviceExtensions (Context& context)
        return tcu::TestStatus(results.getResult(), results.getMessage());
 }
 
+tcu::TestStatus extensionCoreVersions (Context& context)
+{
+       deUint32        major;
+       deUint32        minor;
+       const char*     extName;
+
+       auto&                                   log             = context.getTestContext().getLog();
+       tcu::ResultCollector    results (log);
+
+       const auto instanceExtensionProperties  = enumerateInstanceExtensionProperties(context.getPlatformInterface(), DE_NULL);
+       const auto deviceExtensionProperties    = enumerateDeviceExtensionProperties(context.getInstanceInterface(), context.getPhysicalDevice(), DE_NULL);
+
+       for (const auto& majorMinorName : extensionRequiredCoreVersion)
+       {
+               std::tie(major, minor, extName) = majorMinorName;
+               const RequiredExtension reqExt (extName);
+
+               if ((isExtensionSupported(instanceExtensionProperties, reqExt) || isExtensionSupported(deviceExtensionProperties, reqExt)) &&
+                   !context.contextSupports(vk::ApiVersion(major, minor, 0u)))
+               {
+                       results.fail("Required core version for " + std::string(extName) + " not met (" + de::toString(major) + "." + de::toString(minor) + ")");
+               }
+       }
+
+       return tcu::TestStatus(results.getResult(), results.getMessage());
+}
+
 #define VK_SIZE_OF(STRUCT, MEMBER)                                     (sizeof(((STRUCT*)0)->MEMBER))
 #define OFFSET_TABLE_ENTRY(STRUCT, MEMBER)                     { (size_t)DE_OFFSET_OF(STRUCT, MEMBER), VK_SIZE_OF(STRUCT, MEMBER) }
 
@@ -5648,6 +5675,14 @@ tcu::TestCaseGroup* createFeatureInfoTests (tcu::TestContext& testCtx)
        infoTests->addChild(createTestGroup(testCtx, "image_format_properties", "VkGetPhysicalDeviceImageFormatProperties() Tests",     createImageFormatTests, imageFormatProperties));
 
        {
+               de::MovePtr<tcu::TestCaseGroup> extCoreVersionGrp (new tcu::TestCaseGroup(testCtx, "extension_core_versions", "Tests checking extension required core versions"));
+
+               addFunctionCase(extCoreVersionGrp.get(), "extension_core_versions", "", extensionCoreVersions);
+
+               infoTests->addChild(extCoreVersionGrp.release());
+       }
+
+       {
                de::MovePtr<tcu::TestCaseGroup> extendedPropertiesTests (new tcu::TestCaseGroup(testCtx, "get_physical_device_properties2", "VK_KHR_get_physical_device_properties2"));
 
                addFunctionCase(extendedPropertiesTests.get(), "features",                                      "Extended Device Features",                                     deviceFeatures2);
index 5cf27d5..ce939fb 100644 (file)
@@ -1416,6 +1416,7 @@ dEQP-VK.api.info.image_format_properties.3d.linear.astc_12x10_unorm_block
 dEQP-VK.api.info.image_format_properties.3d.linear.astc_12x10_srgb_block
 dEQP-VK.api.info.image_format_properties.3d.linear.astc_12x12_unorm_block
 dEQP-VK.api.info.image_format_properties.3d.linear.astc_12x12_srgb_block
+dEQP-VK.api.info.extension_core_versions.extension_core_versions
 dEQP-VK.api.info.get_physical_device_properties2.features
 dEQP-VK.api.info.get_physical_device_properties2.properties
 dEQP-VK.api.info.get_physical_device_properties2.format_properties
index a4a1d84..739df16 100644 (file)
@@ -46,6 +46,7 @@ VK_EXT_TYPE_DEVICE                            = 1
 VK_EXT_DEP_INSTANCE                            = 'instanceExtensionDependencies'
 VK_EXT_DEP_DEVICE                              = 'deviceExtensionDependencies'
 VK_EXT_API_VERSIONS                            = 'releasedApiVersions'
+VK_EXT_CORE_VERSIONS                   = 'extensionRequiredCoreVersion'
 VK_XML_EXT_DEPS                                        = 'requires'
 VK_XML_EXT_NAME                                        = 'name'
 VK_XML_EXT_PROMO                               = 'promotedto'
@@ -75,23 +76,34 @@ def genApiVersions(name, apiVersions):
                yield '\tstd::make_tuple({}, {}, {}),'.format(version, major, minor)
        yield '};'
 
+def genRequiredCoreVersions(name, coreVersionsDict):
+       yield 'static const std::tuple<deUint32, deUint32, const char*>\t{}[]\t ='.format(name)
+       yield '{'
+       extNames = sorted(coreVersionsDict.keys())
+       for extName in extNames:
+               (major, minor) = coreVersionsDict[extName]
+               yield '\tstd::make_tuple({}, {}, "{}"),'.format(major, minor, extName)
+       yield '};'
+
 def genExtDepInl(dependenciesAndVersions):
-       allExtDepsDict, apiVersions = dependenciesAndVersions
+       allExtDepsDict, apiVersions, allExtCoreVersions = dependenciesAndVersions
        apiVersions.reverse()
        lines = []
 
-       lines = lines + [line for line in genExtDepArray(VK_EXT_DEP_INSTANCE, allExtDepsDict[VK_EXT_TYPE_INSTANCE])]
-       lines = lines + [line for line in genExtDepArray(VK_EXT_DEP_DEVICE, allExtDepsDict[VK_EXT_TYPE_DEVICE])]
-       lines = lines + [line for line in genApiVersions(VK_EXT_API_VERSIONS, apiVersions)]
+       lines.extend(genExtDepArray(VK_EXT_DEP_INSTANCE, allExtDepsDict[VK_EXT_TYPE_INSTANCE]))
+       lines.extend(genExtDepArray(VK_EXT_DEP_DEVICE, allExtDepsDict[VK_EXT_TYPE_DEVICE]))
+       lines.extend(genApiVersions(VK_EXT_API_VERSIONS, apiVersions))
+       lines.extend(genRequiredCoreVersions(VK_EXT_CORE_VERSIONS, allExtCoreVersions))
 
        writeInlFile(VK_INL_FILE, lines)
 
 class extInfo:
        def __init__(self):
-               self.type       = VK_EXT_TYPE_INSTANCE
-               self.core       = VK_MAKE_VERSION(1, 0, 0)
-               self.promo      = VK_EXT_NOT_PROMOTED
-               self.deps       = []
+               self.type                       = VK_EXT_TYPE_INSTANCE
+               self.core                       = VK_MAKE_VERSION(1, 0, 0)
+               self.coreMajorMinor     = (1, 0)
+               self.promo                      = VK_EXT_NOT_PROMOTED
+               self.deps                       = []
 
 def genExtDepsOnApiVersion(ext, extInfoDict, apiVersion):
        deps = []
@@ -127,7 +139,12 @@ def genExtDeps(extensionsAndVersions):
 
        for key, value in allExtDepsDict.items():
                value.sort(key=lambda x: x[2])
-       return allExtDepsDict, apiVersions
+
+       allExtCoreVersions = {}
+       for (ext, info) in extInfoDict.items():
+               allExtCoreVersions[ext] = info.coreMajorMinor
+
+       return allExtDepsDict, apiVersions, allExtCoreVersions
 
 def getExtInfoDict(vkRegistry):
        extInfoDict = {}
@@ -141,11 +158,14 @@ def getExtInfoDict(vkRegistry):
                        continue
                apiVersionID.append( (int(featureName[2]), int(featureName[3])) )
 
-       apiVersionsByName       = {}
-       apiVersionsByNumber     = {}
+       apiVersionsByName               = {}
+       apiVersionsByNumber             = {}
+       apiMajorMinorByNumber   = {}
        for (major,minor) in apiVersionID:
+               majorDotMinor = '{}.{}'.format(major,minor)
                apiVersionsByName['VK_VERSION_{}_{}'.format(major,minor)]       = VK_MAKE_VERSION(major, minor, 0);
-               apiVersionsByNumber['{}.{}'.format(major,minor)]                        = VK_MAKE_VERSION(major, minor, 0);
+               apiVersionsByNumber[majorDotMinor]                                                      = VK_MAKE_VERSION(major, minor, 0);
+               apiMajorMinorByNumber[majorDotMinor]                                            = (major, minor)
 
        for ext in vkRegistry.extensions:
                if ext.attrib[VK_XML_EXT_SUPPORTED] != VK_XML_EXT_SUPPORTED_VULKAN:
@@ -157,6 +177,7 @@ def getExtInfoDict(vkRegistry):
                        extInfoDict[name].type = VK_EXT_TYPE_DEVICE
                if VK_XML_EXT_REQUIRES_CORE in ext.attrib and ext.attrib[VK_XML_EXT_REQUIRES_CORE] in apiVersionsByNumber:
                        extInfoDict[name].core = apiVersionsByNumber[ext.attrib[VK_XML_EXT_REQUIRES_CORE]]
+                       extInfoDict[name].coreMajorMinor = apiMajorMinorByNumber[ext.attrib[VK_XML_EXT_REQUIRES_CORE]]
                if VK_XML_EXT_PROMO in ext.attrib and ext.attrib[VK_XML_EXT_PROMO] in apiVersionsByName :
                        extInfoDict[name].promo = apiVersionsByName[ext.attrib[VK_XML_EXT_PROMO]]
                if VK_XML_EXT_DEPS in ext.attrib: