| Index: ui/ozone/platform/drm/test/mock_drm_device.cc
|
| diff --git a/ui/ozone/platform/drm/test/mock_drm_device.cc b/ui/ozone/platform/drm/test/mock_drm_device.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8999297a6a5e465fd9f11d1802b7cea69cd5532f
|
| --- /dev/null
|
| +++ b/ui/ozone/platform/drm/test/mock_drm_device.cc
|
| @@ -0,0 +1,262 @@
|
| +// 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/drm/test/mock_drm_device.h"
|
| +
|
| +#include <xf86drm.h>
|
| +#include <xf86drmMode.h>
|
| +
|
| +#include "base/logging.h"
|
| +#include "third_party/skia/include/core/SkCanvas.h"
|
| +#include "ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.h"
|
| +
|
| +namespace ui {
|
| +
|
| +namespace {
|
| +
|
| +template <class Object>
|
| +Object* DrmAllocator() {
|
| + return static_cast<Object*>(drmMalloc(sizeof(Object)));
|
| +}
|
| +
|
| +class MockHardwareDisplayPlaneManager
|
| + : public HardwareDisplayPlaneManagerLegacy {
|
| + public:
|
| + MockHardwareDisplayPlaneManager(DrmDevice* drm,
|
| + std::vector<uint32_t> crtcs,
|
| + size_t planes_per_crtc) {
|
| + const int kPlaneBaseId = 50;
|
| + drm_ = drm;
|
| + crtcs_.swap(crtcs);
|
| + for (size_t crtc_idx = 0; crtc_idx < crtcs_.size(); crtc_idx++) {
|
| + for (size_t i = 0; i < planes_per_crtc; i++) {
|
| + planes_.push_back(
|
| + new HardwareDisplayPlane(kPlaneBaseId + i, 1 << crtc_idx));
|
| + }
|
| + }
|
| + }
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +MockDrmDevice::MockDrmDevice()
|
| + : DrmDevice(base::FilePath(), base::File()),
|
| + get_crtc_call_count_(0),
|
| + set_crtc_call_count_(0),
|
| + restore_crtc_call_count_(0),
|
| + add_framebuffer_call_count_(0),
|
| + remove_framebuffer_call_count_(0),
|
| + page_flip_call_count_(0),
|
| + overlay_flip_call_count_(0),
|
| + overlay_clear_call_count_(0),
|
| + allocate_buffer_count_(0),
|
| + set_crtc_expectation_(true),
|
| + add_framebuffer_expectation_(true),
|
| + page_flip_expectation_(true),
|
| + create_dumb_buffer_expectation_(true),
|
| + current_framebuffer_(0) {
|
| + plane_manager_.reset(new HardwareDisplayPlaneManagerLegacy());
|
| +}
|
| +
|
| +MockDrmDevice::MockDrmDevice(bool use_sync_flips,
|
| + std::vector<uint32_t> crtcs,
|
| + size_t planes_per_crtc)
|
| + : DrmDevice(base::FilePath(), base::File()),
|
| + get_crtc_call_count_(0),
|
| + set_crtc_call_count_(0),
|
| + restore_crtc_call_count_(0),
|
| + add_framebuffer_call_count_(0),
|
| + remove_framebuffer_call_count_(0),
|
| + page_flip_call_count_(0),
|
| + overlay_flip_call_count_(0),
|
| + overlay_clear_call_count_(0),
|
| + allocate_buffer_count_(0),
|
| + set_crtc_expectation_(true),
|
| + add_framebuffer_expectation_(true),
|
| + page_flip_expectation_(true),
|
| + create_dumb_buffer_expectation_(true),
|
| + use_sync_flips_(use_sync_flips),
|
| + current_framebuffer_(0) {
|
| + plane_manager_.reset(
|
| + new MockHardwareDisplayPlaneManager(this, crtcs, planes_per_crtc));
|
| +}
|
| +
|
| +MockDrmDevice::~MockDrmDevice() {
|
| +}
|
| +
|
| +ScopedDrmCrtcPtr MockDrmDevice::GetCrtc(uint32_t crtc_id) {
|
| + get_crtc_call_count_++;
|
| + return ScopedDrmCrtcPtr(DrmAllocator<drmModeCrtc>());
|
| +}
|
| +
|
| +bool MockDrmDevice::SetCrtc(uint32_t crtc_id,
|
| + uint32_t framebuffer,
|
| + std::vector<uint32_t> connectors,
|
| + drmModeModeInfo* mode) {
|
| + current_framebuffer_ = framebuffer;
|
| + set_crtc_call_count_++;
|
| + return set_crtc_expectation_;
|
| +}
|
| +
|
| +bool MockDrmDevice::SetCrtc(drmModeCrtc* crtc,
|
| + std::vector<uint32_t> connectors) {
|
| + restore_crtc_call_count_++;
|
| + return true;
|
| +}
|
| +
|
| +bool MockDrmDevice::DisableCrtc(uint32_t crtc_id) {
|
| + current_framebuffer_ = 0;
|
| + return true;
|
| +}
|
| +
|
| +ScopedDrmConnectorPtr MockDrmDevice::GetConnector(uint32_t connector_id) {
|
| + return ScopedDrmConnectorPtr(DrmAllocator<drmModeConnector>());
|
| +}
|
| +
|
| +bool MockDrmDevice::AddFramebuffer(uint32_t width,
|
| + uint32_t height,
|
| + uint8_t depth,
|
| + uint8_t bpp,
|
| + uint32_t stride,
|
| + uint32_t handle,
|
| + uint32_t* framebuffer) {
|
| + add_framebuffer_call_count_++;
|
| + *framebuffer = add_framebuffer_call_count_;
|
| + return add_framebuffer_expectation_;
|
| +}
|
| +
|
| +bool MockDrmDevice::RemoveFramebuffer(uint32_t framebuffer) {
|
| + remove_framebuffer_call_count_++;
|
| + return true;
|
| +}
|
| +
|
| +ScopedDrmFramebufferPtr MockDrmDevice::GetFramebuffer(uint32_t framebuffer) {
|
| + return ScopedDrmFramebufferPtr();
|
| +}
|
| +
|
| +bool MockDrmDevice::PageFlip(uint32_t crtc_id,
|
| + uint32_t framebuffer,
|
| + bool is_sync,
|
| + const PageFlipCallback& callback) {
|
| + page_flip_call_count_++;
|
| + current_framebuffer_ = framebuffer;
|
| + if (page_flip_expectation_) {
|
| + if (use_sync_flips_)
|
| + callback.Run(0, 0, 0);
|
| + else
|
| + callbacks_.push(callback);
|
| + }
|
| +
|
| + return page_flip_expectation_;
|
| +}
|
| +
|
| +bool MockDrmDevice::PageFlipOverlay(uint32_t crtc_id,
|
| + uint32_t framebuffer,
|
| + const gfx::Rect& location,
|
| + const gfx::Rect& source,
|
| + int overlay_plane) {
|
| + if (!framebuffer)
|
| + overlay_clear_call_count_++;
|
| + overlay_flip_call_count_++;
|
| + return true;
|
| +}
|
| +
|
| +ScopedDrmPropertyPtr MockDrmDevice::GetProperty(drmModeConnector* connector,
|
| + const char* name) {
|
| + return ScopedDrmPropertyPtr(DrmAllocator<drmModePropertyRes>());
|
| +}
|
| +
|
| +bool MockDrmDevice::SetProperty(uint32_t connector_id,
|
| + uint32_t property_id,
|
| + uint64_t value) {
|
| + return true;
|
| +}
|
| +
|
| +bool MockDrmDevice::GetCapability(uint64_t capability, uint64_t* value) {
|
| + return true;
|
| +}
|
| +
|
| +ScopedDrmPropertyBlobPtr MockDrmDevice::GetPropertyBlob(
|
| + drmModeConnector* connector,
|
| + const char* name) {
|
| + return ScopedDrmPropertyBlobPtr(DrmAllocator<drmModePropertyBlobRes>());
|
| +}
|
| +
|
| +bool MockDrmDevice::SetCursor(uint32_t crtc_id,
|
| + uint32_t handle,
|
| + const gfx::Size& size) {
|
| + crtc_cursor_map_[crtc_id] = handle;
|
| + return true;
|
| +}
|
| +
|
| +bool MockDrmDevice::MoveCursor(uint32_t crtc_id, const gfx::Point& point) {
|
| + return true;
|
| +}
|
| +
|
| +bool MockDrmDevice::CreateDumbBuffer(const SkImageInfo& info,
|
| + uint32_t* handle,
|
| + uint32_t* stride) {
|
| + if (!create_dumb_buffer_expectation_)
|
| + return false;
|
| +
|
| + *handle = allocate_buffer_count_++;
|
| + *stride = info.minRowBytes();
|
| + void* pixels = new char[info.getSafeSize(*stride)];
|
| + buffers_.push_back(
|
| + skia::AdoptRef(SkSurface::NewRasterDirect(info, pixels, *stride)));
|
| + buffers_[*handle]->getCanvas()->clear(SK_ColorBLACK);
|
| +
|
| + return true;
|
| +}
|
| +
|
| +bool MockDrmDevice::DestroyDumbBuffer(uint32_t handle) {
|
| + if (handle >= buffers_.size() || !buffers_[handle])
|
| + return false;
|
| +
|
| + buffers_[handle].clear();
|
| + return true;
|
| +}
|
| +
|
| +bool MockDrmDevice::MapDumbBuffer(uint32_t handle, size_t size, void** pixels) {
|
| + if (handle >= buffers_.size() || !buffers_[handle])
|
| + return false;
|
| +
|
| + *pixels = const_cast<void*>(buffers_[handle]->peekPixels(nullptr, nullptr));
|
| + return true;
|
| +}
|
| +
|
| +bool MockDrmDevice::UnmapDumbBuffer(void* pixels, size_t size) {
|
| + return true;
|
| +}
|
| +
|
| +bool MockDrmDevice::CloseBufferHandle(uint32_t handle) {
|
| + return true;
|
| +}
|
| +
|
| +bool MockDrmDevice::CommitProperties(drmModePropertySet* properties,
|
| + uint32_t flags,
|
| + bool is_sync,
|
| + bool test_only,
|
| + const PageFlipCallback& callback) {
|
| + return false;
|
| +}
|
| +
|
| +bool MockDrmDevice::SetGammaRamp(uint32_t crtc_id,
|
| + const std::vector<GammaRampRGBEntry>& lut) {
|
| + return true;
|
| +}
|
| +
|
| +bool MockDrmDevice::SetCapability(uint64_t capability, uint64_t value) {
|
| + return false;
|
| +}
|
| +
|
| +void MockDrmDevice::RunCallbacks() {
|
| + while (!callbacks_.empty()) {
|
| + PageFlipCallback callback = callbacks_.front();
|
| + callbacks_.pop();
|
| + callback.Run(0, 0, 0);
|
| + }
|
| +}
|
| +
|
| +} // namespace ui
|
|
|