From c21ff9e6c2710155251542d1062a7bd1cbc6a258 Mon Sep 17 00:00:00 2001 From: Piero Toffanin Date: Thu, 26 May 2022 19:49:18 +0000 Subject: [PATCH] Detect OpenMVS CUDA build --- opendm/config.py | 12 ++++++------ opendm/system.py | 7 +++++-- stages/openmvs.py | 23 +++++++++++++++++++++-- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/opendm/config.py b/opendm/config.py index ed5ace94..30ad5e79 100755 --- a/opendm/config.py +++ b/opendm/config.py @@ -156,12 +156,6 @@ def config(argv=None, parser=None): 'Can be one of: %(choices)s. Default: ' '%(default)s')) - parser.add_argument('--3d-tiles', - action=StoreTrue, - nargs=0, - default=False, - help='Generate OGC 3D Tiles outputs. Default: %(default)s') - parser.add_argument('--matcher-neighbors', metavar='', action=StoreValue, @@ -614,6 +608,12 @@ def config(argv=None, parser=None): 'suitable for viewers like Leaflet or OpenLayers. ' 'Default: %(default)s') + parser.add_argument('--3d-tiles', + action=StoreTrue, + nargs=0, + default=False, + help='Generate OGC 3D Tiles outputs. Default: %(default)s') + parser.add_argument('--build-overviews', action=StoreTrue, nargs=0, diff --git a/opendm/system.py b/opendm/system.py index bf5f279a..d067f237 100644 --- a/opendm/system.py +++ b/opendm/system.py @@ -65,7 +65,7 @@ def sighandler(signum, frame): signal.signal(signal.SIGINT, sighandler) signal.signal(signal.SIGTERM, sighandler) -def run(cmd, env_paths=[context.superbuild_bin_path], env_vars={}, packages_paths=context.python_packages_paths): +def run(cmd, env_paths=[context.superbuild_bin_path], env_vars={}, packages_paths=context.python_packages_paths, on_output=None): """Run a system command""" global running_subprocesses @@ -89,7 +89,10 @@ def run(cmd, env_paths=[context.superbuild_bin_path], env_vars={}, packages_path running_subprocesses.append(p) lines = deque() for line in io.TextIOWrapper(p.stdout): - print(line, end="") + if on_output is not None: + on_output(line) + else: + print(line, end="") lines.append(line.strip()) if len(lines) == 11: diff --git a/stages/openmvs.py b/stages/openmvs.py index 9ea5b49c..6547aea0 100644 --- a/stages/openmvs.py +++ b/stages/openmvs.py @@ -12,6 +12,23 @@ from opendm.osfm import OSFMContext from opendm.multispectral import get_primary_band_name from opendm.point_cloud import fast_merge_ply +def check_built_with_cuda(): + # Little hack to see if OpenMVS was built with CUDA.. + cuda_build = False + try: + def on_output(line): + global cuda_build + if "--cuda-device arg" in line: + cuda_build = True + + system.run('"%s" --help' % context.omvs_densify_path, on_output=on_output) + return cuda_build + except system.SubprocessException as e: + return cuda_build # OpenMVS returns 1 on --help + except Exception as e: + log.ODM_WARNING("Cannot detect if OpenMVS was built with CUDA (assuming no): %s" % str(e)) + return False + class ODMOpenMVSStage(types.ODM_Stage): def process(self, args, outputs): # get inputs @@ -75,8 +92,10 @@ class ODMOpenMVSStage(types.ODM_Stage): ] gpu_config = [] + omvs_cuda = check_built_with_cuda() + log.ODM_INFO("OpenMVS built with CUDA support: %s" % ("YES" if omvs_cuda else "NO")) - if not has_gpu(): + if (not has_gpu()) and omvs_cuda: gpu_config.append("--cuda-device -2") if args.pc_tile: @@ -99,7 +118,7 @@ class ODMOpenMVSStage(types.ODM_Stage): except system.SubprocessException as e: # If the GPU was enabled and the program failed, # try to run it again without GPU - if e.errorCode == 1 and len(gpu_config) == 0: + if e.errorCode == 1 and len(gpu_config) == 0 and omvs_cuda: log.ODM_WARNING("OpenMVS failed with GPU, is your graphics card driver up to date? Falling back to CPU.") gpu_config.append("--cuda-device -2") run_densify()