@@ -275,6 +275,11 @@ set(CPU_BASELINE_FLAGS "")
275
275
set (CPU_BASELINE_FINAL "" )
276
276
set (CPU_DISPATCH_FINAL "" )
277
277
278
+ if (CV_DISABLE_OPTIMIZATION )
279
+ set (CPU_DISPATCH "" )
280
+ set (CPU_DISPATCH_REQUIRE "" )
281
+ endif ()
282
+
278
283
macro (ocv_check_compiler_optimization OPT )
279
284
if (NOT DEFINED CPU_${OPT}_SUPPORTED )
280
285
if ((DEFINED CPU_${OPT}_FLAGS_ON AND NOT "x${CPU_${OPT} _FLAGS_ON}" STREQUAL "x" ) OR CPU_${OPT}_TEST_FILE )
@@ -319,7 +324,7 @@ macro(ocv_check_compiler_optimization OPT)
319
324
endmacro ()
320
325
321
326
foreach (OPT ${CPU_KNOWN_OPTIMIZATIONS} )
322
- set (CPU_${OPT}_USAGE_COUNT 0 CACHE INTERNAL "" FORCE )
327
+ set (CPU_${OPT}_USAGE_COUNT 0 CACHE INTERNAL "" )
323
328
if (NOT DEFINED CPU_${OPT}_FORCE )
324
329
set (CPU_${OPT}_FORCE "${CPU_${OPT} _IMPLIES}" )
325
330
endif ()
@@ -515,15 +520,27 @@ macro(ocv_compiler_optimization_process_sources SOURCES_VAR_NAME LIBS_VAR_NAME T
515
520
endforeach ()
516
521
foreach (fname ${${SOURCES_VAR_NAME}} )
517
522
string (TOLOWER "${fname} " fname_LOWER )
518
- if (fname_LOWER MATCHES "[.]opt_.*[.]cpp$" )
519
- if (CV_DISABLE_OPTIMIZATION OR NOT CV_ENABLE_INTRINSICS )
520
- message (STATUS "Excluding from source files list: ${fname} " )
523
+ if (fname_LOWER MATCHES "\\ .(.*)\\ .cpp$" )
524
+ string (TOUPPER "${CMAKE_MATCH_1} " OPT_ )
525
+ if (OPT_ MATCHES "(CUDA.*|DISPATCH.*|OCL)" ) # don't touch files like filename.cuda.cpp
526
+ list (APPEND __result "${fname} " )
527
+ #continue()
528
+ elseif (CV_DISABLE_OPTIMIZATION OR NOT CV_ENABLE_INTRINSICS )
529
+ message (STATUS "Excluding from source files list (optimization is disabled): ${fname} " )
521
530
#continue()
522
531
else ()
532
+ get_source_file_property (__definitions "${fname} " COMPILE_DEFINITIONS )
533
+ if (__definitions )
534
+ list (APPEND __definitions "CV_CPU_DISPATCH_MODE=${OPT_} " )
535
+ else ()
536
+ set (__definitions "CV_CPU_DISPATCH_MODE=${OPT_} " )
537
+ endif ()
538
+ set_source_files_properties ("${fname} " PROPERTIES COMPILE_DEFINITIONS "${__definitions} " )
539
+
523
540
set (__opt_found 0 )
524
541
foreach (OPT ${CPU_BASELINE_FINAL} )
525
542
string (TOLOWER "${OPT} " OPT_LOWER )
526
- if (fname_LOWER MATCHES "_ ${OPT_LOWER} [.] cpp$" )
543
+ if (fname_LOWER MATCHES "\\ . ${OPT_LOWER} \\ . cpp$" )
527
544
#message("${fname} BASELINE-${OPT}")
528
545
set (__opt_found 1 )
529
546
list (APPEND __result "${fname} " )
@@ -533,11 +550,11 @@ macro(ocv_compiler_optimization_process_sources SOURCES_VAR_NAME LIBS_VAR_NAME T
533
550
foreach (OPT ${CPU_DISPATCH_FINAL} )
534
551
foreach (OPT2 ${CPU_DISPATCH_${OPT}_FORCED} )
535
552
string (TOLOWER "${OPT2} " OPT2_LOWER )
536
- if (fname_LOWER MATCHES "_ ${OPT2_LOWER} [.] cpp$" )
553
+ if (fname_LOWER MATCHES "\\ . ${OPT2_LOWER} \\ . cpp$" )
537
554
list (APPEND __result_${OPT} "${fname} " )
538
555
math (EXPR CPU_${OPT}_USAGE_COUNT "${CPU_${OPT} _USAGE_COUNT}+1" )
539
556
set (CPU_${OPT}_USAGE_COUNT "${CPU_${OPT} _USAGE_COUNT}" CACHE INTERNAL "" FORCE )
540
- #message("${fname} ${OPT}")
557
+ #message("(${CPU_${OPT}_USAGE_COUNT}) ${fname} ${OPT}")
541
558
#message(" ${CPU_DISPATCH_${OPT}_INCLUDED}")
542
559
#message(" ${CPU_DISPATCH_DEFINITIONS_${OPT}}")
543
560
#message(" ${CPU_DISPATCH_FLAGS_${OPT}}")
@@ -573,7 +590,13 @@ macro(ocv_compiler_optimization_process_sources SOURCES_VAR_NAME LIBS_VAR_NAME T
573
590
list (APPEND __result "$<TARGET_OBJECTS:${TARGET_BASE_NAME} _${OPT} >" )
574
591
else ()
575
592
foreach (fname ${__result_${OPT}} )
576
- set_source_files_properties ("${fname} " PROPERTIES COMPILE_DEFINITIONS "${CPU_DISPATCH_DEFINITIONS_${OPT} }" )
593
+ get_source_file_property (__definitions "${fname} " COMPILE_DEFINITIONS )
594
+ if (__definitions )
595
+ list (APPEND __definitions "${CPU_DISPATCH_DEFINITIONS_${OPT} }" )
596
+ else ()
597
+ set (__definitions "${CPU_DISPATCH_DEFINITIONS_${OPT} }" )
598
+ endif ()
599
+ set_source_files_properties ("${fname} " PROPERTIES COMPILE_DEFINITIONS "${__definitions} " )
577
600
set_source_files_properties ("${fname} " PROPERTIES COMPILE_FLAGS "${CPU_DISPATCH_FLAGS_${OPT} }" )
578
601
endforeach ()
579
602
list (APPEND __result ${__result_${OPT}} )
@@ -620,18 +643,25 @@ macro(ocv_compiler_optimization_fill_cpu_config)
620
643
set (OPENCV_CPU_CONTROL_DEFINITIONS_CONFIGMAKE "${OPENCV_CPU_CONTROL_DEFINITIONS_CONFIGMAKE}
621
644
#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_${OPT}
622
645
# define CV_CPU_HAS_SUPPORT_${OPT} 1
623
- # define CV_CPU_CALL_${OPT} (... ) return __VA_ARGS__
646
+ # define CV_CPU_CALL_${OPT} (fn, args ) return (opt_ ${OPT} ::fn args)
624
647
#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_${OPT}
625
648
# define CV_CPU_HAS_SUPPORT_${OPT} (cv::checkHardwareSupport(CV_CPU_${OPT} ))
626
- # define CV_CPU_CALL_${OPT} (... ) if (CV_CPU_HAS_SUPPORT_${OPT} ) return __VA_ARGS__
649
+ # define CV_CPU_CALL_${OPT} (fn, args ) if (CV_CPU_HAS_SUPPORT_${OPT} ) return (opt_ ${OPT} ::fn args)
627
650
#else
628
651
# define CV_CPU_HAS_SUPPORT_${OPT} 0
629
- # define CV_CPU_CALL_${OPT} (... )
652
+ # define CV_CPU_CALL_${OPT} (fn, args )
630
653
#endif
654
+ #define __CV_CPU_DISPATCH_CHAIN_${OPT} (fn, args, mode, ...) CV_CPU_CALL_${OPT} (fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__))
631
655
" )
632
656
endif ()
633
657
endforeach ()
634
658
659
+ set (OPENCV_CPU_CONTROL_DEFINITIONS_CONFIGMAKE "${OPENCV_CPU_CONTROL_DEFINITIONS_CONFIGMAKE}
660
+ #define CV_CPU_CALL_BASELINE(fn, args) return (cpu_baseline::fn args)
661
+ #define __CV_CPU_DISPATCH_CHAIN_BASELINE(fn, args, mode, ...) CV_CPU_CALL_BASELINE(fn, args) /* last in sequence */
662
+ " )
663
+
664
+
635
665
set (__file "${CMAKE_SOURCE_DIR} /modules/core/include/opencv2/core/cv_cpu_helper.h" )
636
666
if (EXISTS "${__file} " )
637
667
file (READ "${__file} " __content )
@@ -644,6 +674,57 @@ macro(ocv_compiler_optimization_fill_cpu_config)
644
674
endif ()
645
675
endmacro ()
646
676
677
+ macro (ocv_add_dispatched_file filename )
678
+ if (NOT OPENCV_INITIAL_PASS )
679
+ set (__codestr "
680
+ #include \" precomp.hpp\"
681
+ #include \" ${filename} .simd.hpp\"
682
+ " )
683
+
684
+ set (__declarations_str "#define CV_CPU_SIMD_FILENAME \" ${filename} .simd.hpp\" " )
685
+ set (__dispatch_modes "BASELINE" )
686
+
687
+ set (__optimizations "${ARGN} " )
688
+ if (CV_DISABLE_OPTIMIZATION OR NOT CV_ENABLE_INTRINSICS )
689
+ set (__optimizations "" )
690
+ endif ()
691
+
692
+ foreach (OPT ${__optimizations} )
693
+ string (TOLOWER "${OPT} " OPT_LOWER )
694
+ set (__file "${CMAKE_CURRENT_BINARY_DIR} /${filename} .${OPT_LOWER} .cpp" )
695
+ if (EXISTS "${__file} " )
696
+ file (READ "${__file} " __content )
697
+ endif ()
698
+ if (__content STREQUAL __codestr )
699
+ #message(STATUS "${__file} contains up-to-date content")
700
+ else ()
701
+ file (WRITE "${__file} " "${__codestr} " )
702
+ endif ()
703
+ list (APPEND OPENCV_MODULE_${the_module}_SOURCES_DISPATCHED "${__file} " )
704
+
705
+ set (__declarations_str "${__declarations_str}
706
+ #define CV_CPU_DISPATCH_MODE ${OPT}
707
+ #include \" opencv2/core/private/cv_cpu_include_simd_declarations.hpp\"
708
+ " )
709
+ set (__dispatch_modes "${OPT} , ${__dispatch_modes} " )
710
+ endforeach ()
711
+
712
+ set (__declarations_str "${__declarations_str}
713
+ #define CV_CPU_DISPATCH_MODES_ALL ${__dispatch_modes}
714
+ " )
715
+
716
+ set (__file "${CMAKE_CURRENT_BINARY_DIR} /${filename} .simd_declarations.hpp" )
717
+ if (EXISTS "${__file} " )
718
+ file (READ "${__file} " __content )
719
+ endif ()
720
+ if (__content STREQUAL __declarations_str )
721
+ #message(STATUS "${__file} contains up-to-date content")
722
+ else ()
723
+ file (WRITE "${__file} " "${__declarations_str} " )
724
+ endif ()
725
+ endif ()
726
+ endmacro ()
727
+
647
728
if (CV_DISABLE_OPTIMIZATION OR CV_ICC )
648
729
ocv_update (CV_ENABLE_UNROLLED 0 )
649
730
else ()
0 commit comments