-
Notifications
You must be signed in to change notification settings - Fork 3
/
RPiSurface.cpp
132 lines (119 loc) · 4.71 KB
/
RPiSurface.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
* Copyright (c) 2016-2023 WangBin <wbsecg1 at gmail.com>
* Universal Graphics Surface
* Source code: https://github.com/wang-bin/ugs
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#include "ugs/PlatformSurface.h"
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <bcm_host.h>
#include <EGL/egl.h>
#include <dlfcn.h>
#include <fstream>
#include <EGL/eglext.h>
#ifndef EGLEXT_BRCM_H // non-brcm egl headers are used
typedef struct {
DISPMANX_ELEMENT_HANDLE_T element;
int width; /* This is necessary because dispmanx elements are not queriable. */
int height;
} EGL_DISPMANX_WINDOW_T;
#endif
UGS_NS_BEGIN
using namespace std;
static bool is_legacy_gl_driver()
{ // fake kms can open dispmanx, but can not use it
std::ifstream is("/proc/modules");
if (!is.is_open())
return true;
string line;
while (std::getline(is, line)) {
if (line.find("vc4") != string::npos)
return false;
}
return true;
}
static int getDisplayId() { // vc_dispmanx_types.h: DISPMANX_ID_MAIN_LCD 0, DISPMANX_ID_AUX_LCD 1, DISPMANX_ID_HDMI 2, DISPMANX_ID_SDTV 3, DISPMANX_ID_FORCE_LCD 4, DISPMANX_ID_FORCE_TV 5
static int id = -1;
if (id >= 0)
return id;
const char* e = std::getenv("DISPMANX_ID");
if (e)
id =