diff mbox series

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

Message ID AS8P250MB074430566E78C1A9A94DB5288F5C2@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM
State Accepted
Commit 0a05577d1e2f3ac2729fd1a96cbef352df20366a
Headers show
Series [FFmpeg-devel,1/8] avutil/vulkan: Don't autoinclude vulkan_loader.h | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Andreas Rheinhardt March 3, 2024, 6:42 p.m. UTC
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@outlook.com>
---
 libavutil/vulkan_loader.h | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)
diff mbox series

Patch

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;
 }