1// Copyright 2014 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. 4 5#include "ui/ozone/platform/dri/test/mock_dri_wrapper.h" 6 7#include <xf86drm.h> 8#include <xf86drmMode.h> 9 10#include "third_party/skia/include/core/SkCanvas.h" 11#include "ui/ozone/platform/dri/hardware_display_controller.h" 12 13namespace ui { 14 15namespace { 16 17template<class Object> Object* DrmAllocator() { 18 return static_cast<Object*>(drmMalloc(sizeof(Object))); 19} 20 21} // namespace 22 23MockDriWrapper::MockDriWrapper(int fd) 24 : DriWrapper(""), 25 get_crtc_call_count_(0), 26 set_crtc_call_count_(0), 27 restore_crtc_call_count_(0), 28 add_framebuffer_call_count_(0), 29 remove_framebuffer_call_count_(0), 30 page_flip_call_count_(0), 31 overlay_flip_call_count_(0), 32 set_crtc_expectation_(true), 33 add_framebuffer_expectation_(true), 34 page_flip_expectation_(true), 35 create_dumb_buffer_expectation_(true), 36 current_framebuffer_(0) { 37 fd_ = fd; 38} 39 40MockDriWrapper::~MockDriWrapper() { 41 fd_ = -1; 42} 43 44ScopedDrmCrtcPtr MockDriWrapper::GetCrtc(uint32_t crtc_id) { 45 get_crtc_call_count_++; 46 return ScopedDrmCrtcPtr(DrmAllocator<drmModeCrtc>()); 47} 48 49bool MockDriWrapper::SetCrtc(uint32_t crtc_id, 50 uint32_t framebuffer, 51 std::vector<uint32_t> connectors, 52 drmModeModeInfo* mode) { 53 current_framebuffer_ = framebuffer; 54 set_crtc_call_count_++; 55 return set_crtc_expectation_; 56} 57 58bool MockDriWrapper::SetCrtc(drmModeCrtc* crtc, 59 std::vector<uint32_t> connectors) { 60 restore_crtc_call_count_++; 61 return true; 62} 63 64ScopedDrmConnectorPtr MockDriWrapper::GetConnector(uint32_t connector_id) { 65 return ScopedDrmConnectorPtr(DrmAllocator<drmModeConnector>()); 66} 67 68bool MockDriWrapper::AddFramebuffer(uint32_t width, 69 uint32_t height, 70 uint8_t depth, 71 uint8_t bpp, 72 uint32_t stride, 73 uint32_t handle, 74 uint32_t* framebuffer) { 75 add_framebuffer_call_count_++; 76 *framebuffer = add_framebuffer_call_count_; 77 return add_framebuffer_expectation_; 78} 79 80bool MockDriWrapper::RemoveFramebuffer(uint32_t framebuffer) { 81 remove_framebuffer_call_count_++; 82 return true; 83} 84 85bool MockDriWrapper::PageFlip(uint32_t crtc_id, 86 uint32_t framebuffer, 87 void* data) { 88 page_flip_call_count_++; 89 current_framebuffer_ = framebuffer; 90 controllers_.push(static_cast<ui::HardwareDisplayController*>(data)); 91 return page_flip_expectation_; 92} 93 94bool MockDriWrapper::PageFlipOverlay(uint32_t crtc_id, 95 uint32_t framebuffer, 96 const gfx::Rect& location, 97 const gfx::RectF& source, 98 int overlay_plane) { 99 overlay_flip_call_count_++; 100 return true; 101} 102 103ScopedDrmPropertyPtr MockDriWrapper::GetProperty(drmModeConnector* connector, 104 const char* name) { 105 return ScopedDrmPropertyPtr(DrmAllocator<drmModePropertyRes>()); 106} 107 108bool MockDriWrapper::SetProperty(uint32_t connector_id, 109 uint32_t property_id, 110 uint64_t value) { 111 return true; 112} 113 114ScopedDrmPropertyBlobPtr MockDriWrapper::GetPropertyBlob( 115 drmModeConnector* connector, 116 const char* name) { 117 return ScopedDrmPropertyBlobPtr(DrmAllocator<drmModePropertyBlobRes>()); 118} 119 120bool MockDriWrapper::SetCursor(uint32_t crtc_id, 121 uint32_t handle, 122 const gfx::Size& size) { 123 return true; 124} 125 126bool MockDriWrapper::MoveCursor(uint32_t crtc_id, const gfx::Point& point) { 127 return true; 128} 129 130void MockDriWrapper::HandleEvent(drmEventContext& event) { 131 CHECK(!controllers_.empty()); 132 controllers_.front()->OnPageFlipEvent(0, 0, 0); 133 controllers_.pop(); 134} 135 136bool MockDriWrapper::CreateDumbBuffer(const SkImageInfo& info, 137 uint32_t* handle, 138 uint32_t* stride, 139 void** pixels) { 140 if (!create_dumb_buffer_expectation_) 141 return false; 142 143 *handle = 0; 144 *stride = info.minRowBytes(); 145 *pixels = new char[info.getSafeSize(*stride)]; 146 buffers_.push_back( 147 skia::AdoptRef(SkSurface::NewRasterDirect(info, *pixels, *stride))); 148 buffers_.back()->getCanvas()->clear(SK_ColorBLACK); 149 150 return true; 151} 152 153void MockDriWrapper::DestroyDumbBuffer(const SkImageInfo& info, 154 uint32_t handle, 155 uint32_t stride, 156 void* pixels) { 157 delete[] static_cast<char*>(pixels); 158} 159 160} // namespace ui 161