xref: /aosp_15_r20/bootable/recovery/minui/graphics_drm.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 <stddef.h>
20*e7c364b6SAndroid Build Coastguard Worker #include <stdint.h>
21*e7c364b6SAndroid Build Coastguard Worker 
22*e7c364b6SAndroid Build Coastguard Worker #include <memory>
23*e7c364b6SAndroid Build Coastguard Worker 
24*e7c364b6SAndroid Build Coastguard Worker #include <xf86drmMode.h>
25*e7c364b6SAndroid Build Coastguard Worker 
26*e7c364b6SAndroid Build Coastguard Worker #include "graphics.h"
27*e7c364b6SAndroid Build Coastguard Worker #include "minui/minui.h"
28*e7c364b6SAndroid Build Coastguard Worker 
29*e7c364b6SAndroid Build Coastguard Worker class GRSurfaceDrm : public GRSurface {
30*e7c364b6SAndroid Build Coastguard Worker  public:
31*e7c364b6SAndroid Build Coastguard Worker   ~GRSurfaceDrm() override;
32*e7c364b6SAndroid Build Coastguard Worker 
33*e7c364b6SAndroid Build Coastguard Worker   // Creates a GRSurfaceDrm instance.
34*e7c364b6SAndroid Build Coastguard Worker   static std::unique_ptr<GRSurfaceDrm> Create(int drm_fd, int width, int height);
35*e7c364b6SAndroid Build Coastguard Worker 
data()36*e7c364b6SAndroid Build Coastguard Worker   uint8_t* data() override {
37*e7c364b6SAndroid Build Coastguard Worker     return mmapped_buffer_;
38*e7c364b6SAndroid Build Coastguard Worker   }
39*e7c364b6SAndroid Build Coastguard Worker 
40*e7c364b6SAndroid Build Coastguard Worker  private:
41*e7c364b6SAndroid Build Coastguard Worker   friend class MinuiBackendDrm;
42*e7c364b6SAndroid Build Coastguard Worker 
GRSurfaceDrm(size_t width,size_t height,size_t row_bytes,size_t pixel_bytes,int drm_fd,uint32_t handle)43*e7c364b6SAndroid Build Coastguard Worker   GRSurfaceDrm(size_t width, size_t height, size_t row_bytes, size_t pixel_bytes, int drm_fd,
44*e7c364b6SAndroid Build Coastguard Worker                uint32_t handle)
45*e7c364b6SAndroid Build Coastguard Worker       : GRSurface(width, height, row_bytes, pixel_bytes), drm_fd_(drm_fd), handle(handle) {}
46*e7c364b6SAndroid Build Coastguard Worker 
47*e7c364b6SAndroid Build Coastguard Worker   const int drm_fd_;
48*e7c364b6SAndroid Build Coastguard Worker 
49*e7c364b6SAndroid Build Coastguard Worker   uint32_t fb_id{ 0 };
50*e7c364b6SAndroid Build Coastguard Worker   uint32_t handle{ 0 };
51*e7c364b6SAndroid Build Coastguard Worker   uint8_t* mmapped_buffer_{ nullptr };
52*e7c364b6SAndroid Build Coastguard Worker };
53*e7c364b6SAndroid Build Coastguard Worker 
54*e7c364b6SAndroid Build Coastguard Worker class MinuiBackendDrm : public MinuiBackend {
55*e7c364b6SAndroid Build Coastguard Worker  public:
56*e7c364b6SAndroid Build Coastguard Worker   MinuiBackendDrm() = default;
57*e7c364b6SAndroid Build Coastguard Worker   ~MinuiBackendDrm() override;
58*e7c364b6SAndroid Build Coastguard Worker 
59*e7c364b6SAndroid Build Coastguard Worker   GRSurface* Init() override;
60*e7c364b6SAndroid Build Coastguard Worker   GRSurface* Flip() override;
61*e7c364b6SAndroid Build Coastguard Worker   void Blank(bool) override;
62*e7c364b6SAndroid Build Coastguard Worker   void Blank(bool blank, DrmConnector index) override;
63*e7c364b6SAndroid Build Coastguard Worker   bool HasMultipleConnectors() override;
64*e7c364b6SAndroid Build Coastguard Worker 
65*e7c364b6SAndroid Build Coastguard Worker  private:
66*e7c364b6SAndroid Build Coastguard Worker   void DrmDisableCrtc(int drm_fd, drmModeCrtc* crtc);
67*e7c364b6SAndroid Build Coastguard Worker   bool DrmEnableCrtc(int drm_fd, drmModeCrtc* crtc, const std::unique_ptr<GRSurfaceDrm>& surface,
68*e7c364b6SAndroid Build Coastguard Worker                      uint32_t* conntcors);
69*e7c364b6SAndroid Build Coastguard Worker   void DisableNonMainCrtcs(int fd, drmModeRes* resources, drmModeCrtc* main_crtc);
70*e7c364b6SAndroid Build Coastguard Worker   bool FindAndSetMonitor(int fd, drmModeRes* resources);
71*e7c364b6SAndroid Build Coastguard Worker 
72*e7c364b6SAndroid Build Coastguard Worker   struct DrmInterface {
73*e7c364b6SAndroid Build Coastguard Worker     std::unique_ptr<GRSurfaceDrm> GRSurfaceDrms[2];
74*e7c364b6SAndroid Build Coastguard Worker     int current_buffer{ 0 };
75*e7c364b6SAndroid Build Coastguard Worker     drmModeCrtc* monitor_crtc{ nullptr };
76*e7c364b6SAndroid Build Coastguard Worker     drmModeConnector* monitor_connector{ nullptr };
77*e7c364b6SAndroid Build Coastguard Worker     uint32_t selected_mode{ 0 };
78*e7c364b6SAndroid Build Coastguard Worker   } drm[DRM_MAX];
79*e7c364b6SAndroid Build Coastguard Worker 
80*e7c364b6SAndroid Build Coastguard Worker   int drm_fd{ -1 };
81*e7c364b6SAndroid Build Coastguard Worker   DrmConnector active_display = DRM_MAIN;
82*e7c364b6SAndroid Build Coastguard Worker };
83