diff --git a/drivers/apple_embedded/display_server_apple_embedded.mm b/drivers/apple_embedded/display_server_apple_embedded.mm index 587e526e826e..3e0915151e8e 100644 --- a/drivers/apple_embedded/display_server_apple_embedded.mm +++ b/drivers/apple_embedded/display_server_apple_embedded.mm @@ -837,6 +837,7 @@ _FORCE_INLINE_ int _convert_utf32_offset_to_utf16(const String &p_existing_text, float reference_luminance = _calculate_current_reference_luminance(); rendering_context->window_set_hdr_output_reference_luminance(DisplayServerEnums::MAIN_WINDOW_ID, reference_luminance); + rendering_context->window_set_hdr_output_linear_luminance_scale(DisplayServerEnums::MAIN_WINDOW_ID, reference_luminance); float max_luminance = _screen_potential_edr_headroom() * hardware_reference_luminance_nits; rendering_context->window_set_hdr_output_max_luminance(DisplayServerEnums::MAIN_WINDOW_ID, max_luminance); diff --git a/drivers/metal/rendering_context_driver_metal.cpp b/drivers/metal/rendering_context_driver_metal.cpp index a749de8259b4..951ff862d57d 100644 --- a/drivers/metal/rendering_context_driver_metal.cpp +++ b/drivers/metal/rendering_context_driver_metal.cpp @@ -461,11 +461,13 @@ float RenderingContextDriverMetal::surface_get_hdr_output_max_luminance(SurfaceI } void RenderingContextDriverMetal::surface_set_hdr_output_linear_luminance_scale(SurfaceID p_surface, float p_linear_luminance_scale) { + Surface *surface = (Surface *)(p_surface); + surface->hdr_linear_luminance_scale = p_linear_luminance_scale; } float RenderingContextDriverMetal::surface_get_hdr_output_linear_luminance_scale(SurfaceID p_surface) const { Surface *surface = (Surface *)(p_surface); - return surface->hdr_reference_luminance; + return surface->hdr_linear_luminance_scale; } float RenderingContextDriverMetal::surface_get_hdr_output_max_value(SurfaceID p_surface) const { diff --git a/drivers/metal/rendering_context_driver_metal.h b/drivers/metal/rendering_context_driver_metal.h index d417fa8ba87b..4910c88ee19b 100644 --- a/drivers/metal/rendering_context_driver_metal.h +++ b/drivers/metal/rendering_context_driver_metal.h @@ -98,6 +98,8 @@ class API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0)) RenderingContextDriverMe // to be a more pleasant player-facing value. float hdr_reference_luminance = 200.0f; float hdr_max_luminance = 1000.0f; + // linear_luminance_scale must always equal hdr_reference_luminance on Apple platforms. + float hdr_linear_luminance_scale = 200.0f; bool needs_resize = false; bool hdr_output = false; diff --git a/drivers/vulkan/rendering_device_driver_vulkan.cpp b/drivers/vulkan/rendering_device_driver_vulkan.cpp index 3896bd3f4241..1b6941bf4daa 100644 --- a/drivers/vulkan/rendering_device_driver_vulkan.cpp +++ b/drivers/vulkan/rendering_device_driver_vulkan.cpp @@ -7332,8 +7332,8 @@ bool RenderingDeviceDriverVulkan::has_feature(Features p_feature) { // involving integrated GPU hardware do not function correctly // with HDR output. return false; -#elif defined(MACOS_ENABLED) || defined(APPLE_EMBEDDED_ENABLED) - // HDR support has not yet been thoroughly tested and validated for Apple platforms. +#elif defined(APPLE_EMBEDDED_ENABLED) + // HDR output with Vulkan currently does not function correctly on iOS. (Tested on iPhone 13 Pro, iOS 26.3.1(a)) return false; #else return context_driver->is_colorspace_supported(); diff --git a/platform/macos/display_server_macos_base.mm b/platform/macos/display_server_macos_base.mm index 3cfe1c3a5c49..81f2ade1f783 100644 --- a/platform/macos/display_server_macos_base.mm +++ b/platform/macos/display_server_macos_base.mm @@ -569,6 +569,7 @@ float current_ref_luminance = rendering_context->window_get_hdr_output_reference_luminance(p_window); if (!Math::is_equal_approx(current_ref_luminance, new_reference_luminance)) { rendering_context->window_set_hdr_output_reference_luminance(p_window, new_reference_luminance); + rendering_context->window_set_hdr_output_linear_luminance_scale(p_window, new_reference_luminance); hdr_state_changed = true; }