Commit 9aaf7905 authored by Christopher Cameron's avatar Christopher Cameron Committed by Commit Bot

Re-enable HDR on macOS

Detect HDR capability and use it to populate DisplayColorSpaces. Add
DisplayColorSpaces constructor that takes BufferFormat (we'll need it).

Update ui::RecyclableCompositorMac to take DisplayColorSpaces instead
of ColorSpace (they were dropping the data on the floor).

Update HDRCopierLayer to use PresentsWithTransaction correctly.

Bug: 1049334
Change-Id: I17a0f75ac08e75d0b38825a38ee0d738ca634059
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2049663Reviewed-by: default avatarKhushal <khushalsagar@chromium.org>
Commit-Queue: ccameron <ccameron@chromium.org>
Cr-Commit-Position: refs/heads/master@{#740374}
parent 0a4949d3
...@@ -74,7 +74,6 @@ API_AVAILABLE(macos(10.15)) ...@@ -74,7 +74,6 @@ API_AVAILABLE(macos(10.15))
[self setWantsExtendedDynamicRangeContent:YES]; [self setWantsExtendedDynamicRangeContent:YES];
[self setDevice:device]; [self setDevice:device];
[self setOpaque:NO]; [self setOpaque:NO];
[self setDisplaySyncEnabled:NO];
[self setPresentsWithTransaction:YES]; [self setPresentsWithTransaction:YES];
} }
return self; return self;
...@@ -150,8 +149,9 @@ API_AVAILABLE(macos(10.15)) ...@@ -150,8 +149,9 @@ API_AVAILABLE(macos(10.15))
destinationLevel:0 destinationLevel:0
destinationOrigin:MTLOriginMake(0, 0, 0)]; destinationOrigin:MTLOriginMake(0, 0, 0)];
[encoder endEncoding]; [encoder endEncoding];
[command_buffer presentDrawable:drawable];
[command_buffer commit]; [command_buffer commit];
[command_buffer waitUntilScheduled];
[drawable present];
} }
@end @end
......
...@@ -143,7 +143,7 @@ bool BrowserCompositorMac::UpdateSurfaceFromNSView( ...@@ -143,7 +143,7 @@ bool BrowserCompositorMac::UpdateSurfaceFromNSView(
if (recyclable_compositor_) { if (recyclable_compositor_) {
recyclable_compositor_->UpdateSurface(dfh_size_pixels_, recyclable_compositor_->UpdateSurface(dfh_size_pixels_,
dfh_display_.device_scale_factor(), dfh_display_.device_scale_factor(),
dfh_display_.color_space()); dfh_display_.color_spaces());
} }
return true; return true;
...@@ -165,7 +165,7 @@ void BrowserCompositorMac::UpdateSurfaceFromChild( ...@@ -165,7 +165,7 @@ void BrowserCompositorMac::UpdateSurfaceFromChild(
if (recyclable_compositor_) { if (recyclable_compositor_) {
recyclable_compositor_->UpdateSurface( recyclable_compositor_->UpdateSurface(
dfh_size_pixels_, dfh_display_.device_scale_factor(), dfh_size_pixels_, dfh_display_.device_scale_factor(),
dfh_display_.color_space()); dfh_display_.color_spaces());
} }
} }
delegated_frame_host_->EmbedSurface( delegated_frame_host_->EmbedSurface(
...@@ -271,7 +271,7 @@ void BrowserCompositorMac::TransitionToState(State new_state) { ...@@ -271,7 +271,7 @@ void BrowserCompositorMac::TransitionToState(State new_state) {
content::GetContextFactory(), content::GetContextFactoryPrivate()); content::GetContextFactory(), content::GetContextFactoryPrivate());
recyclable_compositor_->UpdateSurface(dfh_size_pixels_, recyclable_compositor_->UpdateSurface(dfh_size_pixels_,
dfh_display_.device_scale_factor(), dfh_display_.device_scale_factor(),
dfh_display_.color_space()); dfh_display_.color_spaces());
recyclable_compositor_->compositor()->SetRootLayer(root_layer_.get()); recyclable_compositor_->compositor()->SetRootLayer(root_layer_.get());
recyclable_compositor_->compositor()->SetBackgroundColor(background_color_); recyclable_compositor_->compositor()->SetBackgroundColor(background_color_);
recyclable_compositor_->widget()->SetNSView( recyclable_compositor_->widget()->SetNSView(
......
...@@ -70,7 +70,7 @@ void RecyclableCompositorMac::Unsuspend() { ...@@ -70,7 +70,7 @@ void RecyclableCompositorMac::Unsuspend() {
void RecyclableCompositorMac::UpdateSurface( void RecyclableCompositorMac::UpdateSurface(
const gfx::Size& size_pixels, const gfx::Size& size_pixels,
float scale_factor, float scale_factor,
const gfx::ColorSpace& color_space) { const gfx::DisplayColorSpaces& display_color_spaces) {
if (size_pixels != size_pixels_ || scale_factor != scale_factor_) { if (size_pixels != size_pixels_ || scale_factor != scale_factor_) {
size_pixels_ = size_pixels; size_pixels_ = size_pixels;
scale_factor_ = scale_factor; scale_factor_ = scale_factor;
...@@ -80,9 +80,9 @@ void RecyclableCompositorMac::UpdateSurface( ...@@ -80,9 +80,9 @@ void RecyclableCompositorMac::UpdateSurface(
compositor()->SetScaleAndSize(scale_factor_, size_pixels_, compositor()->SetScaleAndSize(scale_factor_, size_pixels_,
local_surface_id_allocation); local_surface_id_allocation);
} }
if (color_space != color_space_) { if (display_color_spaces != display_color_spaces_) {
color_space_ = color_space; display_color_spaces_ = display_color_spaces;
compositor()->SetDisplayColorSpaces(gfx::DisplayColorSpaces(color_space_)); compositor()->SetDisplayColorSpaces(display_color_spaces_);
} }
} }
...@@ -90,7 +90,7 @@ void RecyclableCompositorMac::InvalidateSurface() { ...@@ -90,7 +90,7 @@ void RecyclableCompositorMac::InvalidateSurface() {
size_pixels_ = gfx::Size(); size_pixels_ = gfx::Size();
scale_factor_ = 1.f; scale_factor_ = 1.f;
local_surface_id_allocator_.Invalidate(); local_surface_id_allocator_.Invalidate();
color_space_ = gfx::ColorSpace(); display_color_spaces_ = gfx::DisplayColorSpaces();
compositor()->SetScaleAndSize( compositor()->SetScaleAndSize(
scale_factor_, size_pixels_, scale_factor_, size_pixels_,
local_surface_id_allocator_.GetCurrentLocalSurfaceIdAllocation()); local_surface_id_allocator_.GetCurrentLocalSurfaceIdAllocation());
......
...@@ -43,7 +43,7 @@ class COMPOSITOR_EXPORT RecyclableCompositorMac ...@@ -43,7 +43,7 @@ class COMPOSITOR_EXPORT RecyclableCompositorMac
// Update the compositor's surface information, if needed. // Update the compositor's surface information, if needed.
void UpdateSurface(const gfx::Size& size_pixels, void UpdateSurface(const gfx::Size& size_pixels,
float scale_factor, float scale_factor,
const gfx::ColorSpace& color_space); const gfx::DisplayColorSpaces& display_color_spaces);
// Invalidate the compositor's surface information. // Invalidate the compositor's surface information.
void InvalidateSurface(); void InvalidateSurface();
...@@ -58,7 +58,7 @@ class COMPOSITOR_EXPORT RecyclableCompositorMac ...@@ -58,7 +58,7 @@ class COMPOSITOR_EXPORT RecyclableCompositorMac
viz::ParentLocalSurfaceIdAllocator local_surface_id_allocator_; viz::ParentLocalSurfaceIdAllocator local_surface_id_allocator_;
gfx::Size size_pixels_; gfx::Size size_pixels_;
float scale_factor_ = 1.f; float scale_factor_ = 1.f;
gfx::ColorSpace color_space_; gfx::DisplayColorSpaces display_color_spaces_;
std::unique_ptr<ui::AcceleratedWidgetMac> accelerated_widget_mac_; std::unique_ptr<ui::AcceleratedWidgetMac> accelerated_widget_mac_;
ui::Compositor compositor_; ui::Compositor compositor_;
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "base/mac/mac_util.h" #include "base/mac/mac_util.h"
#include "base/mac/scoped_cftyperef.h" #include "base/mac/scoped_cftyperef.h"
#include "base/mac/scoped_nsobject.h" #include "base/mac/scoped_nsobject.h"
#include "base/mac/sdk_forward_declarations.h"
#include "base/stl_util.h" #include "base/stl_util.h"
#include "base/timer/timer.h" #include "base/timer/timer.h"
#include "ui/display/display.h" #include "ui/display/display.h"
...@@ -81,32 +82,57 @@ Display BuildDisplayForScreen(NSScreen* screen) { ...@@ -81,32 +82,57 @@ Display BuildDisplayForScreen(NSScreen* screen) {
scale = Display::GetForcedDeviceScaleFactor(); scale = Display::GetForcedDeviceScaleFactor();
display.set_device_scale_factor(scale); display.set_device_scale_factor(scale);
// Compute the color profile. // Examine the presence of HDR.
bool enable_hdr = false;
if (@available(macOS 10.15, *)) {
if ([screen maximumPotentialExtendedDynamicRangeColorComponentValue] >=
2.0) {
enable_hdr = true;
}
}
// Compute DisplayColorSpaces.
gfx::ICCProfile icc_profile; gfx::ICCProfile icc_profile;
CGColorSpaceRef cg_color_space = [[screen colorSpace] CGColorSpace]; {
if (cg_color_space) { CGColorSpaceRef cg_color_space = [[screen colorSpace] CGColorSpace];
base::ScopedCFTypeRef<CFDataRef> cf_icc_profile( if (cg_color_space) {
CGColorSpaceCopyICCProfile(cg_color_space)); base::ScopedCFTypeRef<CFDataRef> cf_icc_profile(
if (cf_icc_profile) { CGColorSpaceCopyICCProfile(cg_color_space));
icc_profile = gfx::ICCProfile::FromData(CFDataGetBytePtr(cf_icc_profile), if (cf_icc_profile) {
CFDataGetLength(cf_icc_profile)); icc_profile = gfx::ICCProfile::FromData(
CFDataGetBytePtr(cf_icc_profile), CFDataGetLength(cf_icc_profile));
}
} }
icc_profile.HistogramDisplay(display.id());
} }
icc_profile.HistogramDisplay(display.id());
gfx::ColorSpace screen_color_space = icc_profile.GetColorSpace();
if (Display::HasForceDisplayColorProfile()) { if (Display::HasForceDisplayColorProfile()) {
if (Display::HasEnsureForcedColorProfile()) { if (Display::HasEnsureForcedColorProfile()) {
CHECK_EQ(screen_color_space, display.color_space()) CHECK_EQ(icc_profile.GetColorSpace(), display.color_space())
<< "The display's color space does not match the color space that " << "The display's color space does not match the color space that "
"was forced by the command line. This will cause pixel tests to " "was forced by the command line. This will cause pixel tests to "
"fail."; "fail.";
} }
} else { } else {
display.set_color_space(screen_color_space); gfx::DisplayColorSpaces display_color_spaces(icc_profile.GetColorSpace(),
gfx::BufferFormat::RGBA_8888);
if (enable_hdr) {
bool needs_alpha_values[] = {true, false};
for (const auto& needs_alpha : needs_alpha_values) {
display_color_spaces.SetOutputColorSpaceAndBufferFormat(
gfx::ContentColorUsage::kHDR, needs_alpha,
gfx::ColorSpace::CreateExtendedSRGB(), gfx::BufferFormat::RGBA_F16);
}
}
display.set_color_spaces(display_color_spaces);
} }
display.set_color_depth(Display::kDefaultBitsPerPixel); if (enable_hdr) {
display.set_depth_per_component(Display::kDefaultBitsPerComponent); display.set_color_depth(Display::kHDR10BitsPerPixel);
display.set_depth_per_component(Display::kHDR10BitsPerComponent);
} else {
display.set_color_depth(Display::kDefaultBitsPerPixel);
display.set_depth_per_component(Display::kDefaultBitsPerComponent);
}
display.set_is_monochrome(CGDisplayUsesForceToGray()); display.set_is_monochrome(CGDisplayUsesForceToGray());
if (auto display_link = ui::DisplayLinkMac::GetForDisplay(display_id)) if (auto display_link = ui::DisplayLinkMac::GetForDisplay(display_id))
......
...@@ -36,6 +36,13 @@ DisplayColorSpaces::DisplayColorSpaces(const gfx::ColorSpace& c) ...@@ -36,6 +36,13 @@ DisplayColorSpaces::DisplayColorSpaces(const gfx::ColorSpace& c)
color_space = c; color_space = c;
} }
DisplayColorSpaces::DisplayColorSpaces(const ColorSpace& c, BufferFormat f) {
for (auto& color_space : color_spaces_)
color_space = c;
for (auto& buffer_format : buffer_formats_)
buffer_format = f;
}
void DisplayColorSpaces::SetOutputColorSpaceAndBufferFormat( void DisplayColorSpaces::SetOutputColorSpaceAndBufferFormat(
ContentColorUsage color_usage, ContentColorUsage color_usage,
bool needs_alpha, bool needs_alpha,
......
...@@ -39,6 +39,9 @@ class COLOR_SPACE_EXPORT DisplayColorSpaces { ...@@ -39,6 +39,9 @@ class COLOR_SPACE_EXPORT DisplayColorSpaces {
// Initialize as |color_space| for all settings. // Initialize as |color_space| for all settings.
explicit DisplayColorSpaces(const ColorSpace& color_space); explicit DisplayColorSpaces(const ColorSpace& color_space);
// Initialize as |color_space| and |buffer_format| for all settings.
DisplayColorSpaces(const ColorSpace& color_space, BufferFormat buffer_format);
// Set the color space and buffer format for the final output surface when the // Set the color space and buffer format for the final output surface when the
// specified content is being displayed. // specified content is being displayed.
void SetOutputColorSpaceAndBufferFormat(ContentColorUsage color_usage, void SetOutputColorSpaceAndBufferFormat(ContentColorUsage color_usage,
......
...@@ -529,7 +529,7 @@ void NativeWidgetMacNSWindowHost::UpdateCompositorProperties() { ...@@ -529,7 +529,7 @@ void NativeWidgetMacNSWindowHost::UpdateCompositorProperties() {
layer()->SetBounds(gfx::Rect(surface_size_in_dip)); layer()->SetBounds(gfx::Rect(surface_size_in_dip));
compositor_->UpdateSurface( compositor_->UpdateSurface(
ConvertSizeToPixel(display_.device_scale_factor(), surface_size_in_dip), ConvertSizeToPixel(display_.device_scale_factor(), surface_size_in_dip),
display_.device_scale_factor(), display_.color_space()); display_.device_scale_factor(), display_.color_spaces());
} }
void NativeWidgetMacNSWindowHost::DestroyCompositor() { void NativeWidgetMacNSWindowHost::DestroyCompositor() {
...@@ -989,7 +989,7 @@ void NativeWidgetMacNSWindowHost::OnWindowDisplayChanged( ...@@ -989,7 +989,7 @@ void NativeWidgetMacNSWindowHost::OnWindowDisplayChanged(
compositor_->UpdateSurface( compositor_->UpdateSurface(
ConvertSizeToPixel(display_.device_scale_factor(), ConvertSizeToPixel(display_.device_scale_factor(),
content_bounds_in_screen_.size()), content_bounds_in_screen_.size()),
display_.device_scale_factor(), display_.color_space()); display_.device_scale_factor(), display_.color_spaces());
} }
if (display_id_changed) { if (display_id_changed) {
display_link_ = ui::DisplayLinkMac::GetForDisplay(display_.id()); display_link_ = ui::DisplayLinkMac::GetForDisplay(display_.id());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment