This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit e844b43776fa73e9e36624b770889e93fa667297
Author:     Lynne <[email protected]>
AuthorDate: Thu Jan 8 23:23:03 2026 +0100
Commit:     Lynne <[email protected]>
CommitDate: Mon Jan 12 17:28:41 2026 +0100

    vulkan: support shader compression
---
 .gitignore         |  1 +
 configure          |  2 +-
 ffbuild/common.mak | 12 ++++++++++--
 libavutil/vulkan.c | 23 ++++++++++++++++++++++-
 4 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/.gitignore b/.gitignore
index 8fb1c924ee..1065ae1e72 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,6 +25,7 @@
 *.metallib.c
 *.spv
 *.spv.c
+*.spv.gz
 *.ptx
 *.ptx.c
 *.ptx.gz
diff --git a/configure b/configure
index 92c97f4bd8..5a4fa45cf7 100755
--- a/configure
+++ b/configure
@@ -4246,7 +4246,7 @@ avfilter_deps="avutil"
 avfilter_suggest="libm stdatomic spirv_library"
 avformat_deps="avcodec avutil"
 avformat_suggest="libm network zlib stdatomic"
-avutil_suggest="clock_gettime ffnvcodec gcrypt libm libdrm libmfx opencl 
openssl user32 vaapi vulkan videotoolbox corefoundation corevideo coremedia 
bcrypt stdatomic"
+avutil_suggest="clock_gettime ffnvcodec gcrypt libm zlib libdrm libmfx opencl 
openssl user32 vaapi vulkan videotoolbox corefoundation corevideo coremedia 
bcrypt stdatomic"
 swresample_deps="avutil"
 swresample_suggest="libm libsoxr stdatomic"
 swscale_deps="avutil"
diff --git a/ffbuild/common.mak b/ffbuild/common.mak
index ccf42b9fd1..06d6f39715 100644
--- a/ffbuild/common.mak
+++ b/ffbuild/common.mak
@@ -134,8 +134,16 @@ RUN_MINIFY = $(M)sed 's!/\\*.*\\*/!!g' $< | tr '\n' ' ' | 
tr -s ' ' | sed 's/^ /
 %.spv: %.glsl
        $(COMPILE_GLSLC)
 
+ifdef CONFIG_SHADER_COMPRESSION
+%.spv.gz: %.spv
+       $(RUN_GZIP)
+
+%.spv.c: %.spv.gz $(BIN2CEXE)
+       $(RUN_BIN2C)
+else
 %.spv.c: %.spv $(BIN2CEXE)
        $(RUN_BIN2C)
+endif
 
 %.metal.air: %.metal
        $(METALCC) $< -o $@
@@ -239,7 +247,7 @@ SPVOBJS      = $(filter %.spv.o,$(OBJS))
 PTXOBJS      = $(filter %.ptx.o,$(OBJS))
 $(HOBJS):     CCFLAGS += $(CFLAGS_HEADERS)
 checkheaders: $(HOBJS)
-.SECONDARY:   $(HOBJS:.o=.c) $(SPVOBJS:.o=.c) $(SPVOBJS:.o=) $(PTXOBJS:.o=.c) 
$(PTXOBJS:.o=.gz) $(PTXOBJS:.o=)
+.SECONDARY:   $(HOBJS:.o=.c) $(SPVOBJS:.o=.c) $(SPVOBJS:.o=.gz) $(SPVOBJS:.o=) 
$(PTXOBJS:.o=.c) $(PTXOBJS:.o=.gz) $(PTXOBJS:.o=)
 alltools: $(TOOLS)
 
 $(HOSTOBJS): %.o: %.c
@@ -258,7 +266,7 @@ $(TOOLOBJS): | tools
 
 OUTDIRS := $(OUTDIRS) $(dir $(OBJS) $(HOBJS) $(HOSTOBJS) $(SHLIBOBJS) 
$(STLIBOBJS) $(TESTOBJS))
 
-CLEANSUFFIXES     = *.d *.gcda *.gcno *.h.c *.ho *.map *.o *.objs *.pc *.ptx 
*.ptx.gz *.ptx.c *.spv *.spv.c *.ver *.version *.html.gz *.html.c *.css.min.gz 
*.css.min *.css.c  *$(DEFAULT_X86ASMD).asm *~ *.ilk *.pdb
+CLEANSUFFIXES     = *.d *.gcda *.gcno *.h.c *.ho *.map *.o *.objs *.pc *.ptx 
*.ptx.gz *.ptx.c *.spv *.spv.gz *.spv.c *.ver *.version *.html.gz *.html.c 
*.css.min.gz *.css.min *.css.c  *$(DEFAULT_X86ASMD).asm *~ *.ilk *.pdb
 LIBSUFFIXES       = *.a *.lib *.so *.so.* *.dylib *.dll *.def *.dll.a
 
 define RULES
diff --git a/libavutil/vulkan.c b/libavutil/vulkan.c
index 59d25db8f0..b6abcc8abb 100644
--- a/libavutil/vulkan.c
+++ b/libavutil/vulkan.c
@@ -18,12 +18,17 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "config.h"
 #include "avassert.h"
 #include "mem.h"
 
 #include "vulkan.h"
 #include "libavutil/vulkan_loader.h"
 
+#if CONFIG_SHADER_COMPRESSION
+#include "libavutil/zlib_utils.h"
+#endif
+
 const VkComponentMapping ff_comp_identity_map = {
     .r = VK_COMPONENT_SWIZZLE_IDENTITY,
     .g = VK_COMPONENT_SWIZZLE_IDENTITY,
@@ -2388,7 +2393,7 @@ int ff_vk_shader_link(FFVulkanContext *s, FFVulkanShader 
*shd,
     FFVulkanFunctions *vk = &s->vkfn;
     VkSpecializationMapEntry spec_entries[3];
     VkSpecializationInfo spec_info;
-    size_t binary_size = 0;
+    size_t input_size = spirv_len, binary_size = 0;
 
     if (shd->precompiled) {
         if (!shd->specialization_info) {
@@ -2414,6 +2419,16 @@ int ff_vk_shader_link(FFVulkanContext *s, FFVulkanShader 
*shd,
         memcpy(&spd[shd->specialization_info->dataSize],
                shd->lg_size, 3*sizeof(uint32_t));
         shd->specialization_info->dataSize += 3*sizeof(uint32_t);
+
+#if CONFIG_SHADER_COMPRESSION
+        uint8_t *out;
+        size_t out_len;
+        int ret = ff_zlib_expand(s, &out, &out_len, spirv, spirv_len);
+        if (ret < 0)
+            return ret;
+        spirv = out;
+        spirv_len = out_len;
+#endif
     }
 
     err = init_descriptors(s, shd);
@@ -2462,6 +2477,8 @@ int ff_vk_shader_link(FFVulkanContext *s, FFVulkanShader 
*shd,
     else
         av_log(s, AV_LOG_VERBOSE, "Shader linked, size:");
 
+    if (input_size != spirv_len)
+        av_log(s, AV_LOG_VERBOSE, " %zu compressed,", input_size);
     av_log(s, AV_LOG_VERBOSE, " %zu SPIR-V", spirv_len);
     if (binary_size != spirv_len)
         av_log(s, AV_LOG_VERBOSE, ", %zu binary", spirv_len);
@@ -2472,6 +2489,10 @@ end:
         shd->specialization_info->mapEntryCount -= 3;
         shd->specialization_info->dataSize -= 3*sizeof(uint32_t);
     }
+#if CONFIG_SHADER_COMPRESSION
+    if (shd->precompiled)
+        av_free((void *)spirv);
+#endif
     return err;
 }
 

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to