You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	build: add support for building .cu files via nvcc
Original work by Yogender Gupta <ygupta@nvidia.com>
This commit is contained in:
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -19,6 +19,8 @@ | ||||
| *.swp | ||||
| *.ver | ||||
| *.version | ||||
| *.ptx | ||||
| *.ptx.c | ||||
| *_g | ||||
| \#* | ||||
| .\#* | ||||
|   | ||||
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @@ -11,6 +11,8 @@ vpath %.asm  $(SRC_PATH) | ||||
| vpath %.rc   $(SRC_PATH) | ||||
| vpath %.v    $(SRC_PATH) | ||||
| vpath %.texi $(SRC_PATH) | ||||
| vpath %.cu   $(SRC_PATH) | ||||
| vpath %.ptx  $(SRC_PATH) | ||||
| vpath %/fate_config.sh.template $(SRC_PATH) | ||||
|  | ||||
| AVPROGS-$(CONFIG_FFMPEG)   += ffmpeg | ||||
|   | ||||
							
								
								
									
										36
									
								
								compat/cuda/ptx2c.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								compat/cuda/ptx2c.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | ||||
| # Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved. | ||||
| # | ||||
| # Permission is hereby granted, free of charge, to any person obtaining a | ||||
| # copy of this software and associated documentation files (the "Software"), | ||||
| # to deal in the Software without restriction, including without limitation | ||||
| # the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||||
| # and/or sell copies of the Software, and to permit persons to whom the | ||||
| # Software is furnished to do so, subject to the following conditions: | ||||
| # | ||||
| # The above copyright notice and this permission notice shall be included in | ||||
| # all copies or substantial portions of the Software. | ||||
| # | ||||
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL | ||||
| # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||||
| # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | ||||
| # DEALINGS IN THE SOFTWARE. | ||||
|  | ||||
| set -e | ||||
|  | ||||
| OUT="$1" | ||||
| IN="$2" | ||||
| NAME="$(basename "$IN")" | ||||
| NAME="${NAME/.ptx/}" | ||||
|  | ||||
| echo -n "const char ${NAME}_ptx[] = \\" > "$OUT" | ||||
| while read LINE | ||||
| do | ||||
| echo -ne "\n\t\"$LINE\\\n\"" >> "$OUT" | ||||
| done < "$IN" | ||||
| echo ";" >> "$OUT" | ||||
|  | ||||
| exit 0 | ||||
|  | ||||
							
								
								
									
										24
									
								
								configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								configure
									
									
									
									
										vendored
									
									
								
							| @@ -338,6 +338,7 @@ Toolchain options: | ||||
|   --cxx=CXX                use C compiler CXX [$cxx_default] | ||||
|   --objcc=OCC              use ObjC compiler OCC [$cc_default] | ||||
|   --dep-cc=DEPCC           use dependency generator DEPCC [$cc_default] | ||||
|   --nvcc=NVCC              use Nvidia CUDA compiler NVCC [$nvcc_default] | ||||
|   --ld=LD                  use linker LD [$ld_default] | ||||
|   --pkg-config=PKGCONFIG   use pkg-config tool PKGCONFIG [$pkg_config_default] | ||||
|   --pkg-config-flags=FLAGS pass additional flags to pkgconf [] | ||||
| @@ -359,6 +360,7 @@ Toolchain options: | ||||
|   --extra-libs=ELIBS       add ELIBS [$ELIBS] | ||||
|   --extra-version=STRING   version string suffix [] | ||||
|   --optflags=OPTFLAGS      override optimization-related compiler flags | ||||
|   --nvccflags=NVCCFLAGS    override nvcc flags [$nvccflags_default] | ||||
|   --build-suffix=SUFFIX    library name suffix [] | ||||
|   --enable-pic             build position-independent code | ||||
|   --enable-thumb           compile for Thumb instruction set | ||||
| @@ -2221,6 +2223,7 @@ CMDLINE_SET=" | ||||
|     malloc_prefix | ||||
|     nm | ||||
|     optflags | ||||
|     nvccflags | ||||
|     pkg_config | ||||
|     pkg_config_flags | ||||
|     progs_suffix | ||||
| @@ -2719,6 +2722,7 @@ vaapi_encode_deps="vaapi" | ||||
|  | ||||
| hwupload_cuda_filter_deps="cuda" | ||||
| scale_npp_filter_deps="cuda_sdk libnpp" | ||||
| scale_cuda_filter_deps="cuda_sdk" | ||||
|  | ||||
| nvenc_deps="cuda" | ||||
| nvenc_deps_any="dlopen LoadLibrary" | ||||
| @@ -3261,6 +3265,8 @@ strip_default="strip" | ||||
| version_script='--version-script' | ||||
| yasmexe_default="yasm" | ||||
| windres_default="windres" | ||||
| nvcc_default="nvcc" | ||||
| nvccflags_default="-gencode arch=compute_30,code=sm_30 -O2" | ||||
|  | ||||
| # OS | ||||
| target_os_default=$(tolower $(uname -s)) | ||||
| @@ -3334,6 +3340,8 @@ HOSTCC_C='-c' | ||||
| HOSTCC_E='-E -o $@' | ||||
| HOSTCC_O='-o $@' | ||||
| HOSTLD_O='-o $@' | ||||
| NVCC_C='-c' | ||||
| NVCC_O='-o $@' | ||||
|  | ||||
| host_extralibs='-lm' | ||||
| host_cflags_filter=echo | ||||
| @@ -3721,7 +3729,7 @@ windres_default="${cross_prefix}${windres_default}" | ||||
| sysinclude_default="${sysroot}/usr/include" | ||||
|  | ||||
| set_default arch cc cxx doxygen pkg_config ranlib strip sysinclude \ | ||||
|     target_exec target_os yasmexe | ||||
|     target_exec target_os yasmexe nvcc | ||||
| enabled cross_compile || host_cc_default=$cc | ||||
| set_default host_cc | ||||
|  | ||||
| @@ -6241,6 +6249,16 @@ if [ -z "$optflags" ]; then | ||||
|     fi | ||||
| fi | ||||
|  | ||||
| if [ -z "$nvccflags" ]; then | ||||
|     nvccflags=$nvccflags_default | ||||
| fi | ||||
|  | ||||
| if enabled x86_64 || enabled ppc64 || enabled aarch64; then | ||||
|     nvccflags="$nvccflags -m64" | ||||
| else | ||||
|     nvccflags="$nvccflags -m32" | ||||
| fi | ||||
|  | ||||
| check_optflags(){ | ||||
|     check_cflags "$@" | ||||
|     enabled lto && check_ldflags "$@" | ||||
| @@ -6704,6 +6722,7 @@ ARFLAGS=$arflags | ||||
| AR_O=$ar_o | ||||
| RANLIB=$ranlib | ||||
| STRIP=$strip | ||||
| NVCC=$nvcc | ||||
| CP=cp -p | ||||
| LN_S=$ln_s | ||||
| CPPFLAGS=$CPPFLAGS | ||||
| @@ -6711,6 +6730,7 @@ CFLAGS=$CFLAGS | ||||
| CXXFLAGS=$CXXFLAGS | ||||
| OBJCFLAGS=$OBJCFLAGS | ||||
| ASFLAGS=$ASFLAGS | ||||
| NVCCFLAGS=$nvccflags | ||||
| AS_C=$AS_C | ||||
| AS_O=$AS_O | ||||
| OBJCC_C=$OBJCC_C | ||||
| @@ -6721,6 +6741,8 @@ CC_E=$CC_E | ||||
| CC_O=$CC_O | ||||
| CXX_C=$CXX_C | ||||
| CXX_O=$CXX_O | ||||
| NVCC_C=$NVCC_C | ||||
| NVCC_O=$NVCC_O | ||||
| LD_O=$LD_O | ||||
| LD_LIB=$LD_LIB | ||||
| LD_PATH=$LD_PATH | ||||
|   | ||||
| @@ -15,7 +15,7 @@ ifndef SUBDIR | ||||
| ifndef V | ||||
| Q      = @ | ||||
| ECHO   = printf "$(1)\t%s\n" $(2) | ||||
| BRIEF  = CC CXX OBJCC HOSTCC HOSTLD AS YASM AR LD STRIP CP WINDRES | ||||
| BRIEF  = CC CXX OBJCC HOSTCC HOSTLD AS YASM AR LD STRIP CP WINDRES NVCC | ||||
| SILENT = DEPCC DEPHOSTCC DEPAS DEPYASM RANLIB RM | ||||
|  | ||||
| MSG    = $@ | ||||
| @@ -38,6 +38,7 @@ OBJCCFLAGS  = $(CPPFLAGS) $(CFLAGS) $(OBJCFLAGS) | ||||
| ASFLAGS    := $(CPPFLAGS) $(ASFLAGS) | ||||
| CXXFLAGS   := $(CPPFLAGS) $(CFLAGS) $(CXXFLAGS) | ||||
| YASMFLAGS  += $(IFLAGS:%=%/) -Pconfig.asm | ||||
| NVCCFLAGS  += -ptx | ||||
|  | ||||
| HOSTCCFLAGS = $(IFLAGS) $(HOSTCPPFLAGS) $(HOSTCFLAGS) | ||||
| LDFLAGS    := $(ALLFFLIBS:%=$(LD_PATH)lib%) $(LDFLAGS) | ||||
| @@ -52,6 +53,7 @@ COMPILE_CXX = $(call COMPILE,CXX) | ||||
| COMPILE_S = $(call COMPILE,AS) | ||||
| COMPILE_M = $(call COMPILE,OBJCC) | ||||
| COMPILE_HOSTC = $(call COMPILE,HOSTCC) | ||||
| COMPILE_NVCC = $(call COMPILE,NVCC) | ||||
|  | ||||
| %.o: %.c | ||||
| 	$(COMPILE_C) | ||||
| @@ -89,6 +91,12 @@ COMPILE_HOSTC = $(call COMPILE,HOSTCC) | ||||
| %.h.c: | ||||
| 	$(Q)echo '#include "$*.h"' >$@ | ||||
|  | ||||
| %.ptx: %.cu | ||||
| 	$(COMPILE_NVCC) | ||||
|  | ||||
| %.ptx.c: %.ptx | ||||
| 	$(Q)sh $(SRC_PATH)/compat/cuda/ptx2c.sh $@ $(patsubst $(SRC_PATH)/%,$(SRC_LINK)/%,$<) | ||||
|  | ||||
| %.c %.h %.pc %.ver %.version: TAG = GEN | ||||
|  | ||||
| # Dummy rule to stop make trying to rebuild removed or renamed headers | ||||
| @@ -133,9 +141,10 @@ ALLHEADERS := $(subst $(SRC_DIR)/,$(SUBDIR),$(wildcard $(SRC_DIR)/*.h $(SRC_DIR) | ||||
| SKIPHEADERS += $(ARCH_HEADERS:%=$(ARCH)/%) $(SKIPHEADERS-) | ||||
| SKIPHEADERS := $(SKIPHEADERS:%=$(SUBDIR)%) | ||||
| HOBJS        = $(filter-out $(SKIPHEADERS:.h=.h.o),$(ALLHEADERS:.h=.h.o)) | ||||
| PTXOBJS      = $(filter %.ptx.o,$(OBJS)) | ||||
| $(HOBJS):     CCFLAGS += $(CFLAGS_HEADERS) | ||||
| checkheaders: $(HOBJS) | ||||
| .SECONDARY:   $(HOBJS:.o=.c) | ||||
| .SECONDARY:   $(HOBJS:.o=.c) $(PTXOBJS:.o=.c) $(PTXOBJS:.o=) | ||||
|  | ||||
| alltools: $(TOOLS) | ||||
|  | ||||
| @@ -154,7 +163,7 @@ $(TOOLOBJS): | tools | ||||
|  | ||||
| OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOBJS) $(HOSTOBJS) $(SLIBOBJS) $(TESTOBJS)) | ||||
|  | ||||
| CLEANSUFFIXES     = *.d *.o *~ *.h.c *.gcda *.gcno *.map *.ver *.version *.ho *$(DEFAULT_YASMD).asm | ||||
| CLEANSUFFIXES     = *.d *.o *~ *.h.c *.gcda *.gcno *.map *.ver *.version *.ho *$(DEFAULT_YASMD).asm *.ptx *.ptx.c | ||||
| DISTCLEANSUFFIXES = *.pc | ||||
| LIBSUFFIXES       = *.a *.lib *.so *.so.* *.dylib *.dll *.def *.dll.a | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user