xref: /aosp_15_r20/bootable/recovery/minui/graphics_fbdev.h (revision e7c364b630b241adcb6c7726a21055250b91fdac)
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