blob: 397e54f0b9513d4ed2b409ee92e1051638b57754 [file] [log] [blame]
// Copyright 2014 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 "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkColor.h"
#include "third_party/skia/include/core/SkDevice.h"
#include "ui/ozone/platform/dri/dri_buffer.h"
#include "ui/ozone/platform/dri/dri_surface.h"
#include "ui/ozone/platform/dri/hardware_display_controller.h"
#include "ui/ozone/platform/dri/test/mock_dri_surface.h"
#include "ui/ozone/platform/dri/test/mock_dri_wrapper.h"
namespace {
// 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'}};
} // namespace
class DriSurfaceTest : public testing::Test {
public:
DriSurfaceTest() {}
virtual void SetUp() OVERRIDE;
virtual void TearDown() OVERRIDE;
protected:
scoped_ptr<ui::MockDriWrapper> drm_;
scoped_ptr<ui::HardwareDisplayController> controller_;
scoped_ptr<ui::MockDriSurface> surface_;
private:
DISALLOW_COPY_AND_ASSIGN(DriSurfaceTest);
};
void DriSurfaceTest::SetUp() {
drm_.reset(new ui::MockDriWrapper(3));
controller_.reset(new ui::HardwareDisplayController(drm_.get(), 1, 1));
surface_.reset(new ui::MockDriSurface(
drm_.get(), gfx::Size(kDefaultMode.hdisplay, kDefaultMode.vdisplay)));
}
void DriSurfaceTest::TearDown() {
surface_.reset();
controller_.reset();
drm_.reset();
}
TEST_F(DriSurfaceTest, FailInitialization) {
surface_->set_initialize_expectation(false);
EXPECT_FALSE(surface_->Initialize());
}
TEST_F(DriSurfaceTest, SuccessfulInitialization) {
EXPECT_TRUE(surface_->Initialize());
}
TEST_F(DriSurfaceTest, CheckFBIDOnSwap) {
EXPECT_TRUE(surface_->Initialize());
controller_->BindSurfaceToController(surface_.PassAs<ui::ScanoutSurface>(),
kDefaultMode);
// Check that the framebuffer ID is correct.
EXPECT_EQ(2u, controller_->surface()->GetFramebufferId());
controller_->surface()->SwapBuffers();
EXPECT_EQ(1u, controller_->surface()->GetFramebufferId());
}
TEST_F(DriSurfaceTest, CheckPixelPointerOnSwap) {
EXPECT_TRUE(surface_->Initialize());
void* bitmap_pixels1 = surface_->GetDrawableForWidget()->getDevice()
->accessBitmap(false).getPixels();
surface_->SwapBuffers();
void* bitmap_pixels2 = surface_->GetDrawableForWidget()->getDevice()
->accessBitmap(false).getPixels();
// Check that once the buffers have been swapped the drawable's underlying
// pixels have been changed.
EXPECT_NE(bitmap_pixels1, bitmap_pixels2);
}
TEST_F(DriSurfaceTest, CheckCorrectBufferSync) {
EXPECT_TRUE(surface_->Initialize());
SkCanvas* canvas = surface_->GetDrawableForWidget();
SkRect clip;
// Modify part of the canvas.
clip.set(0, 0,
canvas->getDeviceSize().width() / 2,
canvas->getDeviceSize().height() / 2);
canvas->clipRect(clip, SkRegion::kReplace_Op);
canvas->drawColor(SK_ColorWHITE);
surface_->SwapBuffers();
// Verify that the modified contents have been copied over on swap (make sure
// the 2 buffers have the same content).
for (int i = 0; i < canvas->getDeviceSize().height(); ++i) {
for (int j = 0; j < canvas->getDeviceSize().width(); ++j) {
if (i < clip.height() && j < clip.width())
EXPECT_EQ(SK_ColorWHITE,
canvas->getDevice()->accessBitmap(false).getColor(j, i));
else
EXPECT_EQ(SK_ColorBLACK,
canvas->getDevice()->accessBitmap(false).getColor(j, i));
}
}
}