| Index: content/browser/compositor/gpu_output_surface_mac.mm
|
| diff --git a/content/browser/compositor/gpu_output_surface_mac.mm b/content/browser/compositor/gpu_output_surface_mac.mm
|
| index 4f46585c6247688089ee3f33733b508fca6ffb1e..6d3600942c52610cafc6c643b577b4a2d546bf8f 100644
|
| --- a/content/browser/compositor/gpu_output_surface_mac.mm
|
| +++ b/content/browser/compositor/gpu_output_surface_mac.mm
|
| @@ -4,13 +4,18 @@
|
|
|
| #include "content/browser/compositor/gpu_output_surface_mac.h"
|
|
|
| +#include "base/trace_event/trace_event.h"
|
| +#include "cc/output/ca_layer_overlay.h"
|
| #include "components/display_compositor/compositor_overlay_candidate_validator.h"
|
| #include "content/browser/gpu/gpu_surface_tracker.h"
|
| #include "content/common/gpu/client/context_provider_command_buffer.h"
|
| #include "gpu/GLES2/gl2extchromium.h"
|
| #include "gpu/ipc/client/gpu_process_hosted_ca_layer_tree_params.h"
|
| #include "ui/accelerated_widget_mac/accelerated_widget_mac.h"
|
| +#include "ui/accelerated_widget_mac/ca_layer_tree_coordinator.h"
|
| +#include "ui/accelerated_widget_mac/ca_renderer_layer_tree.h"
|
| #include "ui/base/cocoa/remote_layer_api.h"
|
| +#include "ui/gfx/geometry/rect_conversions.h"
|
| #include "ui/gfx/mac/io_surface.h"
|
|
|
| namespace content {
|
| @@ -62,10 +67,17 @@ void UpdateLayers(CAContextID content_ca_context_id,
|
| GL_TEXTURE_RECTANGLE_ARB,
|
| GL_RGBA,
|
| gpu_memory_buffer_manager),
|
| - remote_layers_(new RemoteLayers) {}
|
| + remote_layers_(new RemoteLayers),
|
| + ca_layer_tree_coordinator_(new ui::CALayerTreeCoordinator(true)) {}
|
|
|
| GpuOutputSurfaceMac::~GpuOutputSurfaceMac() {}
|
|
|
| +void GpuOutputSurfaceMac::Reshape(const gfx::Size& size, float scale_factor, bool alpha) {
|
| + GpuSurfacelessBrowserCompositorOutputSurface::Reshape(size, scale_factor, alpha);
|
| +
|
| + ca_layer_tree_coordinator_->Resize(size, scale_factor);
|
| +}
|
| +
|
| void GpuOutputSurfaceMac::SwapBuffers(cc::CompositorFrame* frame) {
|
| GpuSurfacelessBrowserCompositorOutputSurface::SwapBuffers(frame);
|
|
|
| @@ -86,7 +98,18 @@ void UpdateLayers(CAContextID content_ca_context_id,
|
| content::GpuSurfaceTracker::Get()->AcquireNativeWidget(
|
| params_mac->surface_handle));
|
| if (widget) {
|
| - if (remote_layers_->content_layer) {
|
| + if (1) {
|
| + widget->GotCALayerFrame(
|
| + base::scoped_nsobject<CALayer>(
|
| + ca_layer_tree_coordinator_->GetCALayerForDisplay(),
|
| + base::scoped_policy::RETAIN),
|
| + false,
|
| + base::scoped_nsobject<CALayer>(
|
| + ca_layer_tree_coordinator_->
|
| + GetFullscreenLowPowerLayerForDisplay(),
|
| + base::scoped_policy::RETAIN),
|
| + params_mac->pixel_size, params_mac->scale_factor);
|
| + } else if (remote_layers_->content_layer) {
|
| widget->GotCALayerFrame(
|
| base::scoped_nsobject<CALayer>(remote_layers_->content_layer.get(),
|
| base::scoped_policy::RETAIN),
|
| @@ -134,4 +157,40 @@ void UpdateLayers(CAContextID content_ca_context_id,
|
| return should_show_frames_state_ == SHOULD_NOT_SHOW_FRAMES_SUSPENDED;
|
| }
|
|
|
| +void GpuOutputSurfaceMac::ProcessCALayers(const cc::CALayerOverlayList& ca_layer_overlays) {
|
| + {
|
| + TRACE_EVENT0("browser", "GpuOutputSurfaceMac::ProcessCALayers Construct");
|
| + for (const auto& ca_layer_overlay : ca_layer_overlays) {
|
| + base::ScopedCFTypeRef<IOSurfaceRef> io_surface;
|
| + base::ScopedCFTypeRef<CVPixelBufferRef> cv_pixel_buffer;
|
| + if (ca_layer_overlay.resource_lock) {
|
| + gfx::GpuMemoryBuffer* gpu_memory_buffer =
|
| + ca_layer_overlay.resource_lock->GetGpuMemoryBuffer();
|
| + if (gpu_memory_buffer) {
|
| + io_surface.reset(static_cast<IOSurfaceRef>(gpu_memory_buffer->GetIOSurface()),
|
| + base::scoped_policy::RETAIN);
|
| + }
|
| + }
|
| + ca_layer_tree_coordinator_->GetPendingCARendererLayerTree()->
|
| + ScheduleCALayer(ca_layer_overlay.is_clipped,
|
| + gfx::ToNearestRect(ca_layer_overlay.clip_rect),
|
| + ca_layer_overlay.sorting_context_id,
|
| + gfx::Transform(ca_layer_overlay.transform),
|
| + io_surface,
|
| + cv_pixel_buffer,
|
| + ca_layer_overlay.contents_rect,
|
| + gfx::ToNearestRect(ca_layer_overlay.bounds_rect),
|
| + ca_layer_overlay.background_color,
|
| + ca_layer_overlay.edge_aa_mask,
|
| + ca_layer_overlay.opacity,
|
| + ca_layer_overlay.filter);
|
| + }
|
| + }
|
| +
|
| + TRACE_EVENT0("browser", "GpuOutputSurfaceMac::ProcessCALayers Commit");
|
| + bool fullscreen_low_power_layer_valid = false;
|
| + ca_layer_tree_coordinator_->CommitPendingTreesToCA(
|
| + gfx::Rect(SurfaceSize()), &fullscreen_low_power_layer_valid);
|
| +}
|
| +
|
| } // namespace content
|
|
|