diff options
author | glider@chromium.org <glider@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-16 14:38:44 +0000 |
---|---|---|
committer | glider@chromium.org <glider@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-16 14:38:44 +0000 |
commit | 0d8f25d392da5aed36dadec776da5aba4fccbfb3 (patch) | |
tree | e00cca7325965a4666bdde7a415a0aa892701b33 /content/browser/aura/software_output_device_ozone.cc | |
parent | ffc4616d36d9cc373739ca89f52ca6a5a1513357 (diff) | |
download | chromium_src-0d8f25d392da5aed36dadec776da5aba4fccbfb3.zip chromium_src-0d8f25d392da5aed36dadec776da5aba4fccbfb3.tar.gz chromium_src-0d8f25d392da5aed36dadec776da5aba4fccbfb3.tar.bz2 |
Revert 245131 "Add the UI compositor to the Mac build", which caused Mac ASan redness
> Add the UI compositor to the Mac build
>
> Move the bulk of the files in content/browser/aura to
> content/browser/compositor, since they're not aura-specific.
>
> Build all of those files in the Mac build, and add ui/compositor
> to the dependencies of the Mac build. These files will soon only
> be excluded from the Android build.
>
> BUG=314190
>
> Review URL: https://codereview.chromium.org/137893007
TBR=ccameron@chromium.org
BUG=335083
Review URL: https://codereview.chromium.org/137853019
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@245195 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/aura/software_output_device_ozone.cc')
-rw-r--r-- | content/browser/aura/software_output_device_ozone.cc | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/content/browser/aura/software_output_device_ozone.cc b/content/browser/aura/software_output_device_ozone.cc new file mode 100644 index 0000000..29b322e --- /dev/null +++ b/content/browser/aura/software_output_device_ozone.cc @@ -0,0 +1,73 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/aura/software_output_device_ozone.h" +#include "third_party/skia/include/core/SkBitmapDevice.h" +#include "third_party/skia/include/core/SkDevice.h" +#include "ui/compositor/compositor.h" +#include "ui/gfx/ozone/surface_factory_ozone.h" +#include "ui/gfx/skia_util.h" +#include "ui/gfx/vsync_provider.h" + +namespace content { + +SoftwareOutputDeviceOzone::SoftwareOutputDeviceOzone(ui::Compositor* compositor) + : compositor_(compositor), realized_widget_(gfx::kNullAcceleratedWidget) { + gfx::SurfaceFactoryOzone* factory = gfx::SurfaceFactoryOzone::GetInstance(); + + if (factory->InitializeHardware() != gfx::SurfaceFactoryOzone::INITIALIZED) + LOG(FATAL) << "Failed to initialize hardware in OZONE"; + + realized_widget_ = factory->RealizeAcceleratedWidget(compositor_->widget()); + + if (realized_widget_ == gfx::kNullAcceleratedWidget) + LOG(FATAL) << "Failed to get a realized AcceleratedWidget"; + + vsync_provider_ = factory->CreateVSyncProvider(realized_widget_); +} + +SoftwareOutputDeviceOzone::~SoftwareOutputDeviceOzone() { +} + +void SoftwareOutputDeviceOzone::Resize(gfx::Size viewport_size) { + if (viewport_size_ == viewport_size) + return; + + viewport_size_ = viewport_size; + gfx::Rect bounds(viewport_size_); + + gfx::SurfaceFactoryOzone* factory = gfx::SurfaceFactoryOzone::GetInstance(); + factory->AttemptToResizeAcceleratedWidget(compositor_->widget(), + bounds); + + canvas_ = skia::SharePtr(factory->GetCanvasForWidget(realized_widget_)); + device_ = skia::SharePtr(canvas_->getDevice()); +} + +SkCanvas* SoftwareOutputDeviceOzone::BeginPaint(const gfx::Rect& damage_rect) { + DCHECK(gfx::Rect(viewport_size_).Contains(damage_rect)); + + canvas_->clipRect(gfx::RectToSkRect(damage_rect), SkRegion::kReplace_Op); + // Save the current state so we can restore once we're done drawing. This is + // saved after the clip since we want to keep the clip information after we're + // done drawing such that OZONE knows what was updated. + canvas_->save(); + + return SoftwareOutputDevice::BeginPaint(damage_rect); +} + +void SoftwareOutputDeviceOzone::EndPaint(cc::SoftwareFrameData* frame_data) { + SoftwareOutputDevice::EndPaint(frame_data); + + canvas_->restore(); + + if (damage_rect_.IsEmpty()) + return; + + bool scheduled = gfx::SurfaceFactoryOzone::GetInstance()->SchedulePageFlip( + compositor_->widget()); + DCHECK(scheduled) << "Failed to schedule pageflip"; +} + +} // namespace content |