* [FFmpeg-devel] [PATCH 1/3] vulkan: move feature<->property mapping code outside of hwcontext_vulkan.c
@ 2025-04-20 9:03 Lynne
2025-04-20 9:03 ` [FFmpeg-devel] [PATCH 2/3] vulkan: check that the max number of push descriptors is not exceeded Lynne
2025-04-20 9:03 ` [FFmpeg-devel] [PATCH 3/3] vulkan: move OPT_CHAIN out of hwcontext_vulkan Lynne
0 siblings, 2 replies; 3+ messages in thread
From: Lynne @ 2025-04-20 9:03 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Lynne
Allows for it to be reused.
---
libavutil/hwcontext_vulkan.c | 42 ++++++------------------------------
libavutil/vulkan.c | 34 +++++++++++++++++++++++++++++
libavutil/vulkan.h | 6 ++++++
3 files changed, 46 insertions(+), 36 deletions(-)
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index d7822d4629..e9fa734518 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -437,40 +437,6 @@ static const struct FFVkFormatEntry *vk_find_format_entry(enum AVPixelFormat p)
return NULL;
}
-/* Malitia pura, Khronos */
-#define FN_MAP_TO(dst_t, dst_name, src_t, src_name) \
- static av_unused dst_t map_ ##src_name## _to_ ##dst_name(src_t src) \
- { \
- dst_t dst = 0x0; \
- MAP_TO(VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT, \
- VK_IMAGE_USAGE_SAMPLED_BIT); \
- MAP_TO(VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT, \
- VK_IMAGE_USAGE_TRANSFER_SRC_BIT); \
- MAP_TO(VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT, \
- VK_IMAGE_USAGE_TRANSFER_DST_BIT); \
- MAP_TO(VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT, \
- VK_IMAGE_USAGE_STORAGE_BIT); \
- MAP_TO(VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT, \
- VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); \
- MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR, \
- VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR); \
- MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR, \
- VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR); \
- MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR, \
- VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR); \
- MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT_KHR, \
- VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR); \
- return dst; \
- }
-
-#define MAP_TO(flag1, flag2) if (src & flag2) dst |= flag1;
-FN_MAP_TO(VkFormatFeatureFlagBits2, feats, VkImageUsageFlags, usage)
-#undef MAP_TO
-#define MAP_TO(flag1, flag2) if (src & flag1) dst |= flag2;
-FN_MAP_TO(VkImageUsageFlags, usage, VkFormatFeatureFlagBits2, feats)
-#undef MAP_TO
-#undef FN_MAP_TO
-
static int vkfmt_from_pixfmt2(AVHWDeviceContext *dev_ctx, enum AVPixelFormat p,
VkImageTiling tiling,
VkFormat fmts[AV_NUM_DATA_POINTERS], /* Output format list */
@@ -538,7 +504,7 @@ static int vkfmt_from_pixfmt2(AVHWDeviceContext *dev_ctx, enum AVPixelFormat p,
if (aspect)
*aspect = vk_formats_list[i].aspect;
if (supported_usage)
- *supported_usage = map_feats_to_usage(feats_primary) |
+ *supported_usage = ff_vk_map_feats_to_usage(feats_primary) |
((need_storage && (storage_primary | storage_secondary)) ?
VK_IMAGE_USAGE_STORAGE_BIT : 0);
return 0;
@@ -553,7 +519,7 @@ static int vkfmt_from_pixfmt2(AVHWDeviceContext *dev_ctx, enum AVPixelFormat p,
if (aspect)
*aspect = vk_formats_list[i].aspect;
if (supported_usage)
- *supported_usage = map_feats_to_usage(feats_secondary);
+ *supported_usage = ff_vk_map_feats_to_usage(feats_secondary);
return 0;
} else {
return AVERROR(ENOTSUP);
@@ -2681,6 +2647,10 @@ static AVBufferRef *vulkan_pool_alloc(void *opaque, size_t size)
VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT);
#endif
+ if (p->vkctx.extensions & FF_VK_EXT_EXTERNAL_DMABUF_MEMORY)
+ try_export_flags(hwfc, &eiinfo.handleTypes, &e,
+ VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT);
+
for (int i = 0; i < av_pix_fmt_count_planes(hwfc->sw_format); i++) {
eminfo[i].sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO;
eminfo[i].pNext = hwctx->alloc_pnext[i];
diff --git a/libavutil/vulkan.c b/libavutil/vulkan.c
index 8b02abecf1..8ab977c734 100644
--- a/libavutil/vulkan.c
+++ b/libavutil/vulkan.c
@@ -84,6 +84,40 @@ const char *ff_vk_ret2str(VkResult res)
#undef CASE
}
+/* Malitia pura, Khronos */
+#define FN_MAP_TO(dst_t, dst_name, src_t, src_name) \
+ dst_t ff_vk_map_ ##src_name## _to_ ##dst_name(src_t src) \
+ { \
+ dst_t dst = 0x0; \
+ MAP_TO(VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT, \
+ VK_IMAGE_USAGE_SAMPLED_BIT); \
+ MAP_TO(VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT, \
+ VK_IMAGE_USAGE_TRANSFER_SRC_BIT); \
+ MAP_TO(VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT, \
+ VK_IMAGE_USAGE_TRANSFER_DST_BIT); \
+ MAP_TO(VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT, \
+ VK_IMAGE_USAGE_STORAGE_BIT); \
+ MAP_TO(VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT, \
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); \
+ MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR, \
+ VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR); \
+ MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR, \
+ VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR); \
+ MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR, \
+ VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR); \
+ MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT_KHR, \
+ VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR); \
+ return dst; \
+ }
+
+#define MAP_TO(flag1, flag2) if (src & flag2) dst |= flag1;
+FN_MAP_TO(VkFormatFeatureFlagBits2, feats, VkImageUsageFlags, usage)
+#undef MAP_TO
+#define MAP_TO(flag1, flag2) if (src & flag1) dst |= flag2;
+FN_MAP_TO(VkImageUsageFlags, usage, VkFormatFeatureFlagBits2, feats)
+#undef MAP_TO
+#undef FN_MAP_TO
+
static void load_enabled_qfs(FFVulkanContext *s)
{
s->nb_qfs = 0;
diff --git a/libavutil/vulkan.h b/libavutil/vulkan.h
index 2fb7f7c2de..49f015ae9d 100644
--- a/libavutil/vulkan.h
+++ b/libavutil/vulkan.h
@@ -364,6 +364,12 @@ int ff_vk_init(FFVulkanContext *s, void *log_parent,
*/
const char *ff_vk_ret2str(VkResult res);
+/**
+ * Map between usage and features.
+ */
+VkImageUsageFlags ff_vk_map_feats_to_usage(VkFormatFeatureFlagBits2 feats);
+VkFormatFeatureFlagBits2 ff_vk_map_usage_to_feats(VkImageUsageFlags usage);
+
/**
* Returns 1 if pixfmt is a usable RGB format.
*/
--
2.49.0.395.g12beb8f557c
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 3+ messages in thread
* [FFmpeg-devel] [PATCH 2/3] vulkan: check that the max number of push descriptors is not exceeded
2025-04-20 9:03 [FFmpeg-devel] [PATCH 1/3] vulkan: move feature<->property mapping code outside of hwcontext_vulkan.c Lynne
@ 2025-04-20 9:03 ` Lynne
2025-04-20 9:03 ` [FFmpeg-devel] [PATCH 3/3] vulkan: move OPT_CHAIN out of hwcontext_vulkan Lynne
1 sibling, 0 replies; 3+ messages in thread
From: Lynne @ 2025-04-20 9:03 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Lynne
Just correctness. We don't exceed this on any known hardware, but
its better to check.
If we do, we simply fall back to regular descriptors.
---
libavutil/vulkan.c | 15 ++++++++++-----
libavutil/vulkan.h | 1 +
2 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/libavutil/vulkan.c b/libavutil/vulkan.c
index 8ab977c734..3d155c9933 100644
--- a/libavutil/vulkan.c
+++ b/libavutil/vulkan.c
@@ -148,9 +148,13 @@ int ff_vk_load_props(FFVulkanContext *s)
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_PROPERTIES_NV,
.pNext = &s->hprops,
};
+ s->push_desc_props = (VkPhysicalDevicePushDescriptorPropertiesKHR) {
+ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES,
+ .pNext = &s->optical_flow_props,
+ };
s->coop_matrix_props = (VkPhysicalDeviceCooperativeMatrixPropertiesKHR) {
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR,
- .pNext = &s->optical_flow_props,
+ .pNext = &s->push_desc_props,
};
s->subgroup_props = (VkPhysicalDeviceSubgroupSizeControlProperties) {
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES,
@@ -2250,15 +2254,16 @@ static int init_descriptors(FFVulkanContext *s, FFVulkanShader *shd)
if (!(s->extensions & FF_VK_EXT_DESCRIPTOR_BUFFER)) {
int has_singular = 0;
+ int max_descriptors = 0;
for (int i = 0; i < shd->nb_descriptor_sets; i++) {
- if (shd->desc_set[i].singular) {
+ max_descriptors = FFMAX(max_descriptors, shd->desc_set[i].nb_bindings);
+ if (shd->desc_set[i].singular)
has_singular = 1;
- break;
- }
}
shd->use_push = (s->extensions & FF_VK_EXT_PUSH_DESCRIPTOR) &&
+ (max_descriptors <= s->push_desc_props.maxPushDescriptors) &&
(shd->nb_descriptor_sets == 1) &&
- !has_singular;
+ (has_singular == 0);
}
for (int i = 0; i < shd->nb_descriptor_sets; i++) {
diff --git a/libavutil/vulkan.h b/libavutil/vulkan.h
index 49f015ae9d..649a28be27 100644
--- a/libavutil/vulkan.h
+++ b/libavutil/vulkan.h
@@ -285,6 +285,7 @@ typedef struct FFVulkanContext {
VkPhysicalDeviceDescriptorBufferPropertiesEXT desc_buf_props;
VkPhysicalDeviceSubgroupSizeControlProperties subgroup_props;
VkPhysicalDeviceCooperativeMatrixPropertiesKHR coop_matrix_props;
+ VkPhysicalDevicePushDescriptorPropertiesKHR push_desc_props;
VkPhysicalDeviceOpticalFlowPropertiesNV optical_flow_props;
VkQueueFamilyQueryResultStatusPropertiesKHR *query_props;
VkQueueFamilyVideoPropertiesKHR *video_props;
--
2.49.0.395.g12beb8f557c
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 3+ messages in thread
* [FFmpeg-devel] [PATCH 3/3] vulkan: move OPT_CHAIN out of hwcontext_vulkan
2025-04-20 9:03 [FFmpeg-devel] [PATCH 1/3] vulkan: move feature<->property mapping code outside of hwcontext_vulkan.c Lynne
2025-04-20 9:03 ` [FFmpeg-devel] [PATCH 2/3] vulkan: check that the max number of push descriptors is not exceeded Lynne
@ 2025-04-20 9:03 ` Lynne
1 sibling, 0 replies; 3+ messages in thread
From: Lynne @ 2025-04-20 9:03 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Lynne
This allows for it to be shared.
Technically, implementations should not give drivers structs
that the drivers are not familiar with.
---
libavutil/hwcontext_vulkan.c | 63 +++++++++++++-----------------
libavutil/vulkan.c | 75 ++++++++++++++----------------------
libavutil/vulkan.h | 9 +++++
3 files changed, 64 insertions(+), 83 deletions(-)
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index e9fa734518..42ffaadfe5 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -190,59 +190,50 @@ typedef struct AVVkFrameInternal {
static void device_features_init(AVHWDeviceContext *ctx, VulkanDeviceFeatures *feats)
{
VulkanDevicePriv *p = ctx->hwctx;
-
-#define OPT_CHAIN(STRUCT_P, EXT_FLAG, TYPE) \
- do { \
- if ((EXT_FLAG == FF_VK_EXT_NO_FLAG) || \
- (p->vkctx.extensions & EXT_FLAG)) { \
- (STRUCT_P)->sType = TYPE; \
- ff_vk_link_struct(&feats->device, STRUCT_P); \
- } \
- } while (0)
+ FFVulkanContext *s = &p->vkctx;
feats->device = (VkPhysicalDeviceFeatures2) {
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
};
- OPT_CHAIN(&feats->vulkan_1_1, FF_VK_EXT_NO_FLAG,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES);
- OPT_CHAIN(&feats->vulkan_1_2, FF_VK_EXT_NO_FLAG,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES);
- OPT_CHAIN(&feats->vulkan_1_3, FF_VK_EXT_NO_FLAG,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES);
+ FF_VK_EXT_CHAIN(s, &feats->device, &feats->vulkan_1_1, FF_VK_EXT_NO_FLAG,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES);
+ FF_VK_EXT_CHAIN(s, &feats->device, &feats->vulkan_1_2, FF_VK_EXT_NO_FLAG,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES);
+ FF_VK_EXT_CHAIN(s, &feats->device, &feats->vulkan_1_3, FF_VK_EXT_NO_FLAG,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES);
- OPT_CHAIN(&feats->timeline_semaphore, FF_VK_EXT_PORTABILITY_SUBSET,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES);
+ FF_VK_EXT_CHAIN(s, &feats->device, &feats->timeline_semaphore, FF_VK_EXT_PORTABILITY_SUBSET,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES);
#ifdef VK_KHR_shader_expect_assume
- OPT_CHAIN(&feats->expect_assume, FF_VK_EXT_EXPECT_ASSUME,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES_KHR);
+ FF_VK_EXT_CHAIN(s, &feats->device, &feats->expect_assume, FF_VK_EXT_EXPECT_ASSUME,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES_KHR);
#endif
- OPT_CHAIN(&feats->video_maintenance_1, FF_VK_EXT_VIDEO_MAINTENANCE_1,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR);
+ FF_VK_EXT_CHAIN(s, &feats->device, &feats->video_maintenance_1, FF_VK_EXT_VIDEO_MAINTENANCE_1,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR);
#ifdef VK_KHR_video_maintenance2
- OPT_CHAIN(&feats->video_maintenance_2, FF_VK_EXT_VIDEO_MAINTENANCE_2,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_2_FEATURES_KHR);
+ FF_VK_EXT_CHAIN(s, &feats->device, &feats->video_maintenance_2, FF_VK_EXT_VIDEO_MAINTENANCE_2,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_2_FEATURES_KHR);
#endif
- OPT_CHAIN(&feats->shader_object, FF_VK_EXT_SHADER_OBJECT,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT);
- OPT_CHAIN(&feats->cooperative_matrix, FF_VK_EXT_COOP_MATRIX,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR);
- OPT_CHAIN(&feats->descriptor_buffer, FF_VK_EXT_DESCRIPTOR_BUFFER,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT);
- OPT_CHAIN(&feats->atomic_float, FF_VK_EXT_ATOMIC_FLOAT,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT);
+ FF_VK_EXT_CHAIN(s, &feats->device, &feats->shader_object, FF_VK_EXT_SHADER_OBJECT,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT);
+ FF_VK_EXT_CHAIN(s, &feats->device, &feats->cooperative_matrix, FF_VK_EXT_COOP_MATRIX,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR);
+ FF_VK_EXT_CHAIN(s, &feats->device, &feats->descriptor_buffer, FF_VK_EXT_DESCRIPTOR_BUFFER,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT);
+ FF_VK_EXT_CHAIN(s, &feats->device, &feats->atomic_float, FF_VK_EXT_ATOMIC_FLOAT,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT);
#ifdef VK_KHR_shader_relaxed_extended_instruction
- OPT_CHAIN(&feats->relaxed_extended_instruction, FF_VK_EXT_RELAXED_EXTENDED_INSTR,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR);
+ FF_VK_EXT_CHAIN(s, &feats->device, &feats->relaxed_extended_instruction, FF_VK_EXT_RELAXED_EXTENDED_INSTR,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR);
#endif
- OPT_CHAIN(&feats->optical_flow, FF_VK_EXT_OPTICAL_FLOW,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV);
-#undef OPT_CHAIN
+ FF_VK_EXT_CHAIN(s, &feats->device, &feats->optical_flow, FF_VK_EXT_OPTICAL_FLOW,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV);
}
/* Copy all needed device features */
diff --git a/libavutil/vulkan.c b/libavutil/vulkan.c
index 3d155c9933..08858373f0 100644
--- a/libavutil/vulkan.c
+++ b/libavutil/vulkan.c
@@ -141,54 +141,38 @@ int ff_vk_load_props(FFVulkanContext *s)
{
FFVulkanFunctions *vk = &s->vkfn;
- s->hprops = (VkPhysicalDeviceExternalMemoryHostPropertiesEXT) {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT,
- };
- s->optical_flow_props = (VkPhysicalDeviceOpticalFlowPropertiesNV) {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_PROPERTIES_NV,
- .pNext = &s->hprops,
- };
- s->push_desc_props = (VkPhysicalDevicePushDescriptorPropertiesKHR) {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES,
- .pNext = &s->optical_flow_props,
- };
- s->coop_matrix_props = (VkPhysicalDeviceCooperativeMatrixPropertiesKHR) {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR,
- .pNext = &s->push_desc_props,
- };
- s->subgroup_props = (VkPhysicalDeviceSubgroupSizeControlProperties) {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES,
- .pNext = &s->coop_matrix_props,
- };
- s->desc_buf_props = (VkPhysicalDeviceDescriptorBufferPropertiesEXT) {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT,
- .pNext = &s->subgroup_props,
- };
- s->driver_props = (VkPhysicalDeviceDriverProperties) {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES,
- .pNext = &s->desc_buf_props,
- };
- s->props_11 = (VkPhysicalDeviceVulkan11Properties) {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES,
- .pNext = &s->driver_props,
- };
s->props = (VkPhysicalDeviceProperties2) {
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2,
- .pNext = &s->props_11,
};
- s->atomic_float_feats = (VkPhysicalDeviceShaderAtomicFloatFeaturesEXT) {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT,
- };
- s->feats_12 = (VkPhysicalDeviceVulkan12Features) {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES,
- .pNext = &s->atomic_float_feats,
- };
+ FF_VK_EXT_CHAIN(s, &s->props, &s->props_11, FF_VK_EXT_NO_FLAG,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES);
+ FF_VK_EXT_CHAIN(s, &s->props, &s->driver_props, FF_VK_EXT_NO_FLAG,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES);
+ FF_VK_EXT_CHAIN(s, &s->props, &s->subgroup_props, FF_VK_EXT_NO_FLAG,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES);
+
+ FF_VK_EXT_CHAIN(s, &s->props, &s->push_desc_props, FF_VK_EXT_PUSH_DESCRIPTOR,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES);
+ FF_VK_EXT_CHAIN(s, &s->props, &s->hprops, FF_VK_EXT_EXTERNAL_HOST_MEMORY,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT);
+ FF_VK_EXT_CHAIN(s, &s->props, &s->coop_matrix_props, FF_VK_EXT_COOP_MATRIX,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR);
+ FF_VK_EXT_CHAIN(s, &s->props, &s->desc_buf_props, FF_VK_EXT_DESCRIPTOR_BUFFER,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT);
+ FF_VK_EXT_CHAIN(s, &s->props, &s->optical_flow_props, FF_VK_EXT_OPTICAL_FLOW,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_PROPERTIES_NV);
+
s->feats = (VkPhysicalDeviceFeatures2) {
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
.pNext = &s->feats_12,
};
+ FF_VK_EXT_CHAIN(s, &s->feats, &s->feats_12, FF_VK_EXT_NO_FLAG,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES);
+ FF_VK_EXT_CHAIN(s, &s->feats, &s->atomic_float_feats, FF_VK_EXT_ATOMIC_FLOAT,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT);
+
vk->GetPhysicalDeviceProperties2(s->hwctx->phys_dev, &s->props);
vk->GetPhysicalDeviceMemoryProperties(s->hwctx->phys_dev, &s->mprops);
vk->GetPhysicalDeviceFeatures2(s->hwctx->phys_dev, &s->feats);
@@ -218,17 +202,14 @@ int ff_vk_load_props(FFVulkanContext *s)
}
for (uint32_t i = 0; i < s->tot_nb_qfs; i++) {
- s->query_props[i] = (VkQueueFamilyQueryResultStatusPropertiesKHR) {
- .sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_KHR,
- };
- s->video_props[i] = (VkQueueFamilyVideoPropertiesKHR) {
- .sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR,
- .pNext = &s->query_props[i],
- };
s->qf_props[i] = (VkQueueFamilyProperties2) {
.sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2,
- .pNext = s->extensions & FF_VK_EXT_VIDEO_QUEUE ? &s->video_props[i] : NULL,
};
+
+ FF_VK_EXT_CHAIN(s, &s->qf_props[i], &s->query_props[i], FF_VK_EXT_NO_FLAG,
+ VK_STRUCTURE_TYPE_QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_KHR);
+ FF_VK_EXT_CHAIN(s, &s->qf_props[i], &s->video_props[i], FF_VK_EXT_VIDEO_QUEUE,
+ VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR);
}
vk->GetPhysicalDeviceQueueFamilyProperties2(s->hwctx->phys_dev, &s->tot_nb_qfs, s->qf_props);
diff --git a/libavutil/vulkan.h b/libavutil/vulkan.h
index 649a28be27..32ccf19507 100644
--- a/libavutil/vulkan.h
+++ b/libavutil/vulkan.h
@@ -349,6 +349,15 @@ static inline void ff_vk_link_struct(void *chain, const void *in)
out->pNext = (void *)in;
}
+#define FF_VK_EXT_CHAIN(CTX, TGT, STRUCT_P, EXT_FLAG, TYPE) \
+ do { \
+ if ((EXT_FLAG == FF_VK_EXT_NO_FLAG) || \
+ ((CTX)->extensions & EXT_FLAG)) { \
+ (STRUCT_P)->sType = TYPE; \
+ ff_vk_link_struct(TGT, STRUCT_P); \
+ } \
+ } while (0)
+
/* Identity mapping - r = r, b = b, g = g, a = a */
extern const VkComponentMapping ff_comp_identity_map;
--
2.49.0.395.g12beb8f557c
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-04-20 9:03 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-04-20 9:03 [FFmpeg-devel] [PATCH 1/3] vulkan: move feature<->property mapping code outside of hwcontext_vulkan.c Lynne
2025-04-20 9:03 ` [FFmpeg-devel] [PATCH 2/3] vulkan: check that the max number of push descriptors is not exceeded Lynne
2025-04-20 9:03 ` [FFmpeg-devel] [PATCH 3/3] vulkan: move OPT_CHAIN out of hwcontext_vulkan Lynne
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git