You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	vulkan: enable VK_KHR_cooperative_matrix
It's of interest to API users, and of interest to us, as a DCT/DST can be implemented via matrix multiplies.
This commit is contained in:
		
							
								
								
									
										4
									
								
								configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								configure
									
									
									
									
										vendored
									
									
								
							| @@ -7149,8 +7149,8 @@ enabled crystalhd && check_lib crystalhd "stdint.h libcrystalhd/libcrystalhd_if. | ||||
|          "in maintaining it." | ||||
|  | ||||
| if enabled vulkan; then | ||||
|     check_pkg_config_header_only vulkan "vulkan >= 1.3.238" "vulkan/vulkan.h" "defined VK_VERSION_1_3" || | ||||
|         check_cpp_condition vulkan "vulkan/vulkan.h" "defined(VK_VERSION_1_4) || (defined(VK_VERSION_1_3) && VK_HEADER_VERSION >= 238)" | ||||
|     check_pkg_config_header_only vulkan "vulkan >= 1.3.255" "vulkan/vulkan.h" "defined VK_VERSION_1_3" || | ||||
|         check_cpp_condition vulkan "vulkan/vulkan.h" "defined(VK_VERSION_1_4) || (defined(VK_VERSION_1_3) && VK_HEADER_VERSION >= 255)" | ||||
| fi | ||||
|  | ||||
| if enabled x86; then | ||||
|   | ||||
| @@ -99,6 +99,7 @@ typedef struct VulkanDevicePriv { | ||||
|     VkPhysicalDeviceVulkan13Features device_features_1_3; | ||||
|     VkPhysicalDeviceDescriptorBufferFeaturesEXT desc_buf_features; | ||||
|     VkPhysicalDeviceShaderAtomicFloatFeaturesEXT atomic_float_features; | ||||
|     VkPhysicalDeviceCooperativeMatrixFeaturesKHR coop_matrix_features; | ||||
|  | ||||
|     /* Queues */ | ||||
|     pthread_mutex_t **qf_mutex; | ||||
| @@ -405,6 +406,7 @@ static const VulkanOptExtension optional_device_exts[] = { | ||||
|     { VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME,                FF_VK_EXT_DESCRIPTOR_BUFFER,     }, | ||||
|     { VK_EXT_PHYSICAL_DEVICE_DRM_EXTENSION_NAME,              FF_VK_EXT_DEVICE_DRM             }, | ||||
|     { VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME,              FF_VK_EXT_ATOMIC_FLOAT           }, | ||||
|     { VK_KHR_COOPERATIVE_MATRIX_EXTENSION_NAME,               FF_VK_EXT_COOP_MATRIX            }, | ||||
|  | ||||
|     /* Imports/exports */ | ||||
|     { VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME,               FF_VK_EXT_EXTERNAL_FD_MEMORY     }, | ||||
| @@ -1202,9 +1204,13 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx, | ||||
|     VkPhysicalDeviceTimelineSemaphoreFeatures timeline_features = { | ||||
|         .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES, | ||||
|     }; | ||||
|     VkPhysicalDeviceCooperativeMatrixFeaturesKHR coop_matrix_features = { | ||||
|         .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR, | ||||
|         .pNext = &timeline_features, | ||||
|     }; | ||||
|     VkPhysicalDeviceShaderAtomicFloatFeaturesEXT atomic_float_features = { | ||||
|         .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT, | ||||
|         .pNext = &timeline_features, | ||||
|         .pNext = &coop_matrix_features, | ||||
|     }; | ||||
|     VkPhysicalDeviceDescriptorBufferFeaturesEXT desc_buf_features = { | ||||
|         .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT, | ||||
| @@ -1242,7 +1248,9 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx, | ||||
|     p->desc_buf_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT; | ||||
|     p->desc_buf_features.pNext = &p->atomic_float_features; | ||||
|     p->atomic_float_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT; | ||||
|     p->atomic_float_features.pNext = NULL; | ||||
|     p->atomic_float_features.pNext = &p->coop_matrix_features; | ||||
|     p->coop_matrix_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR; | ||||
|     p->coop_matrix_features.pNext = NULL; | ||||
|  | ||||
|     ctx->free = vulkan_device_free; | ||||
|  | ||||
| @@ -1304,6 +1312,8 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx, | ||||
|     p->atomic_float_features.shaderBufferFloat32Atomics = atomic_float_features.shaderBufferFloat32Atomics; | ||||
|     p->atomic_float_features.shaderBufferFloat32AtomicAdd = atomic_float_features.shaderBufferFloat32AtomicAdd; | ||||
|  | ||||
|     p->coop_matrix_features.cooperativeMatrix = coop_matrix_features.cooperativeMatrix; | ||||
|  | ||||
|     dev_info.pNext = &hwctx->device_features; | ||||
|  | ||||
|     /* Setup queue family */ | ||||
|   | ||||
| @@ -90,9 +90,13 @@ int ff_vk_load_props(FFVulkanContext *s) | ||||
|     s->hprops = (VkPhysicalDeviceExternalMemoryHostPropertiesEXT) { | ||||
|         .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT, | ||||
|     }; | ||||
|     s->coop_matrix_props = (VkPhysicalDeviceCooperativeMatrixPropertiesKHR) { | ||||
|         .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR, | ||||
|         .pNext = &s->hprops, | ||||
|     }; | ||||
|     s->subgroup_props = (VkPhysicalDeviceSubgroupSizeControlProperties) { | ||||
|         .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES, | ||||
|         .pNext = &s->hprops, | ||||
|         .pNext = &s->coop_matrix_props, | ||||
|     }; | ||||
|     s->desc_buf_props = (VkPhysicalDeviceDescriptorBufferPropertiesEXT) { | ||||
|         .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT, | ||||
| @@ -161,6 +165,25 @@ int ff_vk_load_props(FFVulkanContext *s) | ||||
|  | ||||
|     vk->GetPhysicalDeviceQueueFamilyProperties2(s->hwctx->phys_dev, &s->tot_nb_qfs, s->qf_props); | ||||
|  | ||||
|     if (vk->GetPhysicalDeviceCooperativeMatrixPropertiesKHR) { | ||||
|         vk->GetPhysicalDeviceCooperativeMatrixPropertiesKHR(s->hwctx->phys_dev, | ||||
|                                                             &s->coop_mat_props_nb, NULL); | ||||
|  | ||||
|         if (s->coop_mat_props_nb) { | ||||
|             s->coop_mat_props = av_malloc_array(s->coop_mat_props_nb, | ||||
|                                                 sizeof(VkCooperativeMatrixPropertiesKHR)); | ||||
|             for (int i = 0; i < s->coop_mat_props_nb; i++) { | ||||
|                 s->coop_mat_props[i] = (VkCooperativeMatrixPropertiesKHR) { | ||||
|                     .sType = VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_KHR, | ||||
|                 }; | ||||
|             } | ||||
|  | ||||
|             vk->GetPhysicalDeviceCooperativeMatrixPropertiesKHR(s->hwctx->phys_dev, | ||||
|                                                                 &s->coop_mat_props_nb, | ||||
|                                                                 s->coop_mat_props); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -236,11 +236,15 @@ typedef struct FFVulkanContext { | ||||
|     VkPhysicalDeviceExternalMemoryHostPropertiesEXT hprops; | ||||
|     VkPhysicalDeviceDescriptorBufferPropertiesEXT desc_buf_props; | ||||
|     VkPhysicalDeviceSubgroupSizeControlProperties subgroup_props; | ||||
|     VkPhysicalDeviceCooperativeMatrixPropertiesKHR coop_matrix_props; | ||||
|     VkQueueFamilyQueryResultStatusPropertiesKHR *query_props; | ||||
|     VkQueueFamilyVideoPropertiesKHR *video_props; | ||||
|     VkQueueFamilyProperties2 *qf_props; | ||||
|     int tot_nb_qfs; | ||||
|  | ||||
|     VkCooperativeMatrixPropertiesKHR *coop_mat_props; | ||||
|     uint32_t coop_mat_props_nb; | ||||
|  | ||||
|     VkPhysicalDeviceShaderAtomicFloatFeaturesEXT atomic_float_feats; | ||||
|     VkPhysicalDeviceVulkan12Features feats_12; | ||||
|     VkPhysicalDeviceFeatures2 feats; | ||||
|   | ||||
| @@ -45,6 +45,7 @@ typedef enum FFVulkanExtensions { | ||||
|     FF_VK_EXT_VIDEO_DECODE_H265      = 1ULL << 13, /* VK_EXT_video_decode_h265 */ | ||||
|     FF_VK_EXT_VIDEO_DECODE_AV1       = 1ULL << 14, /* VK_MESA_video_decode_av1 */ | ||||
|     FF_VK_EXT_ATOMIC_FLOAT           = 1ULL << 15, /* VK_EXT_shader_atomic_float */ | ||||
|     FF_VK_EXT_COOP_MATRIX            = 1ULL << 16, /* VK_KHR_cooperative_matrix */ | ||||
|  | ||||
|     FF_VK_EXT_NO_FLAG                = 1ULL << 31, | ||||
| } FFVulkanExtensions; | ||||
| @@ -80,6 +81,7 @@ typedef enum FFVulkanExtensions { | ||||
|     MACRO(1, 0, FF_VK_EXT_NO_FLAG,              GetPhysicalDeviceImageFormatProperties2) \ | ||||
|     MACRO(1, 0, FF_VK_EXT_NO_FLAG,              GetPhysicalDeviceQueueFamilyProperties)  \ | ||||
|     MACRO(1, 0, FF_VK_EXT_NO_FLAG,              GetPhysicalDeviceQueueFamilyProperties2) \ | ||||
|     MACRO(1, 0, FF_VK_EXT_COOP_MATRIX,          GetPhysicalDeviceCooperativeMatrixPropertiesKHR) \ | ||||
|                                                                                          \ | ||||
|     /* Command pool */                                                                   \ | ||||
|     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              CreateCommandPool)                       \ | ||||
|   | ||||
| @@ -46,6 +46,7 @@ static inline uint64_t ff_vk_extensions_to_mask(const char * const *extensions, | ||||
|         { VK_EXT_DEBUG_UTILS_EXTENSION_NAME,               FF_VK_EXT_DEBUG_UTILS            }, | ||||
|         { VK_EXT_PHYSICAL_DEVICE_DRM_EXTENSION_NAME,       FF_VK_EXT_DEVICE_DRM             }, | ||||
|         { VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME,       FF_VK_EXT_ATOMIC_FLOAT           }, | ||||
|         { VK_KHR_COOPERATIVE_MATRIX_EXTENSION_NAME,        FF_VK_EXT_COOP_MATRIX            }, | ||||
| #ifdef _WIN32 | ||||
|         { VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME,     FF_VK_EXT_EXTERNAL_WIN32_MEMORY  }, | ||||
|         { VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME,  FF_VK_EXT_EXTERNAL_WIN32_SEM     }, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user