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))
[self setWantsExtendedDynamicRangeContent:YES];
[self setDevice:device];
[self setOpaque:NO];
[self setDisplaySyncEnabled:NO];
[self setPresentsWithTransaction:YES];
}
return self;
......@@ -150,8 +149,9 @@ API_AVAILABLE(macos(10.15))
destinationLevel:0
destinationOrigin:MTLOriginMake(0, 0, 0)];
[encoder endEncoding];
[command_buffer presentDrawable:drawable];
[command_buffer commit];
[command_buffer waitUntilScheduled];
[drawable present];
}
@end
......
......@@ -143,7 +143,7 @@ bool BrowserCompositorMac::UpdateSurfaceFromNSView(
if (recyclable_compositor_) {
recyclable_compositor_->UpdateSurface(dfh_size_pixels_,
dfh_display_.device_scale_factor(),
dfh_display_.color_space());
dfh_display_.color_spaces());
}
return true;
......@@ -165,7 +165,7 @@ void BrowserCompositorMac::UpdateSurfaceFromChild(
if (recyclable_compositor_) {
recyclable_compositor_->UpdateSurface(
dfh_size_pixels_, dfh_display_.device_scale_factor(),
dfh_display_.color_space());
dfh_display_.color_spaces());
}
}
delegated_frame_host_->EmbedSurface(
......@@ -271,7 +271,7 @@ void BrowserCompositorMac::TransitionToState(State new_state) {
content::GetContextFactory(), content::GetContextFactoryPrivate());
recyclable_compositor_->UpdateSurface(dfh_size_pixels_,
dfh_display_.device_scale_factor(),
dfh_display_.color_space());
dfh_display_.color_spaces());
recyclable_compositor_->compositor()->SetRootLayer(root_layer_.get());
recyclable_compositor_->compositor()->SetBackgroundColor(background_color_);
recyclable_compositor_->widget()->SetNSView(
......
......@@ -70,7 +70,7 @@ void RecyclableCompositorMac::Unsuspend() {
void RecyclableCompositorMac::UpdateSurface(
const gfx::Size& size_pixels,
float scale_factor,
const gfx::ColorSpace& color_space) {
const gfx::DisplayColorSpaces& display_color_spaces) {
if (size_pixels != size_pixels_ || scale_factor != scale_factor_) {
size_pixels_ = size_pixels;
scale_factor_ = scale_factor;
......@@ -80,9 +80,9 @@ void RecyclableCompositorMac::UpdateSurface(
compositor()->SetScaleAndSize(scale_factor_, size_pixels_,
local_surface_id_allocation);
}
if (color_space != color_space_) {
color_space_ = color_space;
compositor()->SetDisplayColorSpaces(gfx::DisplayColorSpaces(color_space_));
if (display_color_spaces != display_color_spaces_) {
display_color_spaces_ = display_color_spaces;
compositor()->SetDisplayColorSpaces(display_color_spaces_);
}
}
......@@ -90,7 +90,7 @@ void RecyclableCompositorMac::InvalidateSurface() {
size_pixels_ = gfx::Size();
scale_factor_ = 1.f;
local_surface_id_allocator_.Invalidate();
color_space_ = gfx::ColorSpace();
display_color_spaces_ = gfx::DisplayColorSpaces();
compositor()->SetScaleAndSize(
scale_factor_, size_pixels_,
local_surface_id_allocator_.GetCurrentLocalSurfaceIdAllocation());
......
......@@ -43,7 +43,7 @@ class COMPOSITOR_EXPORT RecyclableCompositorMac
// Update the compositor's surface information, if needed.
void UpdateSurface(const gfx::Size& size_pixels,
float scale_factor,
const gfx::ColorSpace& color_space);
const gfx::DisplayColorSpaces& display_color_spaces);
// Invalidate the compositor's surface information.
void InvalidateSurface();
......@@ -58,7 +58,7 @@ class COMPOSITOR_EXPORT RecyclableCompositorMac
viz::ParentLocalSurfaceIdAllocator local_surface_id_allocator_;
gfx::Size size_pixels_;
float scale_factor_ = 1.f;
gfx::ColorSpace color_space_;
gfx::DisplayColorSpaces display_color_spaces_;
std::unique_ptr<ui::AcceleratedWidgetMac> accelerated_widget_mac_;
ui::Compositor compositor_;
......
......@@ -16,6 +16,7 @@
#include "base/mac/mac_util.h"
#include "base/mac/scoped_cftyperef.h"
#include "base/mac/scoped_nsobject.h"
#include "base/mac/sdk_forward_declarations.h"
#include "base/stl_util.h"
#include "base/timer/timer.h"
#include "ui/display/display.h"
......@@ -81,32 +82,57 @@ Display BuildDisplayForScreen(NSScreen* screen) {
scale = Display::GetForcedDeviceScaleFactor();
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;
{
CGColorSpaceRef cg_color_space = [[screen colorSpace] CGColorSpace];
if (cg_color_space) {
base::ScopedCFTypeRef<CFDataRef> cf_icc_profile(
CGColorSpaceCopyICCProfile(cg_color_space));
if (cf_icc_profile) {
icc_profile = gfx::ICCProfile::FromData(CFDataGetBytePtr(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());
gfx::ColorSpace screen_color_space = icc_profile.GetColorSpace();
}
if (Display::HasForceDisplayColorProfile()) {
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 "
"was forced by the command line. This will cause pixel tests to "
"fail.";
}
} 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);
}
if (enable_hdr) {
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());
if (auto display_link = ui::DisplayLinkMac::GetForDisplay(display_id))
......
......@@ -36,6 +36,13 @@ DisplayColorSpaces::DisplayColorSpaces(const gfx::ColorSpace& 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(
ContentColorUsage color_usage,
bool needs_alpha,
......
......@@ -39,6 +39,9 @@ class COLOR_SPACE_EXPORT DisplayColorSpaces {
// Initialize as |color_space| for all settings.
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
// specified content is being displayed.
void SetOutputColorSpaceAndBufferFormat(ContentColorUsage color_usage,
......
......@@ -529,7 +529,7 @@ void NativeWidgetMacNSWindowHost::UpdateCompositorProperties() {
layer()->SetBounds(gfx::Rect(surface_size_in_dip));
compositor_->UpdateSurface(
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() {
......@@ -989,7 +989,7 @@ void NativeWidgetMacNSWindowHost::OnWindowDisplayChanged(
compositor_->UpdateSurface(
ConvertSizeToPixel(display_.device_scale_factor(),
content_bounds_in_screen_.size()),
display_.device_scale_factor(), display_.color_space());
display_.device_scale_factor(), display_.color_spaces());
}
if (display_id_changed) {
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