hwcomposer.cpp revision 5d3de309f44f6a72f2a46db792f3865088897039
15d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian/* 25d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian * Copyright (C) 2010 The Android Open Source Project 35d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian * 45d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 55d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian * you may not use this file except in compliance with the License. 65d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian * You may obtain a copy of the License at 75d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian * 85d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 95d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian * 105d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian * Unless required by applicable law or agreed to in writing, software 115d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 125d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian * See the License for the specific language governing permissions and 145d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian * limitations under the License. 155d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian */ 165d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 175d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian#include <hardware/hardware.h> 185d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian#include <hardware/overlay.h> 195d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 205d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian#include <fcntl.h> 215d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian#include <errno.h> 225d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 235d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian#include <cutils/log.h> 245d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian#include <cutils/atomic.h> 255d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 265d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian#include <hardware/hwcomposer.h> 275d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 285d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian#include <EGL/egl.h> 295d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 305d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian/*****************************************************************************/ 315d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 325d3de309f44f6a72f2a46db792f3865088897039Mathias Agopianstruct hwc_context_t { 335d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian hwc_composer_device_t device; 345d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian /* our private state goes below here */ 355d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian}; 365d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 375d3de309f44f6a72f2a46db792f3865088897039Mathias Agopianstatic int hwc_device_open(const struct hw_module_t* module, const char* name, 385d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian struct hw_device_t** device); 395d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 405d3de309f44f6a72f2a46db792f3865088897039Mathias Agopianstatic struct hw_module_methods_t hwc_module_methods = { 415d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian open: hwc_device_open 425d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian}; 435d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 445d3de309f44f6a72f2a46db792f3865088897039Mathias Agopianhwc_module_t HAL_MODULE_INFO_SYM = { 455d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian common: { 465d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian tag: HARDWARE_MODULE_TAG, 475d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian version_major: 1, 485d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian version_minor: 0, 495d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian id: HWC_HARDWARE_MODULE_ID, 505d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian name: "Sample hwcomposer module", 515d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian author: "The Android Open Source Project", 525d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian methods: &hwc_module_methods, 535d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian } 545d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian}; 555d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 565d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian/*****************************************************************************/ 575d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 585d3de309f44f6a72f2a46db792f3865088897039Mathias Agopianstatic int hwc_prepare(hwc_composer_device_t *dev, hwc_layer_list_t* list) { 595d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian if (list && (list->flags & HWC_GEOMETRY_CHANGED)) { 605d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian for (size_t i=0 ; i<list->numHwLayers ; i++) { 615d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian list->hwLayers[i].compositionType = HWC_FRAMEBUFFER; 625d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian } 635d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian } 645d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian return 0; 655d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian} 665d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 675d3de309f44f6a72f2a46db792f3865088897039Mathias Agopianstatic int hwc_set(hwc_composer_device_t *dev, 685d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian hwc_display_t dpy, 695d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian hwc_surface_t sur, 705d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian hwc_layer_list_t* list) 715d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian{ 725d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian EGLBoolean sucess = eglSwapBuffers((EGLDisplay)dpy, (EGLSurface)sur); 735d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian if (!sucess) { 745d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian return HWC_EGL_ERROR; 755d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian } 765d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian return 0; 775d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian} 785d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 795d3de309f44f6a72f2a46db792f3865088897039Mathias Agopianstatic int hwc_device_close(struct hw_device_t *dev) 805d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian{ 815d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian struct hwc_context_t* ctx = (struct hwc_context_t*)dev; 825d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian if (ctx) { 835d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian free(ctx); 845d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian } 855d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian return 0; 865d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian} 875d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 885d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian/*****************************************************************************/ 895d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 905d3de309f44f6a72f2a46db792f3865088897039Mathias Agopianstatic int hwc_device_open(const struct hw_module_t* module, const char* name, 915d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian struct hw_device_t** device) 925d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian{ 935d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian int status = -EINVAL; 945d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian if (!strcmp(name, HWC_HARDWARE_COMPOSER)) { 955d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian struct hwc_context_t *dev; 965d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian dev = (hwc_context_t*)malloc(sizeof(*dev)); 975d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 985d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian /* initialize our state here */ 995d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian memset(dev, 0, sizeof(*dev)); 1005d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 1015d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian /* initialize the procs */ 1025d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian dev->device.common.tag = HARDWARE_DEVICE_TAG; 1035d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian dev->device.common.version = 0; 1045d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian dev->device.common.module = const_cast<hw_module_t*>(module); 1055d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian dev->device.common.close = hwc_device_close; 1065d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 1075d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian dev->device.prepare = hwc_prepare; 1085d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian dev->device.set = hwc_set; 1095d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 1105d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian *device = &dev->device.common; 1115d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian status = 0; 1125d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian } 1135d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian return status; 1145d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian} 115