cmake_minimum_required (VERSION 3.17)

# Common OpenCL options
if (SUPPORT_OPENCL_GPU)
	set(CTRL_EXAMPLES_OPENCL_GPU_PROFILING OFF) # Profiling with this
	set(CTRL_EXAMPLES_OPENCL_GPU_ERROR_CHECK ON) # Check errors with this
	set(CTRL_EXAMPLES_OPENCL_GPU_DEBUG OFF) # Debug whit this
	set(CTRL_EXAMPLES_OPENCL_GPU_GENERATE_VISUAL_PROFILER OFF) # Complete ifo about events
	set(CTRL_EXAMPLES_OPENCL_GPU_LOCAL_SIZE_0 "16") # Localsize 0
	set(CTRL_EXAMPLES_OPENCL_GPU_LOCAL_SIZE_1 "16") # Localsize 1
	set(CTRL_EXAMPLES_OPENCL_GPU_LOCAL_SIZE_2 "0") # Localsize 0
endif (SUPPORT_OPENCL_GPU)

if (SUPPORT_CUDA)
	set(CTRL_EXAMPLES_CUDA_ERROR_CHECK OFF) # Check errors with this
	set(CTRL_EXAMPLES_CUDA_DEBUG OFF) # Debug with this
	set(CTRL_EXAMPLES_CUDA_BLOCKSIZE_0 "16") # Block Size 0
	set(CTRL_EXAMPLES_CUDA_BLOCKSIZE_1 "16") # Block Size 1
	set(CTRL_EXAMPLES_CUDA_BLOCKSIZE_2 "0") # Block Size 1
endif(SUPPORT_CUDA)

# Apply options
if (CTRL_EXAMPLES_OPENCL_GPU_ERROR_CHECK)
	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_EXAMPLES_OPENCL_GPU_ERROR_CHECK_ ")
	set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_EXAMPLES_OPENCL_GPU_ERROR_CHECK_ ")
endif (CTRL_EXAMPLES_OPENCL_GPU_ERROR_CHECK)

if (CTRL_EXAMPLES_OPENCL_GPU_PROFILING)
	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_EXAMPLES_OPENCL_GPU_PROFILING_ ")
	set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_EXAMPLES_OPENCL_GPU_PROFILING_ ")
endif (CTRL_EXAMPLES_OPENCL_GPU_PROFILING)

if (CTRL_EXAMPLES_OPENCL_GPU_DEBUG)
	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_EXAMPLES_OPENCL_GPU_DEBUG_ ")
	set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_EXAMPLES_OPENCL_GPU_DEBUG_ ")
endif (CTRL_EXAMPLES_OPENCL_GPU_DEBUG)

if (CTRL_EXAMPLES_OPENCL_GPU_GENERATE_VISUAL_PROFILER)
	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_EXAMPLES_OPENCL_GPU_GENERATE_VISUAL_PROFILER_ ")
	set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_EXAMPLES_OPENCL_GPU_GENERATE_VISUAL_PROFILER_ ")
endif (CTRL_EXAMPLES_OPENCL_GPU_GENERATE_VISUAL_PROFILER)

if (SUPPORT_OPENCL_GPU)
	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DLOCAL_SIZE_0=${CTRL_EXAMPLES_OPENCL_GPU_LOCAL_SIZE_0} -DLOCAL_SIZE_1=${CTRL_EXAMPLES_OPENCL_GPU_LOCAL_SIZE_1} -DLOCAL_SIZE_2=${CTRL_EXAMPLES_OPENCL_GPU_LOCAL_SIZE_2} ")
	set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -DLOCAL_SIZE_0=${CTRL_EXAMPLES_OPENCL_GPU_LOCAL_SIZE_0} -DLOCAL_SIZE_1=${CTRL_EXAMPLES_OPENCL_GPU_LOCAL_SIZE_1} -DLOCAL_SIZE_2=${CTRL_EXAMPLES_OPENCL_GPU_LOCAL_SIZE_2} ")
endif(SUPPORT_OPENCL_GPU)

if (CTRL_EXAMPLES_CUDA_ERROR_CHECK)
	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_EXAMPLES_CUDA_ERROR_CHECK_ ")
	set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_EXAMPLES_CUDA_ERROR_CHECK_ ")
endif (CTRL_EXAMPLES_CUDA_ERROR_CHECK)

if (CTRL_EXAMPLES_CUDA_DEBUG)
	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_EXAMPLES_CUDA_DEBUG_ ")
	set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_EXAMPLES_CUDA_DEBUG_ ")
endif (CTRL_EXAMPLES_CUDA_DEBUG)

if (SUPPORT_CUDA)
	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBLOCKSIZE_0=${CTRL_EXAMPLES_CUDA_BLOCKSIZE_0} -DBLOCKSIZE_1=${CTRL_EXAMPLES_CUDA_BLOCKSIZE_1} -DBLOCKSIZE_2=${CTRL_EXAMPLES_CUDA_BLOCKSIZE_2} ")
	set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -DBLOCKSIZE_0=${CTRL_EXAMPLES_CUDA_BLOCKSIZE_0} -DBLOCKSIZE_1=${CTRL_EXAMPLES_CUDA_BLOCKSIZE_1} -DBLOCKSIZE_2=${CTRL_EXAMPLES_CUDA_BLOCKSIZE_2} ")
	set(CUDA_PROPAGATE_HOST_FLAGS ON)
endif(SUPPORT_CUDA)

# Verbose
if (CTRL_CMAKE_VERBOSE_EXAMPLES_MATRIX_ADD)
	message(STATUS "MATRIX_ADD_INCLUDE DIRS = ${CTRL_INCLUDE_DIRS}")
	message(STATUS "MATRIX_ADD_LIBS = ${CTRL_LIBS}")
	message(STATUS "MATRIX_ADD_CTRL_C vars = ${CMAKE_C_FLAGS}")
	message(STATUS "MATRIX_ADD_CTRL_CUDA vars = ${CMAKE_CUDA_FLAGS}")
endif(CTRL_CMAKE_VERBOSE_EXAMPLES_MATRIX_ADD)

# Include directories
include_directories(${CTRL_INCLUDE_DIRS})

# Cpu
if (SUPPORT_CPU)
	add_executable(Matrix_Add_Cpu_Ctrl src/Matrix_Add_Cpu_Ctrl.c)
	target_link_libraries(Matrix_Add_Cpu_Ctrl ${CTRL_LIBS})
endif (SUPPORT_CPU)

# Cuda
if (SUPPORT_CUDA)
	add_executable(Matrix_Add_Cuda_Ref src/Matrix_Add_Cuda_Ref.cu)
	target_link_libraries(Matrix_Add_Cuda_Ref ${CTRL_LIBS})
	
	add_executable(Matrix_Add_Cuda_Ctrl src/Matrix_Add_Cuda_Ctrl.c src/Matrix_Add_Cuda_Ctrl_Kernels.cu)
	target_link_libraries(Matrix_Add_Cuda_Ctrl ${CTRL_LIBS})
endif(SUPPORT_CUDA)

# OpenCl
if (SUPPORT_OPENCL_GPU)
	add_executable(Matrix_Add_OpenCL_Gpu_Ref src/Matrix_Add_OpenCL_Gpu_Ref.c)
	add_executable(Matrix_Add_OpenCL_Gpu_Ctrl src/Matrix_Add_OpenCL_Gpu_Ctrl.c)

	target_link_libraries(Matrix_Add_OpenCL_Gpu_Ref ${CTRL_LIBS})
	target_link_libraries(Matrix_Add_OpenCL_Gpu_Ctrl ${CTRL_LIBS})
endif (SUPPORT_OPENCL_GPU)
