Hello,

after hours and hours of searching and trying to get it to work I hope someone here can help me as I'm now out of ideas. I'm trying to build an OpenFX plugin for DaVinci Resolve (a movie color grading software, https://www.blackmagicdesign.com/products) via CMake. Resolve is delivered with a developer sample plugin using a standard Makefile (Mac) and project files for Apple XCode/VisualStudio. But for a better structure I wanted to build a CMake build framework for this plugin.

Notes for better understanding: The CUDA implementation is a proprietary Add On to the OpenSource OpenFX interfaces as far as I understand it. Stock OpenFX would pass memory references only to host memory address space while the Resolve extension passed CUDA/OpenCL addresses to reduce memory transfer overhead for better real time processing. OpenFX plugins are build as bundles of objects(?) (MODULE library build in CMake).

The basic structure is a plugin that offers processing with CPU, OpenCL or CUDA depending on the processing mode the host application is using. This plugin is bundled into a single module library which is loaded by Resolve. For the plugin a few helper classes are used to handle the Plugin metadata (user interface, host communication) while CUDA/OpenCL control code is also seperated into two separate files (OpenCLKernel.cpp and CudaKernel.cu). Both contain the GPU Kernel itselt and a host function which is included in the main Plugin just via extern declaration. Sample:
extern void RunCudaKernel(int p_Width, int p_Height, float* p_Gain, const float* p_Input, float* p_Output);

The Makefile then just compiles all cpp files with the standard $(CXX) compiler and the CudaKernel.cu with $(NVCC) which is defined before. Then a simple
$(CXX) -bundle $^ -o $@ -L${CUDAPATH}/lib -lcuda -lcudart -F/Library/Frameworks -framework CUDA -framework OpenCL
does the linking and works fine.


I tried to replicate this structure of linking in CMake and it works as long as I keep CUDA deactivated (One of the reasons of building a flexible CMake infrastructure is making a few parts configurable via CMake/Compiler options). Most stuff is working now, but I have a problem integrating the CUDA part.

For OpenCL I just build an object library from the OpenCLKernel.cpp and add it as a target object:
add_library(GainLibOpenCL OBJECT OpenCLKernel.cpp)
...
add_library(${PLUGIN_NAME} MODULE src/${PLUGIN_NAME}.cpp $<TARGET_OBJECTS:GainLibOpenCL>)

I tried to replicate this for the CUDA code but cuda_add_library doesn't seem to support generating object files and a combination of cuda_compile + add_library also doesn't allow to generate object files so how do I replicate the Makefile result.

Here are two examples how I tried different methods. Did a few more tests based on many results of questions on the net but non solved my problem.

Variant 1:
 cuda_add_library(GainLibCUDA CudaKernel.cu)
 set(LIBS ${LIBS} GainLibCUDA PARENT_SCOPE)
Will compile but result in a crash of Resolve, with STATIC as an option for cuda_add_library it builds and Resolve stays open, but processing isn't working. And it links to the CUDA static libraries which isn't intended as the host cuda lib should be used.

 cuda_compile(cuda_exec_obj CudaKernel.cu)
 add_library(GainLibCUDA OBJECT CudaKernel.h ${cuda_exec_obj})
set(TARGET_OBJECTS ${TARGET_OBJECTS} $<TARGET_OBJECTS:GainLibCUDA> PARENT_SCOPE)

Results in the error:
CMake Error at src/CUDA/CMakeLists.txt:21 (add_library):
  OBJECT library "GainLibCUDA" contains:

    cuda_compile_1_generated_CudaKernel.cu.o

but may contain only sources that compile, header files, and other files
  that would not affect linking of a normal library.

Also just adding "cuda_compile(cuda_exec_obj CudaKernel.cu)" and then ${cuda_exec_obj} as a file to the "add_library(${PLUGIN_NAME} MODULE ..." line results in and error: "Cannot find source file".

So this mail got pretty long but I hope this helps someone to help me and then also help others if they reach a similar problem.


Kind regards,
Ingmar
--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake

Reply via email to