1*e7c364b6SAndroid Build Coastguard Worker /* 2*e7c364b6SAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project 3*e7c364b6SAndroid Build Coastguard Worker * 4*e7c364b6SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*e7c364b6SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*e7c364b6SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*e7c364b6SAndroid Build Coastguard Worker * 8*e7c364b6SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*e7c364b6SAndroid Build Coastguard Worker * 10*e7c364b6SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*e7c364b6SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*e7c364b6SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*e7c364b6SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*e7c364b6SAndroid Build Coastguard Worker * limitations under the License. 15*e7c364b6SAndroid Build Coastguard Worker */ 16*e7c364b6SAndroid Build Coastguard Worker 17*e7c364b6SAndroid Build Coastguard Worker #pragma once 18*e7c364b6SAndroid Build Coastguard Worker 19*e7c364b6SAndroid Build Coastguard Worker #include <linux/fb.h> 20*e7c364b6SAndroid Build Coastguard Worker #include <stddef.h> 21*e7c364b6SAndroid Build Coastguard Worker #include <stdint.h> 22*e7c364b6SAndroid Build Coastguard Worker 23*e7c364b6SAndroid Build Coastguard Worker #include <memory> 24*e7c364b6SAndroid Build Coastguard Worker #include <vector> 25*e7c364b6SAndroid Build Coastguard Worker 26*e7c364b6SAndroid Build Coastguard Worker #include <android-base/unique_fd.h> 27*e7c364b6SAndroid Build Coastguard Worker 28*e7c364b6SAndroid Build Coastguard Worker #include "graphics.h" 29*e7c364b6SAndroid Build Coastguard Worker #include "minui/minui.h" 30*e7c364b6SAndroid Build Coastguard Worker 31*e7c364b6SAndroid Build Coastguard Worker class GRSurfaceFbdev : public GRSurface { 32*e7c364b6SAndroid Build Coastguard Worker public: 33*e7c364b6SAndroid Build Coastguard Worker // Creates and returns a GRSurfaceFbdev instance, or nullptr on error. 34*e7c364b6SAndroid Build Coastguard Worker static std::unique_ptr<GRSurfaceFbdev> Create(size_t width, size_t height, size_t row_bytes, 35*e7c364b6SAndroid Build Coastguard Worker size_t pixel_bytes); 36*e7c364b6SAndroid Build Coastguard Worker data()37*e7c364b6SAndroid Build Coastguard Worker uint8_t* data() override { 38*e7c364b6SAndroid Build Coastguard Worker return buffer_; 39*e7c364b6SAndroid Build Coastguard Worker } 40*e7c364b6SAndroid Build Coastguard Worker 41*e7c364b6SAndroid Build Coastguard Worker protected: 42*e7c364b6SAndroid Build Coastguard Worker using GRSurface::GRSurface; 43*e7c364b6SAndroid Build Coastguard Worker 44*e7c364b6SAndroid Build Coastguard Worker private: 45*e7c364b6SAndroid Build Coastguard Worker friend class MinuiBackendFbdev; 46*e7c364b6SAndroid Build Coastguard Worker 47*e7c364b6SAndroid Build Coastguard Worker // Points to the start of the buffer: either the mmap'd framebuffer or one allocated in-memory. 48*e7c364b6SAndroid Build Coastguard Worker uint8_t* buffer_{ nullptr }; 49*e7c364b6SAndroid Build Coastguard Worker }; 50*e7c364b6SAndroid Build Coastguard Worker 51*e7c364b6SAndroid Build Coastguard Worker class MinuiBackendFbdev : public MinuiBackend { 52*e7c364b6SAndroid Build Coastguard Worker public: 53*e7c364b6SAndroid Build Coastguard Worker MinuiBackendFbdev() = default; 54*e7c364b6SAndroid Build Coastguard Worker ~MinuiBackendFbdev() override = default; 55*e7c364b6SAndroid Build Coastguard Worker 56*e7c364b6SAndroid Build Coastguard Worker GRSurface* Init() override; 57*e7c364b6SAndroid Build Coastguard Worker GRSurface* Flip() override; 58*e7c364b6SAndroid Build Coastguard Worker void Blank(bool) override; 59*e7c364b6SAndroid Build Coastguard Worker void Blank(bool blank, DrmConnector index) override; 60*e7c364b6SAndroid Build Coastguard Worker bool HasMultipleConnectors() override; 61*e7c364b6SAndroid Build Coastguard Worker 62*e7c364b6SAndroid Build Coastguard Worker private: 63*e7c364b6SAndroid Build Coastguard Worker void SetDisplayedFramebuffer(size_t n); 64*e7c364b6SAndroid Build Coastguard Worker 65*e7c364b6SAndroid Build Coastguard Worker std::unique_ptr<GRSurfaceFbdev> gr_framebuffer[2]; 66*e7c364b6SAndroid Build Coastguard Worker // Points to the current surface (i.e. one of the two gr_framebuffer's). 67*e7c364b6SAndroid Build Coastguard Worker GRSurfaceFbdev* gr_draw{ nullptr }; 68*e7c364b6SAndroid Build Coastguard Worker bool double_buffered; 69*e7c364b6SAndroid Build Coastguard Worker std::vector<uint8_t> memory_buffer; 70*e7c364b6SAndroid Build Coastguard Worker size_t displayed_buffer{ 0 }; 71*e7c364b6SAndroid Build Coastguard Worker fb_var_screeninfo vi; 72*e7c364b6SAndroid Build Coastguard Worker android::base::unique_fd fb_fd; 73*e7c364b6SAndroid Build Coastguard Worker }; 74