Skip to content

Commit 95104d2

Browse files
committed
Add renderer abstraction and Vulkan shim
Introduce a Renderer abstraction (imiv_renderer.h/.cpp) that wraps Vulkan-specific types and functions behind a RendererState/RendererTexture API. Replace direct Vulkan types/calls across the codebase with renderer_* wrappers and typedefs (or no-op stubs when IMIV_BACKEND_VULKAN_GLFW is not defined), updating many call sites (actions, app, frame, menu, drag_drop, image_view, viewer headers). Add the new source to CMakeLists, reorganize source groups, and increase a GUI test timeout. This centralizes backend-specific logic, enabling future non-Vulkan backends and reducing Vulkan-specific scattered code while preserving existing behavior under the IMIV_BACKEND_VULKAN_GLFW macro.
1 parent 7e2a95c commit 95104d2

14 files changed

Lines changed: 495 additions & 150 deletions

src/imiv/CMakeLists.txt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ set (_imiv_core_sources
8080
imiv_navigation.cpp
8181
imiv_ocio.cpp
8282
imiv_overlays.cpp
83+
imiv_renderer.cpp
8384
imiv_shader_compile.cpp
8485
imiv_style.cpp
8586
imiv_ui.cpp
@@ -542,6 +543,12 @@ fancy_add_executable (
542543
${_imiv_link_libs}
543544
)
544545

546+
source_group ("imgui" FILES ${_imiv_imgui_sources})
547+
source_group ("imgui_te" FILES
548+
${_imiv_test_engine_sources}
549+
"${CMAKE_CURRENT_SOURCE_DIR}/imiv_test_engine.cpp"
550+
"${CMAKE_CURRENT_SOURCE_DIR}/imiv_test_engine.h")
551+
545552
if (TARGET imiv)
546553
target_compile_definitions (imiv PRIVATE IMGUI_DISABLE_OBSOLETE_FUNCTIONS)
547554
target_compile_definitions (imiv PRIVATE IMIV_SHADER_DIR="${CMAKE_CURRENT_BINARY_DIR}")
@@ -851,7 +858,7 @@ if (TARGET imiv
851858
set_tests_properties (
852859
imiv_selection_regression PROPERTIES
853860
LABELS "imiv;gui"
854-
TIMEOUT 180)
861+
TIMEOUT 360)
855862
elseif (TARGET imiv
856863
AND OIIO_BUILD_TESTS
857864
AND BUILD_TESTING)

src/imiv/imiv_actions.cpp

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -166,33 +166,41 @@ env_flag_is_truthy(const char* name)
166166
return Strutil::iequals(trimmed, "true") || Strutil::iequals(trimmed, "yes")
167167
|| Strutil::iequals(trimmed, "on");
168168
}
169-
#if defined(IMIV_BACKEND_VULKAN_GLFW)
170169
bool
171-
viewer_texture_has_gpu_lifetime(const VulkanTexture& texture)
170+
viewer_texture_has_gpu_lifetime(const RendererTexture& texture)
172171
{
172+
#if defined(IMIV_BACKEND_VULKAN_GLFW)
173173
return texture.image != VK_NULL_HANDLE
174174
|| texture.source_image != VK_NULL_HANDLE
175175
|| texture.set != VK_NULL_HANDLE
176176
|| texture.nearest_mag_set != VK_NULL_HANDLE
177177
|| texture.pixelview_set != VK_NULL_HANDLE
178178
|| texture.upload_submit_pending || texture.preview_submit_pending;
179+
#else
180+
(void)texture;
181+
return false;
182+
#endif
179183
}
180184

181185
void
182-
quiesce_viewer_texture_lifetime(VulkanState& vk_state,
183-
const VulkanTexture& texture)
186+
quiesce_viewer_texture_lifetime(RendererState& renderer_state,
187+
const RendererTexture& texture)
184188
{
185-
if (vk_state.device == VK_NULL_HANDLE
189+
#if defined(IMIV_BACKEND_VULKAN_GLFW)
190+
if (renderer_state.device == VK_NULL_HANDLE
186191
|| !viewer_texture_has_gpu_lifetime(texture)) {
187192
return;
188193
}
189-
VkResult err = vkDeviceWaitIdle(vk_state.device);
194+
VkResult err = vkDeviceWaitIdle(renderer_state.device);
190195
check_vk_result(err);
191-
}
196+
#else
197+
(void)renderer_state;
198+
(void)texture;
192199
#endif
200+
}
193201

194202
bool
195-
load_viewer_image(VulkanState& vk_state, ViewerState& viewer,
203+
load_viewer_image(RendererState& vk_state, ViewerState& viewer,
196204
PlaceholderUiState* ui_state, const std::string& path,
197205
int requested_subimage, int requested_miplevel)
198206
{
@@ -207,16 +215,14 @@ load_viewer_image(VulkanState& vk_state, ViewerState& viewer,
207215
print(stderr, "imiv: {}\n", viewer.last_error);
208216
return false;
209217
}
210-
VulkanTexture texture;
211-
if (!create_texture(vk_state, loaded, texture, error)) {
218+
RendererTexture texture;
219+
if (!renderer_create_texture(vk_state, loaded, texture, error)) {
212220
viewer.last_error = Strutil::fmt::format("upload failed: {}", error);
213221
print(stderr, "imiv: {}\n", viewer.last_error);
214222
return false;
215223
}
216-
#if defined(IMIV_BACKEND_VULKAN_GLFW)
217224
quiesce_viewer_texture_lifetime(vk_state, viewer.texture);
218-
#endif
219-
destroy_texture(vk_state, viewer.texture);
225+
renderer_destroy_texture(vk_state, viewer.texture);
220226
if (ui_state != nullptr && should_reset_preview_on_load(viewer, path))
221227
reset_per_image_preview_state(*ui_state);
222228
viewer.image = std::move(loaded);
@@ -567,7 +573,7 @@ toggle_sort_reverse_action(ViewerState& viewer)
567573
}
568574

569575
bool
570-
advance_slide_show_action(VulkanState& vk_state, ViewerState& viewer,
576+
advance_slide_show_action(RendererState& vk_state, ViewerState& viewer,
571577
PlaceholderUiState& ui_state)
572578
{
573579
if (!ui_state.slide_show_running || viewer.loaded_image_paths.empty()
@@ -606,7 +612,7 @@ toggle_slide_show_action(PlaceholderUiState& ui_state, ViewerState& viewer)
606612
}
607613

608614
void
609-
open_image_dialog_action(VulkanState& vk_state, ViewerState& viewer,
615+
open_image_dialog_action(RendererState& vk_state, ViewerState& viewer,
610616
PlaceholderUiState& ui_state, int requested_subimage,
611617
int requested_miplevel)
612618
{
@@ -655,7 +661,7 @@ open_image_dialog_action(VulkanState& vk_state, ViewerState& viewer,
655661
}
656662

657663
void
658-
reload_current_image_action(VulkanState& vk_state, ViewerState& viewer,
664+
reload_current_image_action(RendererState& vk_state, ViewerState& viewer,
659665
PlaceholderUiState& ui_state)
660666
{
661667
if (viewer.image.path.empty()) {
@@ -668,15 +674,15 @@ reload_current_image_action(VulkanState& vk_state, ViewerState& viewer,
668674
}
669675

670676
void
671-
close_current_image_action(VulkanState& vk_state, ViewerState& viewer,
677+
close_current_image_action(RendererState& vk_state, ViewerState& viewer,
672678
PlaceholderUiState& ui_state)
673679
{
674680
const std::string closing_path = viewer.image.path;
675681
const int closing_index = viewer.current_path_index;
676682
# if defined(IMIV_BACKEND_VULKAN_GLFW)
677683
quiesce_viewer_texture_lifetime(vk_state, viewer.texture);
678684
# endif
679-
destroy_texture(vk_state, viewer.texture);
685+
renderer_destroy_texture(vk_state, viewer.texture);
680686
remove_loaded_image_path(viewer, closing_path);
681687
if (!viewer.loaded_image_paths.empty()) {
682688
const int replacement_index
@@ -698,7 +704,7 @@ close_current_image_action(VulkanState& vk_state, ViewerState& viewer,
698704
}
699705

700706
void
701-
next_sibling_image_action(VulkanState& vk_state, ViewerState& viewer,
707+
next_sibling_image_action(RendererState& vk_state, ViewerState& viewer,
702708
PlaceholderUiState& ui_state, int delta)
703709
{
704710
std::string path;
@@ -713,7 +719,7 @@ next_sibling_image_action(VulkanState& vk_state, ViewerState& viewer,
713719
}
714720

715721
void
716-
toggle_image_action(VulkanState& vk_state, ViewerState& viewer,
722+
toggle_image_action(RendererState& vk_state, ViewerState& viewer,
717723
PlaceholderUiState& ui_state)
718724
{
719725
if (viewer.last_path_index < 0
@@ -730,7 +736,7 @@ toggle_image_action(VulkanState& vk_state, ViewerState& viewer,
730736
}
731737

732738
void
733-
change_subimage_action(VulkanState& vk_state, ViewerState& viewer,
739+
change_subimage_action(RendererState& vk_state, ViewerState& viewer,
734740
PlaceholderUiState& ui_state, int delta)
735741
{
736742
if (viewer.image.path.empty()) {
@@ -776,7 +782,7 @@ change_subimage_action(VulkanState& vk_state, ViewerState& viewer,
776782
}
777783

778784
void
779-
change_miplevel_action(VulkanState& vk_state, ViewerState& viewer,
785+
change_miplevel_action(RendererState& vk_state, ViewerState& viewer,
780786
PlaceholderUiState& ui_state, int delta)
781787
{
782788
if (viewer.image.path.empty()) {
@@ -812,7 +818,7 @@ queue_auto_subimage_from_zoom(ViewerState& viewer)
812818
}
813819

814820
bool
815-
apply_pending_auto_subimage_action(VulkanState& vk_state, ViewerState& viewer,
821+
apply_pending_auto_subimage_action(RendererState& vk_state, ViewerState& viewer,
816822
PlaceholderUiState& ui_state)
817823
{
818824
if (viewer.pending_auto_subimage < 0 || viewer.image.path.empty())
@@ -834,7 +840,7 @@ apply_pending_auto_subimage_action(VulkanState& vk_state, ViewerState& viewer,
834840
}
835841

836842
bool
837-
capture_main_viewport_screenshot_action(VulkanState& vk_state,
843+
capture_main_viewport_screenshot_action(RendererState& vk_state,
838844
ViewerState& viewer,
839845
std::string& out_path)
840846
{
@@ -860,8 +866,8 @@ capture_main_viewport_screenshot_action(VulkanState& vk_state,
860866

861867
std::vector<unsigned int> pixels(static_cast<size_t>(width)
862868
* static_cast<size_t>(height));
863-
if (!imiv_vulkan_screen_capture(ImGui::GetMainViewport()->ID, 0, 0, width,
864-
height, pixels.data(), &vk_state)) {
869+
if (!renderer_screen_capture(ImGui::GetMainViewport()->ID, 0, 0, width,
870+
height, pixels.data(), &vk_state)) {
865871
viewer.last_error = "screenshot failed: framebuffer readback failed";
866872
return false;
867873
}

src/imiv/imiv_actions.h

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
#pragma once
66

7-
#include "imiv_types.h"
7+
#include "imiv_renderer.h"
88
#include "imiv_viewer.h"
99

1010
#include <string>
@@ -16,7 +16,7 @@ struct GLFWwindow;
1616
namespace Imiv {
1717

1818
bool
19-
load_viewer_image(VulkanState& vk_state, ViewerState& viewer,
19+
load_viewer_image(RendererState& renderer_state, ViewerState& viewer,
2020
PlaceholderUiState* ui_state, const std::string& path,
2121
int requested_subimage, int requested_miplevel);
2222
void
@@ -44,36 +44,37 @@ set_sort_mode_action(ViewerState& viewer, ImageSortMode mode);
4444
void
4545
toggle_sort_reverse_action(ViewerState& viewer);
4646
bool
47-
advance_slide_show_action(VulkanState& vk_state, ViewerState& viewer,
47+
advance_slide_show_action(RendererState& renderer_state, ViewerState& viewer,
4848
PlaceholderUiState& ui_state);
4949
void
5050
toggle_slide_show_action(PlaceholderUiState& ui_state, ViewerState& viewer);
5151
void
52-
open_image_dialog_action(VulkanState& vk_state, ViewerState& viewer,
52+
open_image_dialog_action(RendererState& renderer_state, ViewerState& viewer,
5353
PlaceholderUiState& ui_state, int requested_subimage,
5454
int requested_miplevel);
5555
void
56-
reload_current_image_action(VulkanState& vk_state, ViewerState& viewer,
56+
reload_current_image_action(RendererState& renderer_state, ViewerState& viewer,
5757
PlaceholderUiState& ui_state);
5858
void
59-
close_current_image_action(VulkanState& vk_state, ViewerState& viewer,
59+
close_current_image_action(RendererState& renderer_state, ViewerState& viewer,
6060
PlaceholderUiState& ui_state);
6161
void
62-
next_sibling_image_action(VulkanState& vk_state, ViewerState& viewer,
62+
next_sibling_image_action(RendererState& renderer_state, ViewerState& viewer,
6363
PlaceholderUiState& ui_state, int delta);
6464
void
65-
toggle_image_action(VulkanState& vk_state, ViewerState& viewer,
65+
toggle_image_action(RendererState& renderer_state, ViewerState& viewer,
6666
PlaceholderUiState& ui_state);
6767
void
68-
change_subimage_action(VulkanState& vk_state, ViewerState& viewer,
68+
change_subimage_action(RendererState& renderer_state, ViewerState& viewer,
6969
PlaceholderUiState& ui_state, int delta);
7070
void
71-
change_miplevel_action(VulkanState& vk_state, ViewerState& viewer,
71+
change_miplevel_action(RendererState& renderer_state, ViewerState& viewer,
7272
PlaceholderUiState& ui_state, int delta);
7373
void
7474
queue_auto_subimage_from_zoom(ViewerState& viewer);
7575
bool
76-
apply_pending_auto_subimage_action(VulkanState& vk_state, ViewerState& viewer,
76+
apply_pending_auto_subimage_action(RendererState& renderer_state,
77+
ViewerState& viewer,
7778
PlaceholderUiState& ui_state);
7879

7980
#if defined(IMIV_BACKEND_VULKAN_GLFW)
@@ -84,7 +85,7 @@ void
8485
fit_window_to_image_action(GLFWwindow* window, ViewerState& viewer,
8586
PlaceholderUiState& ui_state);
8687
bool
87-
capture_main_viewport_screenshot_action(VulkanState& vk_state,
88+
capture_main_viewport_screenshot_action(RendererState& renderer_state,
8889
ViewerState& viewer,
8990
std::string& out_path);
9091
#endif

0 commit comments

Comments
 (0)