Commit 89318cd3 authored by dnicoara@chromium.org's avatar dnicoara@chromium.org

[Ozone-DRI] Removing MockDriSurface implementation

Consolidating all the mocked components in DriWrapper for easier
testability of the DRI platform. This should also simplify unittesting
since there won't be a need for interfaces and factories for the sake of
testing.

BUG=none
NOTRY=true

Review URL: https://codereview.chromium.org/402773002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@283885 0039d316-1c4b-4281-b951-d872f2087c98
parent d355780d
...@@ -98,8 +98,6 @@ ...@@ -98,8 +98,6 @@
'dri_surface_unittest.cc', 'dri_surface_unittest.cc',
'hardware_display_controller_unittest.cc', 'hardware_display_controller_unittest.cc',
'screen_manager_unittest.cc', 'screen_manager_unittest.cc',
'test/mock_dri_surface.cc',
'test/mock_dri_surface.h',
'test/mock_dri_wrapper.cc', 'test/mock_dri_wrapper.cc',
'test/mock_dri_wrapper.h', 'test/mock_dri_wrapper.h',
'test/mock_surface_generator.cc', 'test/mock_surface_generator.cc',
......
...@@ -4,14 +4,7 @@ ...@@ -4,14 +4,7 @@
#include "ui/ozone/platform/dri/dri_buffer.h" #include "ui/ozone/platform/dri/dri_buffer.h"
#include <errno.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <xf86drm.h>
#include "base/logging.h" #include "base/logging.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "ui/ozone/platform/dri/dri_util.h"
#include "ui/ozone/platform/dri/dri_wrapper.h" #include "ui/ozone/platform/dri/dri_wrapper.h"
namespace ui { namespace ui {
...@@ -39,40 +32,6 @@ uint8_t GetColorDepth(SkColorType type) { ...@@ -39,40 +32,6 @@ uint8_t GetColorDepth(SkColorType type) {
} }
} }
void DestroyDumbBuffer(int fd, uint32_t handle) {
struct drm_mode_destroy_dumb destroy_request;
memset(&destroy_request, 0, sizeof(destroy_request));
destroy_request.handle = handle;
drmIoctl(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_request);
}
bool CreateDumbBuffer(int fd,
const SkImageInfo& info,
uint32_t* handle,
uint32_t* stride) {
struct drm_mode_create_dumb request;
memset(&request, 0, sizeof(request));
request.width = info.width();
request.height = info.height();
request.bpp = info.bytesPerPixel() << 3;
request.flags = 0;
if (drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &request) < 0) {
VLOG(2) << "Cannot create dumb buffer (" << errno << ") "
<< strerror(errno);
return false;
}
// The driver may choose to align the last row as well. We don't care about
// the last alignment bits since they aren't used for display purposes, so
// just check that the expected size is <= to what the driver allocated.
DCHECK_LE(info.getSafeSize(request.pitch), request.size);
*handle = request.handle;
*stride = request.pitch;
return true;
}
} // namespace } // namespace
DriBuffer::DriBuffer(DriWrapper* dri) DriBuffer::DriBuffer(DriWrapper* dri)
...@@ -90,23 +49,13 @@ DriBuffer::~DriBuffer() { ...@@ -90,23 +49,13 @@ DriBuffer::~DriBuffer() {
if (!pixels) if (!pixels)
return; return;
munmap(pixels, info.getSafeSize(stride_)); dri_->DestroyDumbBuffer(info, handle_, stride_, pixels);
DestroyDumbBuffer(dri_->get_fd(), handle_);
} }
bool DriBuffer::Initialize(const SkImageInfo& info) { bool DriBuffer::Initialize(const SkImageInfo& info) {
void* pixels = NULL; void* pixels = NULL;
if (!CreateDumbBuffer(dri_->get_fd(), info, &handle_, &stride_)) { if (!dri_->CreateDumbBuffer(info, &handle_, &stride_, &pixels)) {
VLOG(2) << "Cannot allocate drm dumb buffer"; VLOG(2) << "Cannot create drm dumb buffer";
return false;
}
if (!MapDumbBuffer(dri_->get_fd(),
handle_,
info.getSafeSize(stride_),
&pixels)) {
VLOG(2) << "Cannot map drm dumb buffer";
DestroyDumbBuffer(dri_->get_fd(), handle_);
return false; return false;
} }
......
...@@ -21,7 +21,7 @@ class DriWrapper; ...@@ -21,7 +21,7 @@ class DriWrapper;
class DriBuffer { class DriBuffer {
public: public:
DriBuffer(DriWrapper* dri); DriBuffer(DriWrapper* dri);
virtual ~DriBuffer(); ~DriBuffer();
uint32_t stride() const { return stride_; } uint32_t stride() const { return stride_; }
uint32_t handle() const { return handle_; } uint32_t handle() const { return handle_; }
...@@ -30,9 +30,9 @@ class DriBuffer { ...@@ -30,9 +30,9 @@ class DriBuffer {
// Allocates the backing pixels and wraps them in |surface_|. |info| is used // Allocates the backing pixels and wraps them in |surface_|. |info| is used
// to describe the buffer characteristics (size, color format). // to describe the buffer characteristics (size, color format).
virtual bool Initialize(const SkImageInfo& info); bool Initialize(const SkImageInfo& info);
protected: private:
DriWrapper* dri_; // Not owned. DriWrapper* dri_; // Not owned.
// Wrapper around the native pixel memory. // Wrapper around the native pixel memory.
......
...@@ -31,7 +31,7 @@ DriSurface::~DriSurface() { ...@@ -31,7 +31,7 @@ DriSurface::~DriSurface() {
bool DriSurface::Initialize() { bool DriSurface::Initialize() {
for (size_t i = 0; i < arraysize(bitmaps_); ++i) { for (size_t i = 0; i < arraysize(bitmaps_); ++i) {
bitmaps_[i].reset(CreateBuffer()); bitmaps_[i].reset(new DriBuffer(dri_));
// TODO(dnicoara) Should select the configuration based on what the // TODO(dnicoara) Should select the configuration based on what the
// underlying system supports. // underlying system supports.
SkImageInfo info = SkImageInfo::MakeN32Premul(size_.width(), SkImageInfo info = SkImageInfo::MakeN32Premul(size_.width(),
...@@ -76,6 +76,4 @@ SkCanvas* DriSurface::GetDrawableForWidget() { ...@@ -76,6 +76,4 @@ SkCanvas* DriSurface::GetDrawableForWidget() {
return backbuffer()->canvas(); return backbuffer()->canvas();
} }
DriBuffer* DriSurface::CreateBuffer() { return new DriBuffer(dri_); }
} // namespace ui } // namespace ui
...@@ -40,9 +40,6 @@ class DriSurface : public ScanoutSurface { ...@@ -40,9 +40,6 @@ class DriSurface : public ScanoutSurface {
DriBuffer* frontbuffer() const { return bitmaps_[front_buffer_].get(); } DriBuffer* frontbuffer() const { return bitmaps_[front_buffer_].get(); }
DriBuffer* backbuffer() const { return bitmaps_[front_buffer_ ^ 1].get(); } DriBuffer* backbuffer() const { return bitmaps_[front_buffer_ ^ 1].get(); }
// Used to create the backing buffers.
virtual DriBuffer* CreateBuffer();
// Stores the connection to the graphics card. Pointer not owned by this // Stores the connection to the graphics card. Pointer not owned by this
// class. // class.
DriWrapper* dri_; DriWrapper* dri_;
......
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
#include "ui/ozone/platform/dri/dri_surface_factory.h" #include "ui/ozone/platform/dri/dri_surface_factory.h"
#include "ui/ozone/platform/dri/hardware_display_controller.h" #include "ui/ozone/platform/dri/hardware_display_controller.h"
#include "ui/ozone/platform/dri/screen_manager.h" #include "ui/ozone/platform/dri/screen_manager.h"
#include "ui/ozone/platform/dri/test/mock_dri_surface.h"
#include "ui/ozone/platform/dri/test/mock_dri_wrapper.h" #include "ui/ozone/platform/dri/test/mock_dri_wrapper.h"
#include "ui/ozone/platform/dri/test/mock_surface_generator.h" #include "ui/ozone/platform/dri/test/mock_surface_generator.h"
#include "ui/ozone/public/surface_factory_ozone.h" #include "ui/ozone/public/surface_factory_ozone.h"
...@@ -26,33 +25,6 @@ namespace { ...@@ -26,33 +25,6 @@ namespace {
const drmModeModeInfo kDefaultMode = const drmModeModeInfo kDefaultMode =
{0, 6, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, {'\0'}}; {0, 6, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, {'\0'}};
// SSFO would normally allocate DRM resources. We can't rely on having a DRM
// backend to allocate and display our buffers. Thus, we replace these
// resources with stubs. For DRM calls, we simply use stubs that do nothing and
// for buffers we use the default SkBitmap allocator.
class MockDriSurfaceFactory : public ui::DriSurfaceFactory {
public:
MockDriSurfaceFactory(ui::DriWrapper* dri, ui::ScreenManager* screen_manager)
: DriSurfaceFactory(dri, screen_manager), dri_(dri) {}
virtual ~MockDriSurfaceFactory() {};
const std::vector<ui::MockDriSurface*>& get_surfaces() const {
return surfaces_;
}
private:
virtual ui::DriSurface* CreateSurface(const gfx::Size& size) OVERRIDE {
ui::MockDriSurface* surface = new ui::MockDriSurface(dri_, size);
surfaces_.push_back(surface);
return surface;
}
ui::DriWrapper* dri_;
std::vector<ui::MockDriSurface*> surfaces_; // Not owned.
DISALLOW_COPY_AND_ASSIGN(MockDriSurfaceFactory);
};
class MockScreenManager : public ui::ScreenManager { class MockScreenManager : public ui::ScreenManager {
public: public:
MockScreenManager(ui::DriWrapper* dri, MockScreenManager(ui::DriWrapper* dri,
...@@ -69,7 +41,6 @@ class MockScreenManager : public ui::ScreenManager { ...@@ -69,7 +41,6 @@ class MockScreenManager : public ui::ScreenManager {
private: private:
ui::DriWrapper* dri_; // Not owned. ui::DriWrapper* dri_; // Not owned.
std::vector<ui::MockDriSurface*> surfaces_; // Not owned.
DISALLOW_COPY_AND_ASSIGN(MockScreenManager); DISALLOW_COPY_AND_ASSIGN(MockScreenManager);
}; };
...@@ -87,7 +58,7 @@ class DriSurfaceFactoryTest : public testing::Test { ...@@ -87,7 +58,7 @@ class DriSurfaceFactoryTest : public testing::Test {
scoped_ptr<ui::MockDriWrapper> dri_; scoped_ptr<ui::MockDriWrapper> dri_;
scoped_ptr<ui::MockSurfaceGenerator> surface_generator_; scoped_ptr<ui::MockSurfaceGenerator> surface_generator_;
scoped_ptr<MockScreenManager> screen_manager_; scoped_ptr<MockScreenManager> screen_manager_;
scoped_ptr<MockDriSurfaceFactory> factory_; scoped_ptr<ui::DriSurfaceFactory> factory_;
private: private:
DISALLOW_COPY_AND_ASSIGN(DriSurfaceFactoryTest); DISALLOW_COPY_AND_ASSIGN(DriSurfaceFactoryTest);
...@@ -99,7 +70,7 @@ void DriSurfaceFactoryTest::SetUp() { ...@@ -99,7 +70,7 @@ void DriSurfaceFactoryTest::SetUp() {
surface_generator_.reset(new ui::MockSurfaceGenerator(dri_.get())); surface_generator_.reset(new ui::MockSurfaceGenerator(dri_.get()));
screen_manager_.reset(new MockScreenManager(dri_.get(), screen_manager_.reset(new MockScreenManager(dri_.get(),
surface_generator_.get())); surface_generator_.get()));
factory_.reset(new MockDriSurfaceFactory(dri_.get(), screen_manager_.get())); factory_.reset(new ui::DriSurfaceFactory(dri_.get(), screen_manager_.get()));
} }
void DriSurfaceFactoryTest::TearDown() { void DriSurfaceFactoryTest::TearDown() {
...@@ -139,15 +110,24 @@ TEST_F(DriSurfaceFactoryTest, CheckNativeSurfaceContents) { ...@@ -139,15 +110,24 @@ TEST_F(DriSurfaceFactoryTest, CheckNativeSurfaceContents) {
surface->ResizeCanvas( surface->ResizeCanvas(
gfx::Size(kDefaultMode.hdisplay, kDefaultMode.vdisplay)); gfx::Size(kDefaultMode.hdisplay, kDefaultMode.vdisplay));
surface->GetCanvas()->drawColor(SK_ColorWHITE);
SkPaint paint;
paint.setColor(SK_ColorWHITE);
SkRect rect = SkRect::MakeWH(kDefaultMode.hdisplay / 2,
kDefaultMode.vdisplay / 2);
surface->GetCanvas()->drawRect(rect, paint);
surface->PresentCanvas( surface->PresentCanvas(
gfx::Rect(0, 0, kDefaultMode.hdisplay / 2, kDefaultMode.vdisplay / 2)); gfx::Rect(0, 0, kDefaultMode.hdisplay / 2, kDefaultMode.vdisplay / 2));
const std::vector<ui::DriBuffer*>& bitmaps =
surface_generator_->surfaces()[0]->bitmaps();
SkBitmap image; SkBitmap image;
bitmaps[1]->canvas()->readPixels(&image, 0, 0); // Buffers 0 and 1 are the cursor buffers and 2 and 3 are the surface buffers.
// Buffer 3 is the backbuffer we just painted in, so we want to make sure its
// contents are correct.
image.setInfo(dri_->buffers()[3]->getCanvas()->imageInfo());
EXPECT_TRUE(dri_->buffers()[3]->getCanvas()->readPixels(&image, 0, 0));
EXPECT_EQ(kDefaultMode.hdisplay, image.width());
EXPECT_EQ(kDefaultMode.vdisplay, image.height());
// Make sure the updates are correctly propagated to the native surface. // Make sure the updates are correctly propagated to the native surface.
for (int i = 0; i < image.height(); ++i) { for (int i = 0; i < image.height(); ++i) {
...@@ -177,17 +157,11 @@ TEST_F(DriSurfaceFactoryTest, SetCursorImage) { ...@@ -177,17 +157,11 @@ TEST_F(DriSurfaceFactoryTest, SetCursorImage) {
image.eraseColor(SK_ColorWHITE); image.eraseColor(SK_ColorWHITE);
factory_->SetHardwareCursor(w, image, gfx::Point(4, 2)); factory_->SetHardwareCursor(w, image, gfx::Point(4, 2));
const std::vector<ui::MockDriSurface*>& surfaces = factory_->get_surfaces();
// The first surface is the cursor surface since it is allocated early in the
// initialization process.
const std::vector<ui::DriBuffer*>& bitmaps = surfaces[0]->bitmaps();
// The surface should have been initialized to a double-buffered surface.
EXPECT_EQ(2u, bitmaps.size());
SkBitmap cursor; SkBitmap cursor;
bitmaps[1]->canvas()->readPixels(&cursor, 0, 0); // Buffers 0 and 1 are the cursor buffers.
cursor.setInfo(dri_->buffers()[1]->getCanvas()->imageInfo());
EXPECT_TRUE(dri_->buffers()[1]->getCanvas()->readPixels(&cursor, 0, 0));
// Check that the frontbuffer is displaying the right image as set above. // Check that the frontbuffer is displaying the right image as set above.
for (int i = 0; i < cursor.height(); ++i) { for (int i = 0; i < cursor.height(); ++i) {
......
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
#include "ui/ozone/platform/dri/dri_buffer.h" #include "ui/ozone/platform/dri/dri_buffer.h"
#include "ui/ozone/platform/dri/dri_surface.h" #include "ui/ozone/platform/dri/dri_surface.h"
#include "ui/ozone/platform/dri/hardware_display_controller.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" #include "ui/ozone/platform/dri/test/mock_dri_wrapper.h"
namespace { namespace {
...@@ -30,7 +29,7 @@ class DriSurfaceTest : public testing::Test { ...@@ -30,7 +29,7 @@ class DriSurfaceTest : public testing::Test {
protected: protected:
scoped_ptr<ui::MockDriWrapper> drm_; scoped_ptr<ui::MockDriWrapper> drm_;
scoped_ptr<ui::HardwareDisplayController> controller_; scoped_ptr<ui::HardwareDisplayController> controller_;
scoped_ptr<ui::MockDriSurface> surface_; scoped_ptr<ui::DriSurface> surface_;
private: private:
DISALLOW_COPY_AND_ASSIGN(DriSurfaceTest); DISALLOW_COPY_AND_ASSIGN(DriSurfaceTest);
...@@ -40,7 +39,7 @@ void DriSurfaceTest::SetUp() { ...@@ -40,7 +39,7 @@ void DriSurfaceTest::SetUp() {
drm_.reset(new ui::MockDriWrapper(3)); drm_.reset(new ui::MockDriWrapper(3));
controller_.reset(new ui::HardwareDisplayController(drm_.get(), 1, 1)); controller_.reset(new ui::HardwareDisplayController(drm_.get(), 1, 1));
surface_.reset(new ui::MockDriSurface( surface_.reset(new ui::DriSurface(
drm_.get(), gfx::Size(kDefaultMode.hdisplay, kDefaultMode.vdisplay))); drm_.get(), gfx::Size(kDefaultMode.hdisplay, kDefaultMode.vdisplay)));
} }
...@@ -51,7 +50,7 @@ void DriSurfaceTest::TearDown() { ...@@ -51,7 +50,7 @@ void DriSurfaceTest::TearDown() {
} }
TEST_F(DriSurfaceTest, FailInitialization) { TEST_F(DriSurfaceTest, FailInitialization) {
surface_->set_initialize_expectation(false); drm_->set_create_dumb_buffer_expectation(false);
EXPECT_FALSE(surface_->Initialize()); EXPECT_FALSE(surface_->Initialize());
} }
...@@ -87,32 +86,3 @@ TEST_F(DriSurfaceTest, CheckPixelPointerOnSwap) { ...@@ -87,32 +86,3 @@ TEST_F(DriSurfaceTest, CheckPixelPointerOnSwap) {
// pixels have been changed. // pixels have been changed.
EXPECT_NE(bitmap_pixels1, bitmap_pixels2); 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));
}
}
}
...@@ -5,18 +5,58 @@ ...@@ -5,18 +5,58 @@
#include "ui/ozone/platform/dri/dri_wrapper.h" #include "ui/ozone/platform/dri/dri_wrapper.h"
#include <fcntl.h> #include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h> #include <unistd.h>
#include <xf86drm.h> #include <xf86drm.h>
#include <xf86drmMode.h> #include <xf86drmMode.h>
#include "base/logging.h" #include "base/logging.h"
#include "third_party/skia/include/core/SkImageInfo.h"
#include "ui/ozone/platform/dri/dri_util.h"
namespace ui { namespace ui {
namespace { namespace {
uint32_t ToFixedPoint(double v) { uint32_t ToFixedPoint(double v) {
// This returns a number in a 16-bit.16-bit fixed point. // This returns a number in a 16-bit.16-bit fixed point.
return v * 65536.0; return v * 65536.0;
} }
bool DrmCreateDumbBuffer(int fd,
const SkImageInfo& info,
uint32_t* handle,
uint32_t* stride) {
struct drm_mode_create_dumb request;
memset(&request, 0, sizeof(request));
request.width = info.width();
request.height = info.height();
request.bpp = info.bytesPerPixel() << 3;
request.flags = 0;
if (drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &request) < 0) {
VLOG(2) << "Cannot create dumb buffer (" << errno << ") "
<< strerror(errno);
return false;
}
// The driver may choose to align the last row as well. We don't care about
// the last alignment bits since they aren't used for display purposes, so
// just check that the expected size is <= to what the driver allocated.
DCHECK_LE(info.getSafeSize(request.pitch), request.size);
*handle = request.handle;
*stride = request.pitch;
return true;
}
void DrmDestroyDumbBuffer(int fd, uint32_t handle) {
struct drm_mode_destroy_dumb destroy_request;
memset(&destroy_request, 0, sizeof(destroy_request));
destroy_request.handle = handle;
drmIoctl(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_request);
}
} // namespace } // namespace
DriWrapper::DriWrapper(const char* device_path) { DriWrapper::DriWrapper(const char* device_path) {
...@@ -174,4 +214,31 @@ void DriWrapper::HandleEvent(drmEventContext& event) { ...@@ -174,4 +214,31 @@ void DriWrapper::HandleEvent(drmEventContext& event) {
drmHandleEvent(fd_, &event); drmHandleEvent(fd_, &event);
} }
bool DriWrapper::CreateDumbBuffer(const SkImageInfo& info,
uint32_t* handle,
uint32_t* stride,
void** pixels) {
CHECK(fd_ >= 0);
if (!DrmCreateDumbBuffer(fd_, info, handle, stride))
return false;
if (!MapDumbBuffer(fd_, *handle, info.getSafeSize(*stride), pixels)) {
DrmDestroyDumbBuffer(fd_, *handle);
return false;
}
return true;
}
void DriWrapper::DestroyDumbBuffer(const SkImageInfo& info,
uint32_t handle,
uint32_t stride,
void* pixels) {
CHECK(fd_ >= 0);
munmap(pixels, info.getSafeSize(stride));
DrmDestroyDumbBuffer(fd_, handle);
}
} // namespace ui } // namespace ui
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
typedef struct _drmEventContext drmEventContext; typedef struct _drmEventContext drmEventContext;
typedef struct _drmModeModeInfo drmModeModeInfo; typedef struct _drmModeModeInfo drmModeModeInfo;
struct SkImageInfo;
namespace ui { namespace ui {
// Wraps DRM calls into a nice interface. Used to provide different // Wraps DRM calls into a nice interface. Used to provide different
...@@ -111,6 +113,16 @@ class DriWrapper { ...@@ -111,6 +113,16 @@ class DriWrapper {
virtual void HandleEvent(drmEventContext& event); virtual void HandleEvent(drmEventContext& event);
virtual bool CreateDumbBuffer(const SkImageInfo& info,
uint32_t* handle,
uint32_t* stride,
void** pixels);
virtual void DestroyDumbBuffer(const SkImageInfo& info,
uint32_t handle,
uint32_t stride,
void* pixels);
int get_fd() const { return fd_; } int get_fd() const { return fd_; }
protected: protected:
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
#include "ui/ozone/platform/dri/dri_surface.h" #include "ui/ozone/platform/dri/dri_surface.h"
#include "ui/ozone/platform/dri/dri_wrapper.h" #include "ui/ozone/platform/dri/dri_wrapper.h"
#include "ui/ozone/platform/dri/hardware_display_controller.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" #include "ui/ozone/platform/dri/test/mock_dri_wrapper.h"
#include "ui/ozone/public/native_pixmap.h" #include "ui/ozone/public/native_pixmap.h"
...@@ -50,7 +49,7 @@ void HardwareDisplayControllerTest::TearDown() { ...@@ -50,7 +49,7 @@ void HardwareDisplayControllerTest::TearDown() {
TEST_F(HardwareDisplayControllerTest, CheckStateAfterSurfaceIsBound) { TEST_F(HardwareDisplayControllerTest, CheckStateAfterSurfaceIsBound) {
scoped_ptr<ui::ScanoutSurface> surface( scoped_ptr<ui::ScanoutSurface> surface(
new ui::MockDriSurface(drm_.get(), kDefaultModeSize)); new ui::DriSurface(drm_.get(), kDefaultModeSize));
EXPECT_TRUE(surface->Initialize()); EXPECT_TRUE(surface->Initialize());
EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass(), EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass(),
...@@ -60,7 +59,7 @@ TEST_F(HardwareDisplayControllerTest, CheckStateAfterSurfaceIsBound) { ...@@ -60,7 +59,7 @@ TEST_F(HardwareDisplayControllerTest, CheckStateAfterSurfaceIsBound) {
TEST_F(HardwareDisplayControllerTest, CheckStateAfterPageFlip) { TEST_F(HardwareDisplayControllerTest, CheckStateAfterPageFlip) {
scoped_ptr<ui::ScanoutSurface> surface( scoped_ptr<ui::ScanoutSurface> surface(
new ui::MockDriSurface(drm_.get(), kDefaultModeSize)); new ui::DriSurface(drm_.get(), kDefaultModeSize));
EXPECT_TRUE(surface->Initialize()); EXPECT_TRUE(surface->Initialize());
EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass(), EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass(),
...@@ -74,7 +73,7 @@ TEST_F(HardwareDisplayControllerTest, CheckStateIfModesetFails) { ...@@ -74,7 +73,7 @@ TEST_F(HardwareDisplayControllerTest, CheckStateIfModesetFails) {
drm_->set_set_crtc_expectation(false); drm_->set_set_crtc_expectation(false);
scoped_ptr<ui::ScanoutSurface> surface( scoped_ptr<ui::ScanoutSurface> surface(
new ui::MockDriSurface(drm_.get(), kDefaultModeSize)); new ui::DriSurface(drm_.get(), kDefaultModeSize));
EXPECT_TRUE(surface->Initialize()); EXPECT_TRUE(surface->Initialize());
EXPECT_FALSE(controller_->BindSurfaceToController(surface.Pass(), EXPECT_FALSE(controller_->BindSurfaceToController(surface.Pass(),
...@@ -86,7 +85,7 @@ TEST_F(HardwareDisplayControllerTest, CheckStateIfPageFlipFails) { ...@@ -86,7 +85,7 @@ TEST_F(HardwareDisplayControllerTest, CheckStateIfPageFlipFails) {
drm_->set_page_flip_expectation(false); drm_->set_page_flip_expectation(false);
scoped_ptr<ui::ScanoutSurface> surface( scoped_ptr<ui::ScanoutSurface> surface(
new ui::MockDriSurface(drm_.get(), kDefaultModeSize)); new ui::DriSurface(drm_.get(), kDefaultModeSize));
EXPECT_TRUE(surface->Initialize()); EXPECT_TRUE(surface->Initialize());
EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass(), EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass(),
...@@ -97,7 +96,7 @@ TEST_F(HardwareDisplayControllerTest, CheckStateIfPageFlipFails) { ...@@ -97,7 +96,7 @@ TEST_F(HardwareDisplayControllerTest, CheckStateIfPageFlipFails) {
TEST_F(HardwareDisplayControllerTest, VerifyNoDRMCallsWhenDisabled) { TEST_F(HardwareDisplayControllerTest, VerifyNoDRMCallsWhenDisabled) {
scoped_ptr<ui::ScanoutSurface> surface( scoped_ptr<ui::ScanoutSurface> surface(
new ui::MockDriSurface(drm_.get(), kDefaultModeSize)); new ui::DriSurface(drm_.get(), kDefaultModeSize));
EXPECT_TRUE(surface->Initialize()); EXPECT_TRUE(surface->Initialize());
EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass(), EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass(),
...@@ -107,7 +106,7 @@ TEST_F(HardwareDisplayControllerTest, VerifyNoDRMCallsWhenDisabled) { ...@@ -107,7 +106,7 @@ TEST_F(HardwareDisplayControllerTest, VerifyNoDRMCallsWhenDisabled) {
std::vector<ui::OzoneOverlayPlane>(), NULL)); std::vector<ui::OzoneOverlayPlane>(), NULL));
EXPECT_EQ(0, drm_->get_page_flip_call_count()); EXPECT_EQ(0, drm_->get_page_flip_call_count());
surface.reset(new ui::MockDriSurface(drm_.get(), kDefaultModeSize)); surface.reset(new ui::DriSurface(drm_.get(), kDefaultModeSize));
EXPECT_TRUE(surface->Initialize()); EXPECT_TRUE(surface->Initialize());
EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass(), EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass(),
...@@ -119,9 +118,9 @@ TEST_F(HardwareDisplayControllerTest, VerifyNoDRMCallsWhenDisabled) { ...@@ -119,9 +118,9 @@ TEST_F(HardwareDisplayControllerTest, VerifyNoDRMCallsWhenDisabled) {
TEST_F(HardwareDisplayControllerTest, CheckOverlayMainSurfaceReplacement) { TEST_F(HardwareDisplayControllerTest, CheckOverlayMainSurfaceReplacement) {
scoped_ptr<ui::ScanoutSurface> surface( scoped_ptr<ui::ScanoutSurface> surface(
new ui::MockDriSurface(drm_.get(), kDefaultModeSize)); new ui::DriSurface(drm_.get(), kDefaultModeSize));
scoped_ptr<ui::ScanoutSurface> overlay( scoped_ptr<ui::ScanoutSurface> overlay(
new ui::MockDriSurface(drm_.get(), kDefaultModeSize)); new ui::DriSurface(drm_.get(), kDefaultModeSize));
EXPECT_TRUE(surface->Initialize()); EXPECT_TRUE(surface->Initialize());
EXPECT_TRUE( EXPECT_TRUE(
...@@ -144,9 +143,9 @@ TEST_F(HardwareDisplayControllerTest, CheckOverlayMainSurfaceReplacement) { ...@@ -144,9 +143,9 @@ TEST_F(HardwareDisplayControllerTest, CheckOverlayMainSurfaceReplacement) {
TEST_F(HardwareDisplayControllerTest, CheckOverlayPresent) { TEST_F(HardwareDisplayControllerTest, CheckOverlayPresent) {
scoped_ptr<ui::ScanoutSurface> surface( scoped_ptr<ui::ScanoutSurface> surface(
new ui::MockDriSurface(drm_.get(), kDefaultModeSize)); new ui::DriSurface(drm_.get(), kDefaultModeSize));
scoped_ptr<ui::ScanoutSurface> overlay( scoped_ptr<ui::ScanoutSurface> overlay(
new ui::MockDriSurface(drm_.get(), kDefaultModeSize)); new ui::DriSurface(drm_.get(), kDefaultModeSize));
EXPECT_TRUE(surface->Initialize()); EXPECT_TRUE(surface->Initialize());
EXPECT_TRUE( EXPECT_TRUE(
......
// 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 "ui/ozone/platform/dri/test/mock_dri_surface.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "ui/ozone/platform/dri/dri_buffer.h"
#include "ui/ozone/platform/dri/dri_wrapper.h"
namespace ui {
namespace {
class MockDriBuffer : public DriBuffer {
public:
MockDriBuffer(DriWrapper* dri, bool initialize_expectation)
: DriBuffer(dri), initialize_expectation_(initialize_expectation) {}
virtual ~MockDriBuffer() { surface_.clear(); }
virtual bool Initialize(const SkImageInfo& info) OVERRIDE {
if (!initialize_expectation_)
return false;
dri_->AddFramebuffer(
info.width(), info.height(), 24, 32, stride_, handle_, &framebuffer_);
surface_ = skia::AdoptRef(SkSurface::NewRaster(info));
surface_->getCanvas()->clear(SK_ColorBLACK);
return true;
}
private:
bool initialize_expectation_;
DISALLOW_COPY_AND_ASSIGN(MockDriBuffer);
};
} // namespace
MockDriSurface::MockDriSurface(DriWrapper* dri, const gfx::Size& size)
: DriSurface(dri, size), dri_(dri), initialize_expectation_(true) {}
MockDriSurface::~MockDriSurface() {}
DriBuffer* MockDriSurface::CreateBuffer() {
MockDriBuffer* bitmap = new MockDriBuffer(dri_, initialize_expectation_);
bitmaps_.push_back(bitmap);
return bitmap;
}
} // namespace ui
// 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.
#ifndef UI_OZONE_PLATFORM_DRI_TEST_MOCK_DRI_SURFACE_H_
#define UI_OZONE_PLATFORM_DRI_TEST_MOCK_DRI_SURFACE_H_
#include <vector>
#include "ui/ozone/platform/dri/dri_surface.h"
namespace gfx {
class Size;
} // namespace gfx
namespace ui {
class DriBuffer;
class DriWrapper;
class MockDriSurface : public DriSurface {
public:
MockDriSurface(DriWrapper* dri, const gfx::Size& size);
virtual ~MockDriSurface();
const std::vector<ui::DriBuffer*>& bitmaps() const { return bitmaps_; }
void set_initialize_expectation(bool state) {
initialize_expectation_ = state;
}
private:
// DriSurface:
virtual ui::DriBuffer* CreateBuffer() OVERRIDE;
DriWrapper* dri_; // Not owned.
std::vector<DriBuffer*> bitmaps_; // Not owned.
bool initialize_expectation_;
DISALLOW_COPY_AND_ASSIGN(MockDriSurface);
};
} // namespace ui
#endif // UI_OZONE_PLATFORM_DRI_TEST_MOCK_DRI_SURFACE_H_
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <xf86drm.h> #include <xf86drm.h>
#include <xf86drmMode.h> #include <xf86drmMode.h>
#include "third_party/skia/include/core/SkCanvas.h"
#include "ui/ozone/platform/dri/dri_surface.h" #include "ui/ozone/platform/dri/dri_surface.h"
#include "ui/ozone/platform/dri/hardware_display_controller.h" #include "ui/ozone/platform/dri/hardware_display_controller.h"
...@@ -30,7 +31,8 @@ MockDriWrapper::MockDriWrapper(int fd) ...@@ -30,7 +31,8 @@ MockDriWrapper::MockDriWrapper(int fd)
overlay_flip_call_count_(0), overlay_flip_call_count_(0),
set_crtc_expectation_(true), set_crtc_expectation_(true),
add_framebuffer_expectation_(true), add_framebuffer_expectation_(true),
page_flip_expectation_(true) { page_flip_expectation_(true),
create_dumb_buffer_expectation_(true) {
fd_ = fd; fd_ = fd;
} }
...@@ -120,4 +122,28 @@ bool MockDriWrapper::MoveCursor(uint32_t crtc_id, int x, int y) { ...@@ -120,4 +122,28 @@ bool MockDriWrapper::MoveCursor(uint32_t crtc_id, int x, int y) {
void MockDriWrapper::HandleEvent(drmEventContext& event) { void MockDriWrapper::HandleEvent(drmEventContext& event) {
} }
bool MockDriWrapper::CreateDumbBuffer(const SkImageInfo& info,
uint32_t* handle,
uint32_t* stride,
void** pixels) {
if (!create_dumb_buffer_expectation_)
return false;
*handle = 0;
*stride = info.minRowBytes();
*pixels = new char[info.getSafeSize(*stride)];
buffers_.push_back(
skia::AdoptRef(SkSurface::NewRasterDirect(info, *pixels, *stride)));
buffers_.back()->getCanvas()->clear(SK_ColorBLACK);
return true;
}
void MockDriWrapper::DestroyDumbBuffer(const SkImageInfo& info,
uint32_t handle,
uint32_t stride,
void* pixels) {
delete[] static_cast<char*>(pixels);
}
} // namespace ui } // namespace ui
...@@ -5,6 +5,10 @@ ...@@ -5,6 +5,10 @@
#ifndef UI_OZONE_PLATFORM_DRI_TEST_MOCK_DRI_WRAPPER_H_ #ifndef UI_OZONE_PLATFORM_DRI_TEST_MOCK_DRI_WRAPPER_H_
#define UI_OZONE_PLATFORM_DRI_TEST_MOCK_DRI_WRAPPER_H_ #define UI_OZONE_PLATFORM_DRI_TEST_MOCK_DRI_WRAPPER_H_
#include <vector>
#include "skia/ext/refptr.h"
#include "third_party/skia/include/core/SkSurface.h"
#include "ui/ozone/platform/dri/dri_wrapper.h" #include "ui/ozone/platform/dri/dri_wrapper.h"
namespace ui { namespace ui {
...@@ -31,6 +35,13 @@ class MockDriWrapper : public ui::DriWrapper { ...@@ -31,6 +35,13 @@ class MockDriWrapper : public ui::DriWrapper {
void set_add_framebuffer_expectation(bool state) { void set_add_framebuffer_expectation(bool state) {
add_framebuffer_expectation_ = state; add_framebuffer_expectation_ = state;
} }
void set_create_dumb_buffer_expectation(bool state) {
create_dumb_buffer_expectation_ = state;
}
const std::vector<skia::RefPtr<SkSurface> > buffers() const {
return buffers_;
}
// DriWrapper: // DriWrapper:
virtual ScopedDrmCrtcPtr GetCrtc(uint32_t crtc_id) OVERRIDE; virtual ScopedDrmCrtcPtr GetCrtc(uint32_t crtc_id) OVERRIDE;
...@@ -68,6 +79,14 @@ class MockDriWrapper : public ui::DriWrapper { ...@@ -68,6 +79,14 @@ class MockDriWrapper : public ui::DriWrapper {
uint32_t height) OVERRIDE; uint32_t height) OVERRIDE;
virtual bool MoveCursor(uint32_t crtc_id, int x, int y) OVERRIDE; virtual bool MoveCursor(uint32_t crtc_id, int x, int y) OVERRIDE;
virtual void HandleEvent(drmEventContext& event) OVERRIDE; virtual void HandleEvent(drmEventContext& event) OVERRIDE;
virtual bool CreateDumbBuffer(const SkImageInfo& info,
uint32_t* handle,
uint32_t* stride,
void** pixels) OVERRIDE;
virtual void DestroyDumbBuffer(const SkImageInfo& info,
uint32_t handle,
uint32_t stride,
void* pixels) OVERRIDE;
private: private:
int get_crtc_call_count_; int get_crtc_call_count_;
...@@ -80,6 +99,9 @@ class MockDriWrapper : public ui::DriWrapper { ...@@ -80,6 +99,9 @@ class MockDriWrapper : public ui::DriWrapper {
bool set_crtc_expectation_; bool set_crtc_expectation_;
bool add_framebuffer_expectation_; bool add_framebuffer_expectation_;
bool page_flip_expectation_; bool page_flip_expectation_;
bool create_dumb_buffer_expectation_;
std::vector<skia::RefPtr<SkSurface> > buffers_;
DISALLOW_COPY_AND_ASSIGN(MockDriWrapper); DISALLOW_COPY_AND_ASSIGN(MockDriWrapper);
}; };
......
...@@ -11,7 +11,7 @@ MockSurfaceGenerator::MockSurfaceGenerator(DriWrapper* dri) : dri_(dri) {} ...@@ -11,7 +11,7 @@ MockSurfaceGenerator::MockSurfaceGenerator(DriWrapper* dri) : dri_(dri) {}
MockSurfaceGenerator::~MockSurfaceGenerator() {} MockSurfaceGenerator::~MockSurfaceGenerator() {}
ScanoutSurface* MockSurfaceGenerator::Create(const gfx::Size& size) { ScanoutSurface* MockSurfaceGenerator::Create(const gfx::Size& size) {
surfaces_.push_back(new MockDriSurface(dri_, size)); surfaces_.push_back(new DriSurface(dri_, size));
return surfaces_.back(); return surfaces_.back();
} }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
#include <vector> #include <vector>
#include "ui/ozone/platform/dri/test/mock_dri_surface.h" #include "ui/ozone/platform/dri/dri_surface.h"
namespace gfx { namespace gfx {
class Size; class Size;
...@@ -22,7 +22,7 @@ class MockSurfaceGenerator : public ScanoutSurfaceGenerator { ...@@ -22,7 +22,7 @@ class MockSurfaceGenerator : public ScanoutSurfaceGenerator {
MockSurfaceGenerator(DriWrapper* dri); MockSurfaceGenerator(DriWrapper* dri);
virtual ~MockSurfaceGenerator(); virtual ~MockSurfaceGenerator();
std::vector<MockDriSurface*> surfaces() const { return surfaces_; } std::vector<DriSurface*> surfaces() const { return surfaces_; }
// ScanoutSurfaceGenerator: // ScanoutSurfaceGenerator:
virtual ScanoutSurface* Create(const gfx::Size& size) OVERRIDE; virtual ScanoutSurface* Create(const gfx::Size& size) OVERRIDE;
...@@ -30,7 +30,7 @@ class MockSurfaceGenerator : public ScanoutSurfaceGenerator { ...@@ -30,7 +30,7 @@ class MockSurfaceGenerator : public ScanoutSurfaceGenerator {
private: private:
DriWrapper* dri_; // Not owned. DriWrapper* dri_; // Not owned.
std::vector<MockDriSurface*> surfaces_; std::vector<DriSurface*> surfaces_;
DISALLOW_COPY_AND_ASSIGN(MockSurfaceGenerator); DISALLOW_COPY_AND_ASSIGN(MockSurfaceGenerator);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment