summaryrefslogtreecommitdiffstats
path: root/ui/ozone/platform
diff options
context:
space:
mode:
Diffstat (limited to 'ui/ozone/platform')
-rw-r--r--ui/ozone/platform/cast/surface_ozone_egl_cast.cc2
-rw-r--r--ui/ozone/platform/drm/gpu/crtc_controller.cc10
-rw-r--r--ui/ozone/platform/drm/gpu/drm_surface.cc4
-rw-r--r--ui/ozone/platform/drm/gpu/drm_window.cc5
-rw-r--r--ui/ozone/platform/drm/gpu/drm_window.h6
-rw-r--r--ui/ozone/platform/drm/gpu/gbm_surface.cc14
-rw-r--r--ui/ozone/platform/drm/gpu/gbm_surface.h3
-rw-r--r--ui/ozone/platform/drm/gpu/gbm_surfaceless.cc6
-rw-r--r--ui/ozone/platform/drm/gpu/hardware_display_controller.cc5
-rw-r--r--ui/ozone/platform/drm/gpu/hardware_display_controller.h5
-rw-r--r--ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc4
-rw-r--r--ui/ozone/platform/drm/gpu/page_flip_request.cc21
-rw-r--r--ui/ozone/platform/drm/gpu/page_flip_request.h11
-rw-r--r--ui/ozone/platform/drm/gpu/screen_manager_unittest.cc5
-rw-r--r--ui/ozone/platform/egltest/ozone_platform_egltest.cc2
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;
}