Skip to content

Commit 9eb186c

Browse files
committed
GLFW multi-backend support and OpenGL preview
Broaden GLFW backend conditionals to include METAL and OPENGL variants and integrate a new OpenGL-based preview pipeline. Key changes: - Replaced many IMIV_BACKEND_VULKAN_GLFW-only #if checks with ORs to also enable IMIV_BACKEND_METAL_GLFW and IMIV_BACKEND_OPENGL_GLFW. - Added platform_glfw_get_proc_address and header declaration for loading GL entry points. - Major OpenGL renderer updates: new RendererTextureBackendState fields, preview linear/nearest textures, source texture, preview dirty/params tracking, and preview framebuffer handling. - Introduced shader-based BasicPreviewProgram, program/VAO creation, shader compile/link helpers, and runtime loading of extra GL procs (glUniform1f, glDrawArrays, framebuffer funcs, etc.). - Implemented render_preview_texture to draw into an intermediate framebuffer using a fullscreen triangle and configurable controls (exposure, gamma, offset, color modes, channel, orientation, etc.). - Updated texture allocation/update/destroy flows to separate source texture from preview targets and generate preview textures on demand. - Fixed RGBA float pixel packing for 1/2/3/4 channel images and added comparison for preview control changes to avoid redundant renders. - Adjusted ImGui/test-engine/platform interactions and removed Vulkan-specific strings where appropriate. - Ensured cleanup of preview program and framebuffer on renderer shutdown. Overall this enables OpenGL-backed previews with shader-driven display controls and extends GLFW-guarded features to other GLFW-based backends.
1 parent f9361be commit 9eb186c

10 files changed

Lines changed: 634 additions & 152 deletions

src/imiv/imiv_app.cpp

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -195,16 +195,16 @@ run(const AppConfig& config)
195195
const bool log_imgui_texture_updates = env_flag_is_truthy(
196196
"IMIV_DEBUG_IMGUI_TEXTURES");
197197

198-
# if defined(IMGUI_ENABLE_TEST_ENGINE)
198+
#if defined(IMGUI_ENABLE_TEST_ENGINE)
199199
TestEngineConfig test_engine_cfg = gather_test_engine_config();
200200
TestEngineRuntime test_engine_runtime;
201-
# else
201+
#else
202202
bool want_test_engine
203203
= env_flag_is_truthy("IMIV_IMGUI_TEST_ENGINE")
204204
|| env_flag_is_truthy("IMIV_IMGUI_TEST_ENGINE_AUTOSSCREENSHOT")
205205
|| env_flag_is_truthy("IMIV_IMGUI_TEST_ENGINE_LAYOUT_DUMP")
206206
|| env_flag_is_truthy("IMIV_IMGUI_TEST_ENGINE_JUNIT_XML");
207-
# endif
207+
#endif
208208

209209
std::string startup_error;
210210
if (!platform_glfw_init(verbose_logging, startup_error)) {
@@ -364,14 +364,14 @@ run(const AppConfig& config)
364364
FileDialog::available() ? "enabled" : "disabled");
365365
}
366366

367-
# if !defined(IMGUI_ENABLE_TEST_ENGINE)
367+
#if !defined(IMGUI_ENABLE_TEST_ENGINE)
368368
if (want_test_engine) {
369369
print(stderr,
370370
"imiv: IMIV_IMGUI_TEST_ENGINE requested but support is not "
371371
"compiled in. Configure with "
372372
"-DOIIO_IMIV_ENABLE_IMGUI_TEST_ENGINE=ON.\n");
373373
}
374-
# endif
374+
#endif
375375

376376
if (run_config.open_dialog) {
377377
FileDialog::DialogReply reply = FileDialog::open_image_files("");
@@ -469,11 +469,12 @@ run(const AppConfig& config)
469469
viewer.status_message = "Open an image to start preview";
470470
}
471471

472-
#if defined(IMIV_BACKEND_VULKAN_GLFW)
472+
#if defined(IMIV_BACKEND_VULKAN_GLFW) || defined(IMIV_BACKEND_METAL_GLFW) \
473+
|| defined(IMIV_BACKEND_OPENGL_GLFW)
473474
install_drag_drop(window, viewer);
474475
#endif
475476

476-
# if defined(IMGUI_ENABLE_TEST_ENGINE)
477+
#if defined(IMGUI_ENABLE_TEST_ENGINE)
477478
ViewerStateJsonWriteContext test_engine_state_ctx = { &viewer, &ui_state };
478479
TestEngineHooks test_engine_hooks;
479480
test_engine_hooks.image_window_title = image_window_title();
@@ -483,7 +484,7 @@ run(const AppConfig& config)
483484
= write_test_engine_viewer_state_json;
484485
test_engine_hooks.write_viewer_state_user_data = &test_engine_state_ctx;
485486
test_engine_start(test_engine_runtime, test_engine_cfg, test_engine_hooks);
486-
# endif
487+
#endif
487488

488489
platform_glfw_show_window(window);
489490
platform_glfw_poll_events();
@@ -525,26 +526,27 @@ run(const AppConfig& config)
525526
platform_glfw_imgui_new_frame();
526527
ImGui::NewFrame();
527528
draw_viewer_ui(viewer, ui_state, developer_ui, fonts, request_exit
528-
# if defined(IMGUI_ENABLE_TEST_ENGINE)
529+
#if defined(IMGUI_ENABLE_TEST_ENGINE)
529530
,
530531
test_engine_show_windows_ptr(test_engine_runtime)
531-
# endif
532-
# if defined(IMIV_BACKEND_VULKAN_GLFW)
532+
#endif
533+
#if defined(IMIV_BACKEND_VULKAN_GLFW) || defined(IMIV_BACKEND_METAL_GLFW) \
534+
|| defined(IMIV_BACKEND_OPENGL_GLFW)
533535
,
534536
window, renderer_state);
535-
# else
536-
);
537-
# endif
537+
#else
538+
);
539+
#endif
538540
if (ui_state.style_preset != applied_style_preset) {
539541
ui_state.style_preset = static_cast<int>(
540542
sanitize_app_style_preset(ui_state.style_preset));
541543
apply_imgui_app_style(
542544
sanitize_app_style_preset(ui_state.style_preset));
543545
applied_style_preset = ui_state.style_preset;
544546
}
545-
# if defined(IMGUI_ENABLE_TEST_ENGINE)
547+
#if defined(IMGUI_ENABLE_TEST_ENGINE)
546548
test_engine_maybe_show_windows(test_engine_runtime, test_engine_cfg);
547-
# endif
549+
#endif
548550

549551
ImGui::Render();
550552
ImDrawData* draw_data = ImGui::GetDrawData();
@@ -560,20 +562,21 @@ run(const AppConfig& config)
560562
ImGui::RenderPlatformWindowsDefault();
561563
renderer_finish_platform_windows(renderer_state);
562564
}
563-
#if defined(IMIV_BACKEND_VULKAN_GLFW)
565+
#if defined(IMIV_BACKEND_VULKAN_GLFW) || defined(IMIV_BACKEND_METAL_GLFW) \
566+
|| defined(IMIV_BACKEND_OPENGL_GLFW)
564567
process_developer_post_render_actions(developer_ui, viewer,
565568
renderer_state);
566569
#endif
567-
# if defined(IMGUI_ENABLE_TEST_ENGINE)
570+
#if defined(IMGUI_ENABLE_TEST_ENGINE)
568571
test_engine_post_swap(test_engine_runtime);
569-
# endif
572+
#endif
570573
if (!main_is_minimized)
571574
renderer_frame_present(renderer_state);
572575

573-
# if defined(IMGUI_ENABLE_TEST_ENGINE)
576+
#if defined(IMGUI_ENABLE_TEST_ENGINE)
574577
if (test_engine_should_close(test_engine_runtime, test_engine_cfg))
575578
platform_glfw_request_close(window);
576-
# endif
579+
#endif
577580
if (io.WantSaveIniSettings) {
578581
std::string save_error_message;
579582
if (!save_combined_settings(save_error_message)) {
@@ -596,18 +599,19 @@ run(const AppConfig& config)
596599
prefs_save_error);
597600

598601
renderer_destroy_texture(renderer_state, viewer.texture);
599-
# if defined(IMGUI_ENABLE_TEST_ENGINE)
602+
#if defined(IMGUI_ENABLE_TEST_ENGINE)
600603
test_engine_stop(test_engine_runtime);
601-
# endif
602-
#if defined(IMIV_BACKEND_VULKAN_GLFW)
604+
#endif
605+
#if defined(IMIV_BACKEND_VULKAN_GLFW) || defined(IMIV_BACKEND_METAL_GLFW) \
606+
|| defined(IMIV_BACKEND_OPENGL_GLFW)
603607
uninstall_drag_drop(window);
604608
#endif
605609
renderer_imgui_shutdown();
606610
platform_glfw_imgui_shutdown();
607611
ImGui::DestroyContext();
608-
# if defined(IMGUI_ENABLE_TEST_ENGINE)
612+
#if defined(IMGUI_ENABLE_TEST_ENGINE)
609613
test_engine_destroy(test_engine_runtime);
610-
# endif
614+
#endif
611615

612616
renderer_cleanup_window(renderer_state);
613617
renderer_cleanup(renderer_state);

src/imiv/imiv_drag_drop.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,16 @@
1414

1515
#include <imgui.h>
1616

17-
#if defined(IMIV_BACKEND_VULKAN_GLFW)
17+
#if defined(IMIV_BACKEND_VULKAN_GLFW) || defined(IMIV_BACKEND_METAL_GLFW) \
18+
|| defined(IMIV_BACKEND_OPENGL_GLFW)
1819
# define GLFW_INCLUDE_NONE
19-
# define GLFW_INCLUDE_VULKAN
2020
# include <GLFW/glfw3.h>
2121
#endif
2222

2323
namespace Imiv {
2424

25-
#if defined(IMIV_BACKEND_VULKAN_GLFW)
25+
#if defined(IMIV_BACKEND_VULKAN_GLFW) || defined(IMIV_BACKEND_METAL_GLFW) \
26+
|| defined(IMIV_BACKEND_OPENGL_GLFW)
2627
namespace {
2728

2829
void on_dnd_drag_enter(GLFWwindow* window, const dnd_glfw::DragEvent& event,

src/imiv/imiv_drag_drop.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@
77
#include "imiv_renderer.h"
88
#include "imiv_viewer.h"
99

10-
#if defined(IMIV_BACKEND_VULKAN_GLFW)
10+
#if defined(IMIV_BACKEND_VULKAN_GLFW) || defined(IMIV_BACKEND_METAL_GLFW) \
11+
|| defined(IMIV_BACKEND_OPENGL_GLFW)
1112
struct GLFWwindow;
1213
#endif
1314

1415
namespace Imiv {
1516

16-
#if defined(IMIV_BACKEND_VULKAN_GLFW)
17+
#if defined(IMIV_BACKEND_VULKAN_GLFW) || defined(IMIV_BACKEND_METAL_GLFW) \
18+
|| defined(IMIV_BACKEND_OPENGL_GLFW)
1719
void
1820
install_drag_drop(GLFWwindow* window, ViewerState& viewer);
1921
void

src/imiv/imiv_frame.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,8 @@ draw_viewer_ui(ViewerState& viewer, PlaceholderUiState& ui_state,
366366
,
367367
bool* show_test_engine_windows
368368
#endif
369-
#if defined(IMIV_BACKEND_VULKAN_GLFW)
369+
#if defined(IMIV_BACKEND_VULKAN_GLFW) || defined(IMIV_BACKEND_METAL_GLFW) \
370+
|| defined(IMIV_BACKEND_OPENGL_GLFW)
370371
,
371372
GLFWwindow* window, RendererState& vk_state
372373
#endif
@@ -376,7 +377,8 @@ draw_viewer_ui(ViewerState& viewer, PlaceholderUiState& ui_state,
376377
reset_test_engine_mouse_space();
377378
ViewerFrameActions actions;
378379

379-
#if defined(IMIV_BACKEND_VULKAN_GLFW)
380+
#if defined(IMIV_BACKEND_VULKAN_GLFW) || defined(IMIV_BACKEND_METAL_GLFW) \
381+
|| defined(IMIV_BACKEND_OPENGL_GLFW)
380382
if (window != nullptr) {
381383
std::string fullscreen_error;
382384
set_full_screen_mode(window, viewer, ui_state.full_screen_mode,
@@ -407,12 +409,14 @@ draw_viewer_ui(ViewerState& viewer, PlaceholderUiState& ui_state,
407409
#endif
408410
begin_developer_screenshot_request(developer_ui, viewer);
409411
execute_viewer_frame_actions(viewer, ui_state, actions
410-
#if defined(IMIV_BACKEND_VULKAN_GLFW)
412+
#if defined(IMIV_BACKEND_VULKAN_GLFW) || defined(IMIV_BACKEND_METAL_GLFW) \
413+
|| defined(IMIV_BACKEND_OPENGL_GLFW)
411414
,
412415
window, vk_state
413416
#endif
414417
);
415-
#if defined(IMIV_BACKEND_VULKAN_GLFW)
418+
#if defined(IMIV_BACKEND_VULKAN_GLFW) || defined(IMIV_BACKEND_METAL_GLFW) \
419+
|| defined(IMIV_BACKEND_OPENGL_GLFW)
416420
process_pending_drop_paths(vk_state, viewer, ui_state);
417421
(void)apply_pending_auto_subimage_action(vk_state, viewer, ui_state);
418422
#endif
@@ -426,7 +430,6 @@ draw_viewer_ui(ViewerState& viewer, PlaceholderUiState& ui_state,
426430
ui_state.miplevel_index = 0;
427431
}
428432

429-
#if defined(IMIV_BACKEND_VULKAN_GLFW)
430433
if (!viewer.image.path.empty()) {
431434
RendererPreviewControls preview_controls = {};
432435
preview_controls.exposure = ui_state.exposure;
@@ -447,7 +450,6 @@ draw_viewer_ui(ViewerState& viewer, PlaceholderUiState& ui_state,
447450
viewer.last_error = preview_error;
448451
}
449452
}
450-
#endif
451453

452454
const ImGuiID main_dockspace_id = begin_main_dockspace_host();
453455
setup_image_window_policy(main_dockspace_id,
@@ -471,8 +473,7 @@ draw_viewer_ui(ViewerState& viewer, PlaceholderUiState& ui_state,
471473
ImGuiWindowFlags_AlwaysAutoResize)) {
472474
ImGui::TextUnformatted("imiv (Dear ImGui port of iv)");
473475
register_layout_dump_synthetic_item("text", "About imiv title");
474-
ImGui::TextUnformatted(
475-
"Image viewer port built with Dear ImGui and Vulkan.");
476+
ImGui::TextUnformatted("Image viewer port built with Dear ImGui.");
476477
register_layout_dump_synthetic_item("text", "About imiv body");
477478
if (ImGui::Button("Close"))
478479
ImGui::CloseCurrentPopup();
@@ -483,7 +484,8 @@ draw_viewer_ui(ViewerState& viewer, PlaceholderUiState& ui_state,
483484
draw_drag_drop_overlay(viewer);
484485
}
485486

486-
#if defined(IMIV_BACKEND_VULKAN_GLFW)
487+
#if defined(IMIV_BACKEND_VULKAN_GLFW) || defined(IMIV_BACKEND_METAL_GLFW) \
488+
|| defined(IMIV_BACKEND_OPENGL_GLFW)
487489
void
488490
process_developer_post_render_actions(DeveloperUiState& developer_ui,
489491
ViewerState& viewer,

src/imiv/imiv_frame.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
#include <filesystem>
1111
#include <string>
1212

13-
#if defined(IMIV_BACKEND_VULKAN_GLFW)
13+
#if defined(IMIV_BACKEND_VULKAN_GLFW) || defined(IMIV_BACKEND_METAL_GLFW) \
14+
|| defined(IMIV_BACKEND_OPENGL_GLFW)
1415
struct GLFWwindow;
1516
#endif
1617

@@ -51,13 +52,15 @@ draw_viewer_ui(ViewerState& viewer, PlaceholderUiState& ui_state,
5152
,
5253
bool* show_test_engine_windows
5354
#endif
54-
#if defined(IMIV_BACKEND_VULKAN_GLFW)
55+
#if defined(IMIV_BACKEND_VULKAN_GLFW) || defined(IMIV_BACKEND_METAL_GLFW) \
56+
|| defined(IMIV_BACKEND_OPENGL_GLFW)
5557
,
5658
GLFWwindow* window, RendererState& renderer_state
5759
#endif
5860
);
5961

60-
#if defined(IMIV_BACKEND_VULKAN_GLFW)
62+
#if defined(IMIV_BACKEND_VULKAN_GLFW) || defined(IMIV_BACKEND_METAL_GLFW) \
63+
|| defined(IMIV_BACKEND_OPENGL_GLFW)
6164
void
6265
process_developer_post_render_actions(DeveloperUiState& developer_ui,
6366
ViewerState& viewer,

0 commit comments

Comments
 (0)