diff options
Diffstat (limited to 'ui/ozone/platform')
-rw-r--r-- | ui/ozone/platform/cast/surface_ozone_egl_cast.cc | 2 | ||||
-rw-r--r-- | ui/ozone/platform/drm/gpu/crtc_controller.cc | 10 | ||||
-rw-r--r-- | ui/ozone/platform/drm/gpu/drm_surface.cc | 4 | ||||
-rw-r--r-- | ui/ozone/platform/drm/gpu/drm_window.cc | 5 | ||||
-rw-r--r-- | ui/ozone/platform/drm/gpu/drm_window.h | 6 | ||||
-rw-r--r-- | ui/ozone/platform/drm/gpu/gbm_surface.cc | 14 | ||||
-rw-r--r-- | ui/ozone/platform/drm/gpu/gbm_surface.h | 3 | ||||
-rw-r--r-- | ui/ozone/platform/drm/gpu/gbm_surfaceless.cc | 6 | ||||
-rw-r--r-- | ui/ozone/platform/drm/gpu/hardware_display_controller.cc | 5 | ||||
-rw-r--r-- | ui/ozone/platform/drm/gpu/hardware_display_controller.h | 5 | ||||
-rw-r--r-- | ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc | 4 | ||||
-rw-r--r-- | ui/ozone/platform/drm/gpu/page_flip_request.cc | 21 | ||||
-rw-r--r-- | ui/ozone/platform/drm/gpu/page_flip_request.h | 11 | ||||
-rw-r--r-- | ui/ozone/platform/drm/gpu/screen_manager_unittest.cc | 5 | ||||
-rw-r--r-- | ui/ozone/platform/egltest/ozone_platform_egltest.cc | 2 |
15 files changed, 70 insertions, 33 deletions
diff --git a/ui/ozone/platform/cast/surface_ozone_egl_cast.cc b/ui/ozone/platform/cast/surface_ozone_egl_cast.cc index 9170240..56dee58 100644 --- a/ui/ozone/platform/cast/surface_ozone_egl_cast.cc +++ b/ui/ozone/platform/cast/surface_ozone_egl_cast.cc @@ -23,7 +23,7 @@ bool SurfaceOzoneEglCast::OnSwapBuffers() { bool SurfaceOzoneEglCast::OnSwapBuffersAsync( const SwapCompletionCallback& callback) { - callback.Run(); + callback.Run(gfx::SwapResult::SWAP_ACK); return true; } diff --git a/ui/ozone/platform/drm/gpu/crtc_controller.cc b/ui/ozone/platform/drm/gpu/crtc_controller.cc index 6aa5795..cf82f68 100644 --- a/ui/ozone/platform/drm/gpu/crtc_controller.cc +++ b/ui/ozone/platform/drm/gpu/crtc_controller.cc @@ -76,7 +76,7 @@ bool CrtcController::SchedulePageFlip( const OverlayPlane* primary = OverlayPlane::GetPrimaryPlane(overlays); if (!primary) { LOG(ERROR) << "No primary plane to display on crtc " << crtc_; - page_flip_request->Signal(); + page_flip_request->Signal(gfx::SwapResult::SWAP_ACK); return true; } DCHECK(primary->buffer.get()); @@ -86,19 +86,19 @@ bool CrtcController::SchedulePageFlip( << mode_.hdisplay << "x" << mode_.vdisplay << " got " << primary->buffer->GetSize().ToString() << " for" << " crtc=" << crtc_ << " connector=" << connector_; - page_flip_request->Signal(); + page_flip_request->Signal(gfx::SwapResult::SWAP_ACK); return true; } if (!drm_->plane_manager()->AssignOverlayPlanes(plane_list, overlays, crtc_, this)) { PLOG(ERROR) << "Failed to assign overlay planes for crtc " << crtc_; - page_flip_request->Signal(); + page_flip_request->Signal(gfx::SwapResult::SWAP_FAILED); return false; } if (test_only) { - page_flip_request->Signal(); + page_flip_request->Signal(gfx::SwapResult::SWAP_ACK); } else { pending_planes_ = overlays; page_flip_request_ = page_flip_request; @@ -164,7 +164,7 @@ void CrtcController::SignalPageFlipRequest() { // locally to avoid deleting the object we are making a call on. scoped_refptr<PageFlipRequest> last_request; last_request.swap(page_flip_request_); - last_request->Signal(); + last_request->Signal(gfx::SwapResult::SWAP_ACK); } } diff --git a/ui/ozone/platform/drm/gpu/drm_surface.cc b/ui/ozone/platform/drm/gpu/drm_surface.cc index ccf0ce7..6528dbf 100644 --- a/ui/ozone/platform/drm/gpu/drm_surface.cc +++ b/ui/ozone/platform/drm/gpu/drm_surface.cc @@ -20,6 +20,8 @@ namespace ui { namespace { +void EmptyPageFlipCallback(gfx::SwapResult result) { +} scoped_refptr<DrmBuffer> AllocateBuffer(const scoped_refptr<DrmDevice>& drm, const gfx::Size& size) { @@ -71,7 +73,7 @@ void DrmSurface::PresentCanvas(const gfx::Rect& damage) { UpdateNativeSurface(damage); window_delegate_->SchedulePageFlip(true /* is_sync */, - base::Bind(&base::DoNothing)); + base::Bind(&EmptyPageFlipCallback)); // Update our front buffer pointer. front_buffer_ ^= 1; diff --git a/ui/ozone/platform/drm/gpu/drm_window.cc b/ui/ozone/platform/drm/gpu/drm_window.cc index 2e5b26e..b2f7a46 100644 --- a/ui/ozone/platform/drm/gpu/drm_window.cc +++ b/ui/ozone/platform/drm/gpu/drm_window.cc @@ -124,7 +124,8 @@ void DrmWindow::QueueOverlayPlane(const OverlayPlane& plane) { pending_planes_.push_back(plane); } -bool DrmWindow::SchedulePageFlip(bool is_sync, const base::Closure& callback) { +bool DrmWindow::SchedulePageFlip(bool is_sync, + const SwapCompletionCallback& callback) { last_submitted_planes_.clear(); last_submitted_planes_.swap(pending_planes_); last_swap_sync_ = is_sync; @@ -134,7 +135,7 @@ bool DrmWindow::SchedulePageFlip(bool is_sync, const base::Closure& callback) { callback); } - callback.Run(); + callback.Run(gfx::SwapResult::SWAP_ACK); return true; } diff --git a/ui/ozone/platform/drm/gpu/drm_window.h b/ui/ozone/platform/drm/gpu/drm_window.h index 74e1e53..1164f17 100644 --- a/ui/ozone/platform/drm/gpu/drm_window.h +++ b/ui/ozone/platform/drm/gpu/drm_window.h @@ -11,8 +11,11 @@ #include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/native_widget_types.h" +#include "ui/gfx/swap_result.h" #include "ui/ozone/ozone_export.h" #include "ui/ozone/platform/drm/gpu/overlay_plane.h" +#include "ui/ozone/platform/drm/gpu/page_flip_request.h" +#include "ui/ozone/public/surface_ozone_egl.h" class SkBitmap; @@ -79,7 +82,8 @@ class OZONE_EXPORT DrmWindow { // immediately, otherwise queue up on the window and forward when the hardware // is once again ready. void QueueOverlayPlane(const OverlayPlane& plane); - bool SchedulePageFlip(bool is_sync, const base::Closure& callback); + + bool SchedulePageFlip(bool is_sync, const SwapCompletionCallback& callback); // Returns the last buffer associated with this window. const OverlayPlane* GetLastModesetBuffer(); diff --git a/ui/ozone/platform/drm/gpu/gbm_surface.cc b/ui/ozone/platform/drm/gpu/gbm_surface.cc index 8b5b167..08a32f4 100644 --- a/ui/ozone/platform/drm/gpu/gbm_surface.cc +++ b/ui/ozone/platform/drm/gpu/gbm_surface.cc @@ -19,6 +19,9 @@ namespace ui { namespace { +void DoNothing(gfx::SwapResult) { +} + class GbmSurfaceBuffer : public GbmBufferBase { public: static scoped_refptr<GbmSurfaceBuffer> CreateBuffer( @@ -131,7 +134,7 @@ bool GbmSurface::ResizeNativeWindow(const gfx::Size& viewport_size) { } bool GbmSurface::OnSwapBuffers() { - return OnSwapBuffersAsync(base::Bind(&base::DoNothing)); + return OnSwapBuffersAsync(base::Bind(&DoNothing)); } bool GbmSurface::OnSwapBuffersAsync(const SwapCompletionCallback& callback) { @@ -144,7 +147,7 @@ bool GbmSurface::OnSwapBuffersAsync(const SwapCompletionCallback& callback) { primary = GbmSurfaceBuffer::CreateBuffer(gbm_, pending_buffer); if (!primary.get()) { LOG(ERROR) << "Failed to associate the buffer with the controller"; - callback.Run(); + callback.Run(gfx::SwapResult::SWAP_FAILED); return false; } } @@ -155,7 +158,7 @@ bool GbmSurface::OnSwapBuffersAsync(const SwapCompletionCallback& callback) { if (!GbmSurfaceless::OnSwapBuffersAsync( base::Bind(&GbmSurface::OnSwapBuffersCallback, weak_factory_.GetWeakPtr(), callback, pending_buffer))) { - callback.Run(); + callback.Run(gfx::SwapResult::SWAP_FAILED); return false; } @@ -163,13 +166,14 @@ bool GbmSurface::OnSwapBuffersAsync(const SwapCompletionCallback& callback) { } void GbmSurface::OnSwapBuffersCallback(const SwapCompletionCallback& callback, - gbm_bo* pending_buffer) { + gbm_bo* pending_buffer, + gfx::SwapResult result) { // If there was a frontbuffer, it is no longer active. Release it back to GBM. if (current_buffer_) gbm_surface_release_buffer(native_surface_, current_buffer_); current_buffer_ = pending_buffer; - callback.Run(); + callback.Run(result); } } // namespace ui diff --git a/ui/ozone/platform/drm/gpu/gbm_surface.h b/ui/ozone/platform/drm/gpu/gbm_surface.h index 65ec8c7..45757ec 100644 --- a/ui/ozone/platform/drm/gpu/gbm_surface.h +++ b/ui/ozone/platform/drm/gpu/gbm_surface.h @@ -39,7 +39,8 @@ class GbmSurface : public GbmSurfaceless { private: void OnSwapBuffersCallback(const SwapCompletionCallback& callback, - gbm_bo* pending_buffer); + gbm_bo* pending_buffer, + gfx::SwapResult result); scoped_refptr<GbmDevice> gbm_; diff --git a/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc b/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc index c906cfd..244b8ab 100644 --- a/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc +++ b/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc @@ -14,6 +14,10 @@ #include "ui/ozone/platform/drm/gpu/hardware_display_controller.h" namespace ui { +namespace { +void EmptyPageFlipCallback(gfx::SwapResult result) { +} +} // namespace GbmSurfaceless::GbmSurfaceless(DrmWindow* window_delegate, DrmDeviceManager* drm_device_manager) @@ -35,7 +39,7 @@ bool GbmSurfaceless::ResizeNativeWindow(const gfx::Size& viewport_size) { bool GbmSurfaceless::OnSwapBuffers() { return window_delegate_->SchedulePageFlip(true /* is_sync */, - base::Bind(&base::DoNothing)); + base::Bind(&EmptyPageFlipCallback)); } bool GbmSurfaceless::OnSwapBuffersAsync( diff --git a/ui/ozone/platform/drm/gpu/hardware_display_controller.cc b/ui/ozone/platform/drm/gpu/hardware_display_controller.cc index 3fbfe7f..07cd837 100644 --- a/ui/ozone/platform/drm/gpu/hardware_display_controller.cc +++ b/ui/ozone/platform/drm/gpu/hardware_display_controller.cc @@ -14,6 +14,7 @@ #include "third_party/skia/include/core/SkCanvas.h" #include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/size.h" +#include "ui/gfx/swap_result.h" #include "ui/ozone/platform/drm/gpu/crtc_controller.h" #include "ui/ozone/platform/drm/gpu/drm_buffer.h" #include "ui/ozone/platform/drm/gpu/drm_device.h" @@ -63,14 +64,14 @@ bool HardwareDisplayController::SchedulePageFlip( const OverlayPlaneList& plane_list, bool is_sync, bool test_only, - const base::Closure& callback) { + const PageFlipCallback& callback) { TRACE_EVENT0("drm", "HDC::SchedulePageFlip"); DCHECK(!is_disabled_); // Ignore requests with no planes to schedule. if (plane_list.empty()) { - callback.Run(); + callback.Run(gfx::SwapResult::SWAP_ACK); return true; } diff --git a/ui/ozone/platform/drm/gpu/hardware_display_controller.h b/ui/ozone/platform/drm/gpu/hardware_display_controller.h index b09d547..3772c35 100644 --- a/ui/ozone/platform/drm/gpu/hardware_display_controller.h +++ b/ui/ozone/platform/drm/gpu/hardware_display_controller.h @@ -17,6 +17,7 @@ #include "base/containers/scoped_ptr_hash_map.h" #include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" +#include "ui/gfx/swap_result.h" #include "ui/ozone/ozone_export.h" #include "ui/ozone/platform/drm/gpu/hardware_display_plane_manager.h" #include "ui/ozone/platform/drm/gpu/overlay_plane.h" @@ -86,6 +87,8 @@ class DrmDevice; // framebuffers. Though, in this case, it would be possible to have all // connectors active if some use the same CRTC to mirror the display. class OZONE_EXPORT HardwareDisplayController { + typedef base::Callback<void(gfx::SwapResult)> PageFlipCallback; + public: HardwareDisplayController(scoped_ptr<CrtcController> controller, const gfx::Point& origin); @@ -123,7 +126,7 @@ class OZONE_EXPORT HardwareDisplayController { bool SchedulePageFlip(const OverlayPlaneList& plane_list, bool is_sync, bool test_only, - const base::Closure& callback); + const PageFlipCallback& callback); // Set the hardware cursor to show the contents of |surface|. bool SetCursor(const scoped_refptr<ScanoutBuffer>& buffer); diff --git a/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc b/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc index 0ff9473..da99c07 100644 --- a/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc +++ b/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc @@ -54,7 +54,7 @@ class HardwareDisplayControllerTest : public testing::Test { void SetUp() override; void TearDown() override; - void PageFlipCallback(); + void PageFlipCallback(gfx::SwapResult); protected: scoped_ptr<ui::HardwareDisplayController> controller_; @@ -82,7 +82,7 @@ void HardwareDisplayControllerTest::TearDown() { drm_ = nullptr; } -void HardwareDisplayControllerTest::PageFlipCallback() { +void HardwareDisplayControllerTest::PageFlipCallback(gfx::SwapResult) { page_flips_++; } diff --git a/ui/ozone/platform/drm/gpu/page_flip_request.cc b/ui/ozone/platform/drm/gpu/page_flip_request.cc index dfca208..4d1b60d 100644 --- a/ui/ozone/platform/drm/gpu/page_flip_request.cc +++ b/ui/ozone/platform/drm/gpu/page_flip_request.cc @@ -4,19 +4,28 @@ #include "ui/ozone/platform/drm/gpu/page_flip_request.h" -#include "base/barrier_closure.h" - namespace ui { -PageFlipRequest::PageFlipRequest(int crtc_count, const base::Closure& callback) - : callback_(base::BarrierClosure(crtc_count, callback)) { +PageFlipRequest::PageFlipRequest(int crtc_count, + const SwapCompletionCallback& callback) + : callback_(callback), + crtc_count_(crtc_count), + result_(gfx::SwapResult::SWAP_ACK) { } PageFlipRequest::~PageFlipRequest() { } -void PageFlipRequest::Signal() { - callback_.Run(); +void PageFlipRequest::Signal(gfx::SwapResult result) { + if (result == gfx::SwapResult::SWAP_FAILED) + result_ = gfx::SwapResult::SWAP_FAILED; + else if (result != gfx::SwapResult::SWAP_ACK) + result_ = result; + + if (!--crtc_count_) { + callback_.Run(result_); + callback_.Reset(); + } } } // namespace ui diff --git a/ui/ozone/platform/drm/gpu/page_flip_request.h b/ui/ozone/platform/drm/gpu/page_flip_request.h index c1a63b2..6daa8a3 100644 --- a/ui/ozone/platform/drm/gpu/page_flip_request.h +++ b/ui/ozone/platform/drm/gpu/page_flip_request.h @@ -5,22 +5,27 @@ #ifndef UI_OZONE_PLATFORM_DRM_GPU_PAGE_FLIP_REQUEST_H_ #define UI_OZONE_PLATFORM_DRM_GPU_PAGE_FLIP_REQUEST_H_ +#include "base/atomic_ref_count.h" #include "base/callback.h" #include "base/memory/scoped_ptr.h" +#include "ui/gfx/swap_result.h" +#include "ui/ozone/public/surface_ozone_egl.h" namespace ui { class PageFlipRequest : public base::RefCounted<PageFlipRequest> { public: - PageFlipRequest(int crtc_count, const base::Closure& callback); + PageFlipRequest(int crtc_count, const SwapCompletionCallback& callback); - void Signal(); + void Signal(gfx::SwapResult result); private: friend class base::RefCounted<PageFlipRequest>; ~PageFlipRequest(); - base::Closure callback_; + SwapCompletionCallback callback_; + int crtc_count_; + gfx::SwapResult result_; DISALLOW_COPY_AND_ASSIGN(PageFlipRequest); }; diff --git a/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc b/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc index bd8671b..f8b59a6 100644 --- a/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc +++ b/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc @@ -14,6 +14,9 @@ namespace { +void EmptySwapCallback(gfx::SwapResult) { +} + // Create a basic mode for a 6x4 screen. const drmModeModeInfo kDefaultMode = {0, 6, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, {'\0'}}; @@ -459,7 +462,7 @@ TEST_F(ScreenManagerTest, EnableControllerWhenWindowHasBuffer) { scoped_refptr<ui::ScanoutBuffer> buffer = buffer_generator_->Create(drm_, GetPrimaryBounds().size()); window->QueueOverlayPlane(ui::OverlayPlane(buffer)); - window->SchedulePageFlip(false /* is_sync */, base::Bind(&base::DoNothing)); + window->SchedulePageFlip(false /* is_sync */, base::Bind(&EmptySwapCallback)); screen_manager_->AddWindow(1, window.Pass()); screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector); diff --git a/ui/ozone/platform/egltest/ozone_platform_egltest.cc b/ui/ozone/platform/egltest/ozone_platform_egltest.cc index 73ff47b..31f35a6 100644 --- a/ui/ozone/platform/egltest/ozone_platform_egltest.cc +++ b/ui/ozone/platform/egltest/ozone_platform_egltest.cc @@ -216,7 +216,7 @@ class SurfaceOzoneEgltest : public SurfaceOzoneEGL { bool OnSwapBuffers() override { return true; } bool OnSwapBuffersAsync(const SwapCompletionCallback& callback) override { - callback.Run(); + callback.Run(gfx::SwapResult::SWAP_ACK); return true; } |