Skip to content

Commit f52174e

Browse files
committed
Track and show display presentation info
Add DisplayDynamicRange and DisplayPresentationInfo to track display color depth and dynamic range. Introduce display_dynamic_range_name and display_presentation_name helpers and compute/update display_presentation in Metal, OpenGL and Vulkan backends (color bits, range, and fallback status). Add platform_glfw_set_window_title and include the resolved presentation info in the main window title and verbose logging output. Minor refactors: update when windows/swapchains are configured and move framebuffer-bit logging to use the new presentation tracking. Signed-off-by: Vlad <shaamaan@gmail.com>
1 parent e0c3946 commit f52174e

8 files changed

Lines changed: 171 additions & 13 deletions

src/imiv/imiv_app.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,14 @@ namespace {
217217
return sanitize_display_format_preference(static_cast<int>(requested));
218218
}
219219

220+
std::string main_window_title(BackendKind backend,
221+
const DisplayPresentationInfo& presentation)
222+
{
223+
return Strutil::fmt::format("ImIv v.{} [{} / {}]", OIIO_VERSION_STRING,
224+
backend_cli_name(backend),
225+
display_presentation_name(presentation));
226+
}
227+
220228
void apply_glfw_topmost_state_to_platform_windows(GLFWwindow* main_window,
221229
bool always_on_top)
222230
{
@@ -429,8 +437,7 @@ run(const AppConfig& config)
429437
}
430438

431439
const std::string window_title
432-
= Strutil::fmt::format("ImIv v.{} [{}]", OIIO_VERSION_STRING,
433-
backend_cli_name(active_backend));
440+
= main_window_title(active_backend, DisplayPresentationInfo {});
434441
GLFWwindow* window
435442
= platform_glfw_create_main_window(active_backend,
436443
requested_display_format, 1600, 900,
@@ -503,6 +510,10 @@ run(const AppConfig& config)
503510
framebuffer_height, startup_error)) {
504511
return fail_bootstrap(false, true, false);
505512
}
513+
const std::string resolved_window_title
514+
= main_window_title(active_backend,
515+
renderer_state.display_presentation);
516+
platform_glfw_set_window_title(window, resolved_window_title.c_str());
506517

507518
ImGuiIO& io = ImGui::GetIO();
508519
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
@@ -568,6 +579,8 @@ run(const AppConfig& config)
568579
FileDialog::available() ? "enabled" : "disabled");
569580
print("imiv: requested display format: {}\n",
570581
display_format_cli_name(requested_display_format));
582+
print("imiv: display presentation: {}\n",
583+
display_presentation_name(renderer_state.display_presentation));
571584
}
572585

573586
#if !defined(IMGUI_ENABLE_TEST_ENGINE)

src/imiv/imiv_platform_glfw.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,13 @@ platform_glfw_destroy_window(GLFWwindow* window)
245245
glfwDestroyWindow(window);
246246
}
247247

248+
void
249+
platform_glfw_set_window_title(GLFWwindow* window, const char* title)
250+
{
251+
if (window != nullptr && title != nullptr)
252+
glfwSetWindowTitle(window, title);
253+
}
254+
248255
bool
249256
platform_glfw_supports_vulkan(std::string& error_message)
250257
{

src/imiv/imiv_platform_glfw.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ platform_glfw_create_main_window(BackendKind backend,
2828
std::string& error_message);
2929
void
3030
platform_glfw_destroy_window(GLFWwindow* window);
31+
void
32+
platform_glfw_set_window_title(GLFWwindow* window, const char* title);
3133

3234
bool
3335
platform_glfw_supports_vulkan(std::string& error_message);

src/imiv/imiv_renderer.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -759,4 +759,31 @@ renderer_screen_capture(ImGuiID viewport_id, int x, int y, int w, int h,
759759
return vtable->screen_capture(viewport_id, x, y, w, h, pixels, user_data);
760760
}
761761

762+
const char*
763+
display_dynamic_range_name(DisplayDynamicRange range)
764+
{
765+
switch (range) {
766+
case DisplayDynamicRange::Sdr: return "SDR";
767+
case DisplayDynamicRange::Edr: return "EDR";
768+
case DisplayDynamicRange::Hdr: return "HDR";
769+
case DisplayDynamicRange::Unknown: break;
770+
}
771+
return "unknown";
772+
}
773+
774+
std::string
775+
display_presentation_name(const DisplayPresentationInfo& info)
776+
{
777+
const std::string bits = info.color_bits > 0
778+
? OIIO::Strutil::fmt::format("{}-bit",
779+
info.color_bits)
780+
: std::string("**-bit");
781+
std::string label
782+
= OIIO::Strutil::fmt::format("{} {}", bits,
783+
display_dynamic_range_name(info.range));
784+
if (info.format_request_fell_back)
785+
label += " fallback";
786+
return label;
787+
}
788+
762789
} // namespace Imiv

src/imiv/imiv_renderer.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,21 @@ struct RendererBackendVTable;
2222
struct RendererBackendState;
2323
struct RendererTextureBackendState;
2424

25+
enum class DisplayDynamicRange : int { Unknown = 0, Sdr = 1, Edr = 2, Hdr = 3 };
26+
27+
struct DisplayPresentationInfo {
28+
int color_bits = 8;
29+
DisplayDynamicRange range = DisplayDynamicRange::Sdr;
30+
bool format_request_fell_back = false;
31+
};
32+
2533
struct RendererState {
2634
const RendererBackendVTable* vtable = nullptr;
2735
RendererBackendState* backend = nullptr;
2836
BackendKind active_backend = BackendKind::Auto;
2937
DisplayFormatPreference requested_display_format
3038
= DisplayFormatPreference::Auto;
39+
DisplayPresentationInfo display_presentation;
3140
bool verbose_logging = false;
3241
bool verbose_validation_output = false;
3342
bool log_imgui_texture_updates = false;
@@ -239,5 +248,9 @@ renderer_frame_present(RendererState& renderer_state);
239248
bool
240249
renderer_screen_capture(ImGuiID viewport_id, int x, int y, int w, int h,
241250
unsigned int* pixels, void* user_data);
251+
const char*
252+
display_dynamic_range_name(DisplayDynamicRange range);
253+
std::string
254+
display_presentation_name(const DisplayPresentationInfo& info);
242255

243256
} // namespace Imiv

src/imiv/imiv_renderer_metal.mm

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,44 @@ size_t metal_max_upload_chunk_bytes()
198198
return "unknown";
199199
}
200200

201+
int metal_display_color_bits(MTLPixelFormat pixel_format)
202+
{
203+
switch (pixel_format) {
204+
case MTLPixelFormatBGRA8Unorm: return 8;
205+
case MTLPixelFormatRGB10A2Unorm:
206+
case MTLPixelFormatBGR10A2Unorm: return 10;
207+
case MTLPixelFormatRGBA16Float: return 16;
208+
default: break;
209+
}
210+
return 0;
211+
}
212+
213+
DisplayDynamicRange metal_display_dynamic_range(MTLPixelFormat pixel_format)
214+
{
215+
switch (pixel_format) {
216+
case MTLPixelFormatBGRA8Unorm:
217+
case MTLPixelFormatRGB10A2Unorm:
218+
case MTLPixelFormatBGR10A2Unorm: return DisplayDynamicRange::Sdr;
219+
case MTLPixelFormatRGBA16Float: return DisplayDynamicRange::Hdr;
220+
default: break;
221+
}
222+
return DisplayDynamicRange::Unknown;
223+
}
224+
225+
void update_metal_display_presentation(RendererState& renderer_state,
226+
MTLPixelFormat pixel_format)
227+
{
228+
DisplayPresentationInfo info;
229+
info.color_bits = metal_display_color_bits(pixel_format);
230+
info.range = metal_display_dynamic_range(pixel_format);
231+
info.format_request_fell_back = renderer_state.requested_display_format
232+
== DisplayFormatPreference::Rgb10A2
233+
&& (info.color_bits < 10
234+
|| info.range
235+
!= DisplayDynamicRange::Sdr);
236+
renderer_state.display_presentation = info;
237+
}
238+
201239
void configure_metal_display_formats(MetalRendererBackendState& state,
202240
RendererState& renderer_state)
203241
{
@@ -2070,6 +2108,8 @@ bool metal_setup_window(RendererState& renderer_state, int width,
20702108
state->render_pass = [MTLRenderPassDescriptor new];
20712109
renderer_set_framebuffer_size(renderer_state, width, height);
20722110
update_drawable_size(renderer_state);
2111+
update_metal_display_presentation(renderer_state,
2112+
state->display_pixel_format);
20732113
if (renderer_state.verbose_logging) {
20742114
const bool fell_back = state->requested_display_format
20752115
== DisplayFormatPreference::Rgb10A2

src/imiv/imiv_renderer_opengl.cpp

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1807,10 +1807,8 @@ void main()
18071807
return true;
18081808
}
18091809

1810-
void log_opengl_framebuffer_bits(RendererState& renderer_state)
1810+
void update_opengl_display_presentation(RendererState& renderer_state)
18111811
{
1812-
if (!renderer_state.verbose_logging)
1813-
return;
18141812
GLint red_bits = 0;
18151813
GLint green_bits = 0;
18161814
GLint blue_bits = 0;
@@ -1819,12 +1817,23 @@ void main()
18191817
glGetIntegerv(GL_GREEN_BITS, &green_bits);
18201818
glGetIntegerv(GL_BLUE_BITS, &blue_bits);
18211819
glGetIntegerv(GL_ALPHA_BITS, &alpha_bits);
1822-
std::cout << "imiv: OpenGL display format requested="
1823-
<< display_format_cli_name(
1824-
renderer_state.requested_display_format)
1825-
<< " actual framebuffer bits=" << red_bits << ','
1826-
<< green_bits << ',' << blue_bits << ',' << alpha_bits
1827-
<< "\n";
1820+
DisplayPresentationInfo info;
1821+
info.color_bits = std::min(red_bits, std::min(green_bits, blue_bits));
1822+
if (info.color_bits <= 0)
1823+
info.color_bits = 0;
1824+
info.range = DisplayDynamicRange::Sdr;
1825+
info.format_request_fell_back = renderer_state.requested_display_format
1826+
== DisplayFormatPreference::Rgb10A2
1827+
&& info.color_bits < 10;
1828+
renderer_state.display_presentation = info;
1829+
if (renderer_state.verbose_logging) {
1830+
std::cout << "imiv: OpenGL display format requested="
1831+
<< display_format_cli_name(
1832+
renderer_state.requested_display_format)
1833+
<< " actual framebuffer bits=" << red_bits << ','
1834+
<< green_bits << ',' << blue_bits << ',' << alpha_bits
1835+
<< "\n";
1836+
}
18281837
}
18291838

18301839
const RendererBackendVTable k_opengl_vtable = {
@@ -1871,7 +1880,7 @@ void main()
18711880
return false;
18721881
state->window = window;
18731882
platform_glfw_make_context_current(window);
1874-
log_opengl_framebuffer_bits(renderer_state);
1883+
update_opengl_display_presentation(renderer_state);
18751884
error_message.clear();
18761885
return true;
18771886
},

src/imiv/imiv_renderer_vulkan.cpp

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,49 @@ namespace {
6262
return backend_state<VulkanState>(renderer_state);
6363
}
6464

65+
int vulkan_display_color_bits(VkFormat format)
66+
{
67+
switch (format) {
68+
case VK_FORMAT_B8G8R8A8_UNORM:
69+
case VK_FORMAT_B8G8R8A8_SRGB:
70+
case VK_FORMAT_R8G8B8A8_UNORM:
71+
case VK_FORMAT_R8G8B8A8_SRGB:
72+
case VK_FORMAT_B8G8R8_UNORM:
73+
case VK_FORMAT_B8G8R8_SRGB:
74+
case VK_FORMAT_R8G8B8_UNORM:
75+
case VK_FORMAT_R8G8B8_SRGB: return 8;
76+
case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
77+
case VK_FORMAT_A2R10G10B10_UNORM_PACK32: return 10;
78+
default: break;
79+
}
80+
return 0;
81+
}
82+
83+
DisplayDynamicRange vulkan_display_dynamic_range(VkColorSpaceKHR color_space)
84+
{
85+
switch (color_space) {
86+
case VK_COLORSPACE_SRGB_NONLINEAR_KHR: return DisplayDynamicRange::Sdr;
87+
default: break;
88+
}
89+
return DisplayDynamicRange::Unknown;
90+
}
91+
92+
void update_vulkan_display_presentation(RendererState& renderer_state,
93+
const VulkanState& vk_state)
94+
{
95+
DisplayPresentationInfo info;
96+
info.color_bits = vulkan_display_color_bits(
97+
vk_state.window_data.SurfaceFormat.format);
98+
info.range = vulkan_display_dynamic_range(
99+
vk_state.window_data.SurfaceFormat.colorSpace);
100+
info.format_request_fell_back = renderer_state.requested_display_format
101+
== DisplayFormatPreference::Rgb10A2
102+
&& (info.color_bits < 10
103+
|| info.range
104+
!= DisplayDynamicRange::Sdr);
105+
renderer_state.display_presentation = info;
106+
}
107+
65108
bool vulkan_get_viewer_texture_refs(const ViewerState& viewer,
66109
const PlaceholderUiState& ui_state,
67110
ImTextureRef& main_texture_ref,
@@ -267,6 +310,7 @@ namespace {
267310
width, height, vk_state->min_image_count,
268311
vk_state->window_image_usage);
269312
name_window_frame_objects(*vk_state);
313+
update_vulkan_display_presentation(renderer_state, *vk_state);
270314
vk_state->window_data.FrameIndex = 0;
271315
vk_state->swapchain_rebuild = false;
272316
}
@@ -306,7 +350,10 @@ namespace {
306350
if (vk_state == nullptr)
307351
return false;
308352
renderer_set_framebuffer_size(renderer_state, width, height);
309-
return setup_vulkan_window(*vk_state, width, height, error_message);
353+
if (!setup_vulkan_window(*vk_state, width, height, error_message))
354+
return false;
355+
update_vulkan_display_presentation(renderer_state, *vk_state);
356+
return true;
310357
},
311358
[](RendererState& renderer_state, GLFWwindow* window,
312359
std::string& error_message) {

0 commit comments

Comments
 (0)