-
Notifications
You must be signed in to change notification settings - Fork 45
/
hwcomposer_backend.cpp
153 lines (139 loc) · 5.83 KB
/
hwcomposer_backend.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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/****************************************************************************
**
** Copyright (C) 2013 Jolla Ltd.
** Contact: Thomas Perl <thomas.perl@jolla.com>
**
** This file is part of the hwcomposer plugin.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU General Public License version 3.0 requirements will be
** met: http://www.gnu.org/copyleft/gpl.html.
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "hwcomposer_backend.h"
#ifdef HWC_DEVICE_API_VERSION_0_1
#include "hwcomposer_backend_v0.h"
#endif
#include "hwcomposer_backend_v10.h"
#include "hwcomposer_backend_v11.h"
HwComposerBackend::HwComposerBackend(hw_module_t *hwc_module)
: hwc_module(hwc_module)
{
}
HwComposerBackend::~HwComposerBackend()
{
// XXX: Close/free hwc_module?
}
HwComposerBackend *
HwComposerBackend::create()
{
hw_module_t *hwc_module = NULL;
hw_device_t *hwc_device = NULL;
// Some implementations insist on having the framebuffer module opened before loading
// the hardware composer one. Therefor we rely on using the fbdev HYBRIS_EGLPLATFORM
// here and use eglGetDisplay to initialize it.
if (qEnvironmentVariableIsEmpty("QT_QPA_NO_FRAMEBUFFER_FIRST")) {
eglGetDisplay(EGL_DEFAULT_DISPLAY);
}
// Open hardware composer
HWC_PLUGIN_ASSERT_ZERO(hw_get_module(HWC_HARDWARE_MODULE_ID, (const hw_module_t **)(&hwc_module)));
fprintf(stderr, "== hwcomposer module ==\n");
fprintf(stderr, " * Address: %p\n", hwc_module);
fprintf(stderr, " * Module API Version: %x\n", hwc_module->module_api_version);
fprintf(stderr, " * HAL API Version: %x\n", hwc_module->hal_api_version); /* should be zero */
fprintf(stderr, " * Identifier: %s\n", hwc_module->id);
fprintf(stderr, " * Name: %s\n", hwc_module->name);
fprintf(stderr, " * Author: %s\n", hwc_module->author);
fprintf(stderr, "== hwcomposer module ==\n");
// Open hardware composer device
HWC_PLUGIN_ASSERT_ZERO(hwc_module->methods->open(hwc_module, HWC_HARDWARE_COMPOSER, &hwc_device));
uint32_t version = interpreted_version(hwc_device);
fprintf(stderr, "== hwcomposer device ==\n");
fprintf(stderr, " * Version: %x (interpreted as %x)\n", hwc_device->version, version);
fprintf(stderr, " * Module: %p\n", hwc_device->module);
fprintf(stderr, "== hwcomposer device ==\n");
#ifdef HWC_DEVICE_API_VERSION_0_1
// Special-case for old hw adaptations that have the version encoded in
// legacy format, we have to check hwc_device->version directly, because
// the constants are actually encoded in the old format
if ((hwc_device->version == HWC_DEVICE_API_VERSION_0_1) ||
(hwc_device->version == HWC_DEVICE_API_VERSION_0_2) ||
(hwc_device->version == HWC_DEVICE_API_VERSION_0_3)) {
return new HwComposerBackend_v0(hwc_module, hwc_device);
}
#endif
// Determine which backend we use based on the supported module API version
switch (version) {
#ifdef HWC_DEVICE_API_VERSION_0_1
case HWC_DEVICE_API_VERSION_0_1:
case HWC_DEVICE_API_VERSION_0_2:
case HWC_DEVICE_API_VERSION_0_3:
return new HwComposerBackend_v0(hwc_module, hwc_device);
break;
#endif
#ifdef HWC_DEVICE_API_VERSION_1_0
case HWC_DEVICE_API_VERSION_1_0:
return new HwComposerBackend_v10(hwc_module, hwc_device);
break;
#endif /* HWC_DEVICE_API_VERSION_1_0 */
#ifdef HWC_PLUGIN_HAVE_HWCOMPOSER1_API
case HWC_DEVICE_API_VERSION_1_1:
#ifdef HWC_DEVICE_API_VERSION_1_2
case HWC_DEVICE_API_VERSION_1_2:
#endif
#ifdef HWC_DEVICE_API_VERSION_1_3
case HWC_DEVICE_API_VERSION_1_3:
#endif
#ifdef HWC_DEVICE_API_VERSION_1_4
case HWC_DEVICE_API_VERSION_1_4:
#endif
#ifdef HWC_DEVICE_API_VERSION_1_5
case HWC_DEVICE_API_VERSION_1_5:
#endif
// HWC_NUM_DISPLAY_TYPES is the actual size of the array, otherwise
// underrun/overruns happen
return new HwComposerBackend_v11(hwc_module, hwc_device, HWC_NUM_DISPLAY_TYPES);
break;
#endif /* HWC_PLUGIN_HAVE_HWCOMPOSER1_API */
default:
fprintf(stderr, "Unknown hwcomposer API: 0x%x/0x%x/0x%x\n",
hwc_module->module_api_version,
hwc_device->version,
version);
return NULL;
break;
}
}
void
HwComposerBackend::destroy(HwComposerBackend *backend)
{
delete backend;
}