1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "testing/gtest/include/gtest/gtest.h"
6 #include "third_party/skia/include/core/SkCanvas.h"
7 #include "third_party/skia/include/core/SkColor.h"
8 #include "third_party/skia/include/core/SkDevice.h"
9 #include "ui/gfx/ozone/impl/drm_skbitmap_ozone.h"
10 #include "ui/gfx/ozone/impl/hardware_display_controller_ozone.h"
11 #include "ui/gfx/ozone/impl/software_surface_ozone.h"
15 // Create a basic mode for a 6x4 screen.
16 const drmModeModeInfo kDefaultMode =
17 {0, 6, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, {'\0'}};
19 // Mock file descriptor ID.
23 const uint32_t kConnectorId = 1;
26 const uint32_t kCrtcId = 1;
28 // Mock DPMS property ID.
29 const uint32_t kDPMSPropertyId = 1;
31 class MockDrmWrapperOzone : public gfx::DrmWrapperOzone {
33 MockDrmWrapperOzone() : DrmWrapperOzone(""), id_(1) { fd_ = kFd; }
34 virtual ~MockDrmWrapperOzone() { fd_ = -1; }
36 virtual drmModeCrtc* GetCrtc(uint32_t crtc_id) OVERRIDE { return NULL; }
37 virtual void FreeCrtc(drmModeCrtc* crtc) OVERRIDE {}
38 virtual bool SetCrtc(uint32_t crtc_id,
41 drmModeModeInfo* mode) OVERRIDE { return true; }
42 virtual bool SetCrtc(drmModeCrtc* crtc, uint32_t* connectors) OVERRIDE {
45 virtual bool AddFramebuffer(const drmModeModeInfo& mode,
50 uint32_t* framebuffer) OVERRIDE {
54 virtual bool RemoveFramebuffer(uint32_t framebuffer) OVERRIDE { return true; }
55 virtual bool PageFlip(uint32_t crtc_id,
57 void* data) OVERRIDE {
60 virtual bool ConnectorSetProperty(uint32_t connector_id,
62 uint64_t value) OVERRIDE { return true; }
66 DISALLOW_COPY_AND_ASSIGN(MockDrmWrapperOzone);
69 class MockDrmSkBitmapOzone : public gfx::DrmSkBitmapOzone {
71 MockDrmSkBitmapOzone(int fd,
72 bool initialize_expectation)
73 : DrmSkBitmapOzone(fd),
74 initialize_expectation_(initialize_expectation) {}
75 virtual ~MockDrmSkBitmapOzone() {}
77 virtual bool Initialize() OVERRIDE {
78 if (!initialize_expectation_)
82 // Clear the bitmap to black.
83 eraseColor(SK_ColorBLACK);
88 bool initialize_expectation_;
90 DISALLOW_COPY_AND_ASSIGN(MockDrmSkBitmapOzone);
93 class MockSoftwareSurfaceOzone : public gfx::SoftwareSurfaceOzone {
95 MockSoftwareSurfaceOzone(gfx::HardwareDisplayControllerOzone* controller)
96 : SoftwareSurfaceOzone(controller),
97 initialize_expectation_(true) {}
98 virtual ~MockSoftwareSurfaceOzone() {}
100 void set_initialize_expectation(bool state) {
101 initialize_expectation_ = state;
105 virtual gfx::DrmSkBitmapOzone* CreateBuffer() OVERRIDE {
106 return new MockDrmSkBitmapOzone(kFd, initialize_expectation_);
109 bool initialize_expectation_;
111 DISALLOW_COPY_AND_ASSIGN(MockSoftwareSurfaceOzone);
116 class SoftwareSurfaceOzoneTest : public testing::Test {
118 SoftwareSurfaceOzoneTest() {}
120 virtual void SetUp() OVERRIDE;
121 virtual void TearDown() OVERRIDE;
124 scoped_ptr<MockDrmWrapperOzone> drm_;
125 scoped_ptr<gfx::HardwareDisplayControllerOzone> controller_;
126 scoped_ptr<MockSoftwareSurfaceOzone> surface_;
129 DISALLOW_COPY_AND_ASSIGN(SoftwareSurfaceOzoneTest);
132 void SoftwareSurfaceOzoneTest::SetUp() {
133 drm_.reset(new MockDrmWrapperOzone());
134 controller_.reset(new gfx::HardwareDisplayControllerOzone());
135 controller_->SetControllerInfo(
136 drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode);
138 surface_.reset(new MockSoftwareSurfaceOzone(controller_.get()));
141 void SoftwareSurfaceOzoneTest::TearDown() {
147 TEST_F(SoftwareSurfaceOzoneTest, FailInitialization) {
148 surface_->set_initialize_expectation(false);
149 EXPECT_FALSE(surface_->Initialize());
152 TEST_F(SoftwareSurfaceOzoneTest, SuccessfulInitialization) {
153 EXPECT_TRUE(surface_->Initialize());
156 TEST_F(SoftwareSurfaceOzoneTest, CheckFBIDOnSwap) {
157 EXPECT_TRUE(surface_->Initialize());
158 controller_->BindSurfaceToController(
159 surface_.PassAs<gfx::SoftwareSurfaceOzone>());
161 // Check that the framebuffer ID is correct.
162 EXPECT_EQ(2u, controller_->get_surface()->GetFramebufferId());
164 controller_->get_surface()->SwapBuffers();
166 EXPECT_EQ(1u, controller_->get_surface()->GetFramebufferId());
169 TEST_F(SoftwareSurfaceOzoneTest, CheckPixelPointerOnSwap) {
170 EXPECT_TRUE(surface_->Initialize());
172 void* bitmap_pixels1 = surface_->GetDrawableForWidget()->getDevice()
173 ->accessBitmap(false).getPixels();
175 surface_->SwapBuffers();
177 void* bitmap_pixels2 = surface_->GetDrawableForWidget()->getDevice()
178 ->accessBitmap(false).getPixels();
180 // Check that once the buffers have been swapped the drawable's underlying
181 // pixels have been changed.
182 EXPECT_NE(bitmap_pixels1, bitmap_pixels2);
185 TEST_F(SoftwareSurfaceOzoneTest, CheckCorrectBufferSync) {
186 EXPECT_TRUE(surface_->Initialize());
188 SkCanvas* canvas = surface_->GetDrawableForWidget();
190 // Modify part of the canvas.
192 canvas->getDeviceSize().width() / 2,
193 canvas->getDeviceSize().height() / 2);
194 canvas->clipRect(clip, SkRegion::kReplace_Op);
196 canvas->drawColor(SK_ColorWHITE);
198 surface_->SwapBuffers();
200 // Verify that the modified contents have been copied over on swap (make sure
201 // the 2 buffers have the same content).
202 for (int i = 0; i < canvas->getDeviceSize().height(); ++i) {
203 for (int j = 0; j < canvas->getDeviceSize().width(); ++j) {
204 if (i < clip.height() && j < clip.width())
205 EXPECT_EQ(SK_ColorWHITE,
206 canvas->getDevice()->accessBitmap(false).getColor(j, i));
208 EXPECT_EQ(SK_ColorBLACK,
209 canvas->getDevice()->accessBitmap(false).getColor(j, i));