@@ -28,13 +28,54 @@ option (OIIO_IMIV_ADD_UPLOAD_SMOKE_CTEST
2828 "Add an optional CTest entry that generates/upload-tests the imiv corpus" OFF )
2929set (OIIO_IMIV_VULKAN_SDK "$ENV{VULKAN_SDK} " CACHE PATH
3030 "Optional Vulkan SDK root path used to locate Vulkan package for imiv" )
31+ set (_imiv_default_renderer "vulkan" )
32+ if (APPLE )
33+ set (_imiv_default_renderer "metal" )
34+ endif ()
35+ set (OIIO_IMIV_RENDERER "auto" CACHE STRING
36+ "Renderer backend for imiv (auto, vulkan, metal, opengl)" )
37+ set_property (CACHE OIIO_IMIV_RENDERER PROPERTY STRINGS
38+ auto vulkan metal opengl)
3139
3240check_is_enabled (imiv imiv_enabled )
3341if (NOT imiv_enabled)
3442 message (STATUS "Disabling imiv" )
3543 return ()
3644endif ()
3745
46+ string (TOLOWER "${OIIO_IMIV_RENDERER} " _imiv_renderer_request)
47+ if (_imiv_renderer_request STREQUAL ""
48+ OR _imiv_renderer_request STREQUAL "auto" )
49+ set (_imiv_selected_renderer "${_imiv_default_renderer} " )
50+ elseif (_imiv_renderer_request STREQUAL "vulkan"
51+ OR _imiv_renderer_request STREQUAL "metal"
52+ OR _imiv_renderer_request STREQUAL "opengl" )
53+ set (_imiv_selected_renderer "${_imiv_renderer_request} " )
54+ else ()
55+ message (FATAL_ERROR
56+ "imiv: unsupported OIIO_IMIV_RENDERER='${OIIO_IMIV_RENDERER} ' "
57+ "(expected auto, vulkan, metal, or opengl)" )
58+ endif ()
59+
60+ if (_imiv_selected_renderer STREQUAL "metal" AND NOT APPLE )
61+ message (FATAL_ERROR
62+ "imiv: OIIO_IMIV_RENDERER=metal requires APPLE" )
63+ endif ()
64+
65+ set (_imiv_renderer_is_vulkan OFF )
66+ set (_imiv_renderer_is_metal OFF )
67+ set (_imiv_renderer_is_opengl OFF )
68+ if (_imiv_selected_renderer STREQUAL "vulkan" )
69+ set (_imiv_renderer_is_vulkan ON )
70+ elseif (_imiv_selected_renderer STREQUAL "metal" )
71+ set (_imiv_renderer_is_metal ON )
72+ elseif (_imiv_selected_renderer STREQUAL "opengl" )
73+ set (_imiv_renderer_is_opengl ON )
74+ endif ()
75+
76+ message (STATUS
77+ "imiv: selected renderer backend = glfw+${_imiv_selected_renderer} " )
78+
3879set (_imiv_imgui_required_files
3980 "${OIIO_IMIV_IMGUI_ROOT} /imgui.h"
4081 "${OIIO_IMIV_IMGUI_ROOT} /imgui.cpp"
@@ -43,10 +84,25 @@ set (_imiv_imgui_required_files
4384 "${OIIO_IMIV_IMGUI_ROOT} /imgui_widgets.cpp"
4485 "${OIIO_IMIV_IMGUI_ROOT} /backends/imgui_impl_glfw.h"
4586 "${OIIO_IMIV_IMGUI_ROOT} /backends/imgui_impl_glfw.cpp" )
46- if (NOT APPLE )
87+ set (_imiv_imgui_renderer_sources)
88+ if (_imiv_renderer_is_vulkan)
4789 list (APPEND _imiv_imgui_required_files
4890 "${OIIO_IMIV_IMGUI_ROOT} /backends/imgui_impl_vulkan.h"
4991 "${OIIO_IMIV_IMGUI_ROOT} /backends/imgui_impl_vulkan.cpp" )
92+ list (APPEND _imiv_imgui_renderer_sources
93+ "${OIIO_IMIV_IMGUI_ROOT} /backends/imgui_impl_vulkan.cpp" )
94+ elseif (_imiv_renderer_is_metal)
95+ list (APPEND _imiv_imgui_required_files
96+ "${OIIO_IMIV_IMGUI_ROOT} /backends/imgui_impl_metal.h"
97+ "${OIIO_IMIV_IMGUI_ROOT} /backends/imgui_impl_metal.mm" )
98+ list (APPEND _imiv_imgui_renderer_sources
99+ "${OIIO_IMIV_IMGUI_ROOT} /backends/imgui_impl_metal.mm" )
100+ elseif (_imiv_renderer_is_opengl)
101+ list (APPEND _imiv_imgui_required_files
102+ "${OIIO_IMIV_IMGUI_ROOT} /backends/imgui_impl_opengl3.h"
103+ "${OIIO_IMIV_IMGUI_ROOT} /backends/imgui_impl_opengl3.cpp" )
104+ list (APPEND _imiv_imgui_renderer_sources
105+ "${OIIO_IMIV_IMGUI_ROOT} /backends/imgui_impl_opengl3.cpp" )
50106endif ()
51107set (_imiv_imgui_found ON )
52108foreach (_imiv_required_file ${_imiv_imgui_required_files} )
@@ -67,12 +123,10 @@ if (NOT _imiv_imgui_found)
67123endif ()
68124record_build_dependency (ImGui FOUND )
69125
70- set (_imiv_core_sources
126+ set (_imiv_shared_sources
71127 imiv_actions.cpp
72128 imiv_app.cpp
73129 imiv_aux_windows.cpp
74- imiv_capture.cpp
75- imiv_drag_drop.cpp
76130 imiv_file_dialog.cpp
77131 imiv_frame.cpp
78132 imiv_image_view.cpp
@@ -83,22 +137,51 @@ set (_imiv_core_sources
83137 imiv_renderer.cpp
84138 imiv_shader_compile.cpp
85139 imiv_style.cpp
140+ imiv_upload_types.cpp
86141 imiv_ui.cpp
87142 imiv_viewer.cpp
143+ imiv_main.cpp)
144+
145+ set (_imiv_test_engine_integration_sources
146+ imiv_test_engine.cpp)
147+
148+ set (_imiv_platform_glfw_sources
149+ imiv_drag_drop.cpp
150+ imiv_platform_glfw.cpp)
151+ if (APPLE )
152+ list (APPEND _imiv_platform_glfw_sources
153+ external/dnd_glfw/dnd_glfw_macos.mm)
154+ endif ()
155+
156+ set (_imiv_renderer_vulkan_sources
157+ imiv_renderer_vulkan.cpp
158+ imiv_capture.cpp
88159 imiv_vulkan_setup.cpp
89160 imiv_vulkan_ocio.cpp
90161 imiv_vulkan_preview.cpp
91162 imiv_vulkan_runtime.cpp
92163 imiv_vulkan_texture.cpp
93- imiv_vulkan_window.cpp
94- imiv_test_engine.cpp
95- imiv_main.cpp)
96-
97- if (APPLE )
98- list (APPEND _imiv_core_sources
99- external/dnd_glfw/dnd_glfw_macos.mm)
164+ imiv_vulkan_window.cpp)
165+
166+ set (_imiv_renderer_metal_sources
167+ imiv_renderer_metal.mm)
168+ set (_imiv_renderer_opengl_sources
169+ imiv_renderer_opengl.cpp)
170+ set (_imiv_renderer_selected_sources)
171+ if (_imiv_renderer_is_vulkan)
172+ set (_imiv_renderer_selected_sources ${_imiv_renderer_vulkan_sources} )
173+ elseif (_imiv_renderer_is_metal)
174+ set (_imiv_renderer_selected_sources ${_imiv_renderer_metal_sources} )
175+ elseif (_imiv_renderer_is_opengl)
176+ set (_imiv_renderer_selected_sources ${_imiv_renderer_opengl_sources} )
100177endif ()
101178
179+ set (_imiv_core_sources
180+ ${_imiv_shared_sources}
181+ ${_imiv_test_engine_integration_sources}
182+ ${_imiv_platform_glfw_sources}
183+ ${_imiv_renderer_selected_sources} )
184+
102185set (_imiv_shader_src "${CMAKE_CURRENT_SOURCE_DIR } /shaders/imiv_upload_to_rgba.comp" )
103186set (_imiv_preview_vert_src "${CMAKE_CURRENT_SOURCE_DIR } /shaders/imiv_preview.vert" )
104187set (_imiv_preview_frag_src "${CMAKE_CURRENT_SOURCE_DIR } /shaders/imiv_preview.frag" )
@@ -110,7 +193,7 @@ set (_imiv_preview_vert_spv "${CMAKE_CURRENT_BINARY_DIR}/imiv_preview.vert.spv")
110193set (_imiv_preview_frag_spv "${CMAKE_CURRENT_BINARY_DIR } /imiv_preview.frag.spv" )
111194set (_imiv_shader_outputs)
112195
113- if (NOT APPLE )
196+ if (_imiv_renderer_is_vulkan )
114197 find_program (OIIO_IMIV_GLSLC_EXECUTABLE
115198 NAMES glslc
116199 HINTS
@@ -204,11 +287,8 @@ set (_imiv_imgui_sources
204287 "${OIIO_IMIV_IMGUI_ROOT} /imgui_draw.cpp"
205288 "${OIIO_IMIV_IMGUI_ROOT} /imgui_tables.cpp"
206289 "${OIIO_IMIV_IMGUI_ROOT} /imgui_widgets.cpp"
207- "${OIIO_IMIV_IMGUI_ROOT} /backends/imgui_impl_glfw.cpp" )
208- if (NOT APPLE )
209- list (APPEND _imiv_imgui_sources
210- "${OIIO_IMIV_IMGUI_ROOT} /backends/imgui_impl_vulkan.cpp" )
211- endif ()
290+ "${OIIO_IMIV_IMGUI_ROOT} /backends/imgui_impl_glfw.cpp"
291+ ${_imiv_imgui_renderer_sources} )
212292
213293set (_imiv_test_engine_sources)
214294set (_imiv_test_engine_dir "" )
@@ -260,16 +340,16 @@ set (_imiv_link_libs
260340 OpenImageIO
261341 $<TARGET_NAME_IF_EXISTS :OpenColorIO ::OpenColorIO >
262342 $<TARGET_NAME_IF_EXISTS :OpenColorIO ::OpenColorIOHeaders >)
263- if (NOT APPLE )
264- find_package (glfw3 CONFIG QUIET )
265- if (TARGET glfw)
266- list (APPEND _imiv_link_libs glfw)
267- else ()
268- message (STATUS
269- "\n\n WARNING: glfw not found -- 'imiv' will not be built!\n " )
270- return ()
271- endif ()
343+ find_package (glfw3 CONFIG QUIET )
344+ if (TARGET glfw)
345+ list (APPEND _imiv_link_libs glfw)
346+ else ()
347+ message (STATUS
348+ "\n\n WARNING: glfw not found -- 'imiv' will not be built!\n " )
349+ return ()
350+ endif ()
272351
352+ if (_imiv_renderer_is_vulkan)
273353 find_package (Vulkan QUIET )
274354 if (Vulkan_FOUND)
275355 record_build_dependency (Vulkan FOUND VERSION "${Vulkan_VERSION} " )
@@ -513,12 +593,48 @@ if (NOT APPLE)
513593 GLSLANG_RUNTIME NOTFOUND
514594 NOT_FOUND_EXPLANATION "${_imiv_runtime_glslang_explanation} " )
515595 endif ()
516- else ( )
596+ elseif (_imiv_renderer_is_metal )
517597 set (_imiv_has_runtime_glslang OFF )
518598 record_build_dependency (
519599 GLSLANG_RUNTIME NOTFOUND
520600 NOT_FOUND_EXPLANATION
521601 "(runtime shader compilation disabled on Metal backend)" )
602+ find_library (OIIO_IMIV_COCOA_FRAMEWORK Cocoa )
603+ find_library (OIIO_IMIV_METAL_FRAMEWORK Metal )
604+ find_library (OIIO_IMIV_QUARTZCORE_FRAMEWORK QuartzCore )
605+ if (NOT OIIO_IMIV_COCOA_FRAMEWORK
606+ OR NOT OIIO_IMIV_METAL_FRAMEWORK
607+ OR NOT OIIO_IMIV_QUARTZCORE_FRAMEWORK)
608+ message (STATUS
609+ "\n\n WARNING: Metal frameworks not found -- 'imiv' will not be built!\n " )
610+ return ()
611+ endif ()
612+ list (APPEND _imiv_link_libs
613+ ${OIIO_IMIV_COCOA_FRAMEWORK}
614+ ${OIIO_IMIV_METAL_FRAMEWORK}
615+ ${OIIO_IMIV_QUARTZCORE_FRAMEWORK} )
616+ elseif (_imiv_renderer_is_opengl)
617+ set (_imiv_has_runtime_glslang OFF )
618+ record_build_dependency (
619+ GLSLANG_RUNTIME NOTFOUND
620+ NOT_FOUND_EXPLANATION
621+ "(runtime shader compilation disabled on OpenGL backend)" )
622+ find_package (OpenGL QUIET )
623+ if (TARGET OpenGL::GL)
624+ list (APPEND _imiv_link_libs OpenGL::GL)
625+ elseif (TARGET OpenGL::OpenGL)
626+ list (APPEND _imiv_link_libs OpenGL::OpenGL)
627+ else ()
628+ message (STATUS
629+ "\n\n WARNING: OpenGL not found -- 'imiv' will not be built!\n " )
630+ return ()
631+ endif ()
632+ else ()
633+ set (_imiv_has_runtime_glslang OFF )
634+ record_build_dependency (
635+ GLSLANG_RUNTIME NOTFOUND
636+ NOT_FOUND_EXPLANATION
637+ "(runtime shader compilation disabled on selected backend)" )
522638endif ()
523639
524640if (MSVC )
@@ -546,8 +662,17 @@ fancy_add_executable (
546662source_group ("imgui" FILES ${_imiv_imgui_sources} )
547663source_group ("imgui_te" FILES
548664 ${_imiv_test_engine_sources}
549- " ${ CMAKE_CURRENT_SOURCE_DIR } /imiv_test_engine.cpp"
665+ ${_imiv_test_engine_integration_sources}
550666 "${CMAKE_CURRENT_SOURCE_DIR } /imiv_test_engine.h" )
667+ source_group ("imiv\\ shared" FILES ${_imiv_shared_sources} )
668+ source_group ("imiv\\ platform\\ glfw" FILES ${_imiv_platform_glfw_sources} )
669+ source_group ("imiv\\ renderer\\ vulkan" FILES ${_imiv_renderer_vulkan_sources} )
670+ if (_imiv_renderer_metal_sources)
671+ source_group ("imiv\\ renderer\\ metal" FILES ${_imiv_renderer_metal_sources} )
672+ endif ()
673+ if (_imiv_renderer_opengl_sources)
674+ source_group ("imiv\\ renderer\\ opengl" FILES ${_imiv_renderer_opengl_sources} )
675+ endif ()
551676
552677if (TARGET imiv)
553678 target_compile_definitions (imiv PRIVATE IMGUI_DISABLE_OBSOLETE_FUNCTIONS )
@@ -558,15 +683,16 @@ if (TARGET imiv)
558683 else ()
559684 target_compile_definitions (imiv PRIVATE IMIV_HAS_COMPUTE_UPLOAD_SHADERS=0 )
560685 endif ()
561- if (APPLE )
562- target_compile_definitions (imiv PRIVATE IMIV_BACKEND_METAL_GLFW=1 )
563- find_library (OIIO_IMIV_COCOA_FRAMEWORK Cocoa )
564- if (OIIO_IMIV_COCOA_FRAMEWORK)
565- target_link_libraries (imiv PRIVATE ${OIIO_IMIV_COCOA_FRAMEWORK} )
566- endif ()
567- else ()
686+ if (_imiv_renderer_is_vulkan)
568687 target_compile_definitions (imiv PRIVATE IMIV_BACKEND_VULKAN_GLFW=1
569688 $<$<CONFIG :Debug >:IMIV_VULKAN_VALIDATION =1>)
689+ elseif (_imiv_renderer_is_metal)
690+ target_compile_definitions (imiv PRIVATE IMIV_BACKEND_METAL_GLFW=1 )
691+ elseif (_imiv_renderer_is_opengl)
692+ target_compile_definitions (imiv PRIVATE IMIV_BACKEND_OPENGL_GLFW=1 )
693+ if (APPLE )
694+ target_compile_definitions (imiv PRIVATE GL_SILENCE_DEPRECATION )
695+ endif ()
570696 endif ()
571697 if (_imiv_has_runtime_glslang)
572698 target_compile_definitions (imiv PRIVATE IMIV_HAS_GLSLANG_RUNTIME=1 )
0 commit comments