[FFmpeg-devel] [PATCH 4/8] avutil/vulkan_loader: Avoid relocations for strings

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Sun Mar 3 20:42:46 EET 2024


To do so, concatenate all the names together to one big string
name1\0name2\0....lastname\0\0. This avoids the pointer in
the FunctionLoadInfo structure and thereby moves vk_load_info
into .rodata (and makes it smaller by 888B).

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
---
 libavutil/vulkan_loader.h | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/libavutil/vulkan_loader.h b/libavutil/vulkan_loader.h
index 37ce339e1d..f9e739e1e3 100644
--- a/libavutil/vulkan_loader.h
+++ b/libavutil/vulkan_loader.h
@@ -31,7 +31,6 @@
         req_dev,                                         \
         offsetof(FFVulkanFunctions, name),               \
         ext_flag,                                        \
-        "vk"#name,                                       \
     },
 
 static inline uint64_t ff_vk_extensions_to_mask(const char * const *extensions,
@@ -101,18 +100,26 @@ static inline int ff_vk_load_functions(AVHWDeviceContext *ctx,
         char req_dev;
         uint16_t struct_offset;
         FFVulkanExtensions ext_flag;
-        const char *name;
     } vk_load_info[] = {
         FN_LIST(PFN_LOAD_INFO)
 #ifdef _WIN32
         FN_LIST_WIN32(PFN_LOAD_INFO)
 #endif
     };
+    // Concatenate the names to avoid relocations. The resulting string
+    // will end with \0\0
+#define FUNC_NAME(req_inst, req_dev, ext_flag, name) "vk"#name"\0"
+    const char *name =
+        FN_LIST(FUNC_NAME)
+#ifdef _WIN32
+        FN_LIST_WIN32(FUNC_NAME)
+#endif
+    ;
+#undef FUNC_NAME
 
-    for (int i = 0; i < FF_ARRAY_ELEMS(vk_load_info); i++) {
+    for (int i = 0; i < FF_ARRAY_ELEMS(vk_load_info); name += strlen(name) + 1, i++) {
         const struct FunctionLoadInfo *load = &vk_load_info[i];
         static const char extensions[][4] = { "", "EXT", "KHR" };
-        const char *name = load->name;
         PFN_vkVoidFunction fn;
 
         if (load->req_dev  && !has_dev)
@@ -146,6 +153,7 @@ static inline int ff_vk_load_functions(AVHWDeviceContext *ctx,
 
         *(PFN_vkVoidFunction *)((uint8_t *)vk + load->struct_offset) = fn;
     }
+    av_assert1(*name == '\0');
 
     return 0;
 }
-- 
2.40.1



More information about the ffmpeg-devel mailing list