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