1*e01b6f76SAndroid Build Coastguard Worker /*
2*e01b6f76SAndroid Build Coastguard Worker * Copyright (C) 2010 The Android Open Source Project
3*e01b6f76SAndroid Build Coastguard Worker *
4*e01b6f76SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*e01b6f76SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*e01b6f76SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*e01b6f76SAndroid Build Coastguard Worker *
8*e01b6f76SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*e01b6f76SAndroid Build Coastguard Worker *
10*e01b6f76SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*e01b6f76SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*e01b6f76SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e01b6f76SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*e01b6f76SAndroid Build Coastguard Worker * limitations under the License.
15*e01b6f76SAndroid Build Coastguard Worker */
16*e01b6f76SAndroid Build Coastguard Worker
17*e01b6f76SAndroid Build Coastguard Worker #include <errno.h>
18*e01b6f76SAndroid Build Coastguard Worker #include <fcntl.h>
19*e01b6f76SAndroid Build Coastguard Worker #include <malloc.h>
20*e01b6f76SAndroid Build Coastguard Worker #include <string.h>
21*e01b6f76SAndroid Build Coastguard Worker
22*e01b6f76SAndroid Build Coastguard Worker #include <cutils/atomic.h>
23*e01b6f76SAndroid Build Coastguard Worker #include <log/log.h>
24*e01b6f76SAndroid Build Coastguard Worker
25*e01b6f76SAndroid Build Coastguard Worker #include <hardware/hardware.h>
26*e01b6f76SAndroid Build Coastguard Worker #include <hardware/hwcomposer.h>
27*e01b6f76SAndroid Build Coastguard Worker
28*e01b6f76SAndroid Build Coastguard Worker #include <EGL/egl.h>
29*e01b6f76SAndroid Build Coastguard Worker
30*e01b6f76SAndroid Build Coastguard Worker /*****************************************************************************/
31*e01b6f76SAndroid Build Coastguard Worker
32*e01b6f76SAndroid Build Coastguard Worker struct hwc_context_t {
33*e01b6f76SAndroid Build Coastguard Worker hwc_composer_device_1_t device;
34*e01b6f76SAndroid Build Coastguard Worker /* our private state goes below here */
35*e01b6f76SAndroid Build Coastguard Worker };
36*e01b6f76SAndroid Build Coastguard Worker
37*e01b6f76SAndroid Build Coastguard Worker static int hwc_device_open(const struct hw_module_t* module, const char* name,
38*e01b6f76SAndroid Build Coastguard Worker struct hw_device_t** device);
39*e01b6f76SAndroid Build Coastguard Worker
40*e01b6f76SAndroid Build Coastguard Worker static struct hw_module_methods_t hwc_module_methods = {
41*e01b6f76SAndroid Build Coastguard Worker .open = hwc_device_open
42*e01b6f76SAndroid Build Coastguard Worker };
43*e01b6f76SAndroid Build Coastguard Worker
44*e01b6f76SAndroid Build Coastguard Worker hwc_module_t HAL_MODULE_INFO_SYM = {
45*e01b6f76SAndroid Build Coastguard Worker .common = {
46*e01b6f76SAndroid Build Coastguard Worker .tag = HARDWARE_MODULE_TAG,
47*e01b6f76SAndroid Build Coastguard Worker .version_major = 1,
48*e01b6f76SAndroid Build Coastguard Worker .version_minor = 0,
49*e01b6f76SAndroid Build Coastguard Worker .id = HWC_HARDWARE_MODULE_ID,
50*e01b6f76SAndroid Build Coastguard Worker .name = "Sample hwcomposer module",
51*e01b6f76SAndroid Build Coastguard Worker .author = "The Android Open Source Project",
52*e01b6f76SAndroid Build Coastguard Worker .methods = &hwc_module_methods,
53*e01b6f76SAndroid Build Coastguard Worker }
54*e01b6f76SAndroid Build Coastguard Worker };
55*e01b6f76SAndroid Build Coastguard Worker
56*e01b6f76SAndroid Build Coastguard Worker /*****************************************************************************/
57*e01b6f76SAndroid Build Coastguard Worker
58*e01b6f76SAndroid Build Coastguard Worker #if 0
59*e01b6f76SAndroid Build Coastguard Worker static void dump_layer(hwc_layer_1_t const* l) {
60*e01b6f76SAndroid Build Coastguard Worker ALOGD("\ttype=%d, flags=%08x, handle=%p, tr=%02x, blend=%04x, {%d,%d,%d,%d}, {%d,%d,%d,%d}",
61*e01b6f76SAndroid Build Coastguard Worker l->compositionType, l->flags, l->handle, l->transform, l->blending,
62*e01b6f76SAndroid Build Coastguard Worker l->sourceCrop.left,
63*e01b6f76SAndroid Build Coastguard Worker l->sourceCrop.top,
64*e01b6f76SAndroid Build Coastguard Worker l->sourceCrop.right,
65*e01b6f76SAndroid Build Coastguard Worker l->sourceCrop.bottom,
66*e01b6f76SAndroid Build Coastguard Worker l->displayFrame.left,
67*e01b6f76SAndroid Build Coastguard Worker l->displayFrame.top,
68*e01b6f76SAndroid Build Coastguard Worker l->displayFrame.right,
69*e01b6f76SAndroid Build Coastguard Worker l->displayFrame.bottom);
70*e01b6f76SAndroid Build Coastguard Worker }
71*e01b6f76SAndroid Build Coastguard Worker #endif
72*e01b6f76SAndroid Build Coastguard Worker
hwc_prepare(hwc_composer_device_1_t *,size_t,hwc_display_contents_1_t ** displays)73*e01b6f76SAndroid Build Coastguard Worker static int hwc_prepare(hwc_composer_device_1_t * /*dev*/,
74*e01b6f76SAndroid Build Coastguard Worker size_t /*numDisplays*/, hwc_display_contents_1_t** displays) {
75*e01b6f76SAndroid Build Coastguard Worker if (displays && (displays[0]->flags & HWC_GEOMETRY_CHANGED)) {
76*e01b6f76SAndroid Build Coastguard Worker for (size_t i=0 ; i<displays[0]->numHwLayers ; i++) {
77*e01b6f76SAndroid Build Coastguard Worker //dump_layer(&list->hwLayers[i]);
78*e01b6f76SAndroid Build Coastguard Worker displays[0]->hwLayers[i].compositionType = HWC_FRAMEBUFFER;
79*e01b6f76SAndroid Build Coastguard Worker }
80*e01b6f76SAndroid Build Coastguard Worker }
81*e01b6f76SAndroid Build Coastguard Worker return 0;
82*e01b6f76SAndroid Build Coastguard Worker }
83*e01b6f76SAndroid Build Coastguard Worker
hwc_set(hwc_composer_device_1_t *,size_t,hwc_display_contents_1_t ** displays)84*e01b6f76SAndroid Build Coastguard Worker static int hwc_set(hwc_composer_device_1_t * /*dev*/,
85*e01b6f76SAndroid Build Coastguard Worker size_t /*numDisplays*/, hwc_display_contents_1_t** displays)
86*e01b6f76SAndroid Build Coastguard Worker {
87*e01b6f76SAndroid Build Coastguard Worker //for (size_t i=0 ; i<list->numHwLayers ; i++) {
88*e01b6f76SAndroid Build Coastguard Worker // dump_layer(&list->hwLayers[i]);
89*e01b6f76SAndroid Build Coastguard Worker //}
90*e01b6f76SAndroid Build Coastguard Worker
91*e01b6f76SAndroid Build Coastguard Worker EGLBoolean success = eglSwapBuffers((EGLDisplay)displays[0]->dpy,
92*e01b6f76SAndroid Build Coastguard Worker (EGLSurface)displays[0]->sur);
93*e01b6f76SAndroid Build Coastguard Worker if (!success) {
94*e01b6f76SAndroid Build Coastguard Worker return HWC_EGL_ERROR;
95*e01b6f76SAndroid Build Coastguard Worker }
96*e01b6f76SAndroid Build Coastguard Worker return 0;
97*e01b6f76SAndroid Build Coastguard Worker }
98*e01b6f76SAndroid Build Coastguard Worker
hwc_device_close(struct hw_device_t * dev)99*e01b6f76SAndroid Build Coastguard Worker static int hwc_device_close(struct hw_device_t *dev)
100*e01b6f76SAndroid Build Coastguard Worker {
101*e01b6f76SAndroid Build Coastguard Worker struct hwc_context_t* ctx = (struct hwc_context_t*)dev;
102*e01b6f76SAndroid Build Coastguard Worker if (ctx) {
103*e01b6f76SAndroid Build Coastguard Worker free(ctx);
104*e01b6f76SAndroid Build Coastguard Worker }
105*e01b6f76SAndroid Build Coastguard Worker return 0;
106*e01b6f76SAndroid Build Coastguard Worker }
107*e01b6f76SAndroid Build Coastguard Worker
108*e01b6f76SAndroid Build Coastguard Worker /*****************************************************************************/
109*e01b6f76SAndroid Build Coastguard Worker
hwc_device_open(const struct hw_module_t * module,const char * name,struct hw_device_t ** device)110*e01b6f76SAndroid Build Coastguard Worker static int hwc_device_open(const struct hw_module_t* module, const char* name,
111*e01b6f76SAndroid Build Coastguard Worker struct hw_device_t** device)
112*e01b6f76SAndroid Build Coastguard Worker {
113*e01b6f76SAndroid Build Coastguard Worker int status = -EINVAL;
114*e01b6f76SAndroid Build Coastguard Worker if (!strcmp(name, HWC_HARDWARE_COMPOSER)) {
115*e01b6f76SAndroid Build Coastguard Worker struct hwc_context_t *dev;
116*e01b6f76SAndroid Build Coastguard Worker dev = (hwc_context_t*)malloc(sizeof(*dev));
117*e01b6f76SAndroid Build Coastguard Worker
118*e01b6f76SAndroid Build Coastguard Worker /* initialize our state here */
119*e01b6f76SAndroid Build Coastguard Worker memset(dev, 0, sizeof(*dev));
120*e01b6f76SAndroid Build Coastguard Worker
121*e01b6f76SAndroid Build Coastguard Worker /* initialize the procs */
122*e01b6f76SAndroid Build Coastguard Worker dev->device.common.tag = HARDWARE_DEVICE_TAG;
123*e01b6f76SAndroid Build Coastguard Worker dev->device.common.version = HWC_DEVICE_API_VERSION_1_0;
124*e01b6f76SAndroid Build Coastguard Worker dev->device.common.module = const_cast<hw_module_t*>(module);
125*e01b6f76SAndroid Build Coastguard Worker dev->device.common.close = hwc_device_close;
126*e01b6f76SAndroid Build Coastguard Worker
127*e01b6f76SAndroid Build Coastguard Worker dev->device.prepare = hwc_prepare;
128*e01b6f76SAndroid Build Coastguard Worker dev->device.set = hwc_set;
129*e01b6f76SAndroid Build Coastguard Worker
130*e01b6f76SAndroid Build Coastguard Worker *device = &dev->device.common;
131*e01b6f76SAndroid Build Coastguard Worker status = 0;
132*e01b6f76SAndroid Build Coastguard Worker }
133*e01b6f76SAndroid Build Coastguard Worker return status;
134*e01b6f76SAndroid Build Coastguard Worker }
135