hwcomposer.cpp revision cee8501c1623765d5287fcd440fbf8001b9de183
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 195d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian#include <fcntl.h> 205d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian#include <errno.h> 215d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 225d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian#include <cutils/log.h> 235d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian#include <cutils/atomic.h> 245d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 255d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian#include <hardware/hwcomposer.h> 265d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 275d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian#include <EGL/egl.h> 285d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 295d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian/*****************************************************************************/ 305d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 315d3de309f44f6a72f2a46db792f3865088897039Mathias Agopianstruct hwc_context_t { 325d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian hwc_composer_device_t device; 335d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian /* our private state goes below here */ 345d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian}; 355d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 365d3de309f44f6a72f2a46db792f3865088897039Mathias Agopianstatic int hwc_device_open(const struct hw_module_t* module, const char* name, 375d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian struct hw_device_t** device); 385d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 395d3de309f44f6a72f2a46db792f3865088897039Mathias Agopianstatic struct hw_module_methods_t hwc_module_methods = { 405d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian open: hwc_device_open 415d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian}; 425d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 435d3de309f44f6a72f2a46db792f3865088897039Mathias Agopianhwc_module_t HAL_MODULE_INFO_SYM = { 445d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian common: { 455d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian tag: HARDWARE_MODULE_TAG, 465d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian version_major: 1, 475d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian version_minor: 0, 485d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian id: HWC_HARDWARE_MODULE_ID, 495d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian name: "Sample hwcomposer module", 505d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian author: "The Android Open Source Project", 515d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian methods: &hwc_module_methods, 525d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian } 535d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian}; 545d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 555d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian/*****************************************************************************/ 565d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 57e6b5c05aa0236dc42107d028a366a3fd2678677bMathias Agopianstatic void dump_layer(hwc_layer_t const* l) { 58cee8501c1623765d5287fcd440fbf8001b9de183Steve Block ALOGD("\ttype=%d, flags=%08x, handle=%p, tr=%02x, blend=%04x, {%d,%d,%d,%d}, {%d,%d,%d,%d}", 59e6b5c05aa0236dc42107d028a366a3fd2678677bMathias Agopian l->compositionType, l->flags, l->handle, l->transform, l->blending, 60e6b5c05aa0236dc42107d028a366a3fd2678677bMathias Agopian l->sourceCrop.left, 61e6b5c05aa0236dc42107d028a366a3fd2678677bMathias Agopian l->sourceCrop.top, 62e6b5c05aa0236dc42107d028a366a3fd2678677bMathias Agopian l->sourceCrop.right, 63e6b5c05aa0236dc42107d028a366a3fd2678677bMathias Agopian l->sourceCrop.bottom, 64e6b5c05aa0236dc42107d028a366a3fd2678677bMathias Agopian l->displayFrame.left, 65e6b5c05aa0236dc42107d028a366a3fd2678677bMathias Agopian l->displayFrame.top, 66e6b5c05aa0236dc42107d028a366a3fd2678677bMathias Agopian l->displayFrame.right, 67e6b5c05aa0236dc42107d028a366a3fd2678677bMathias Agopian l->displayFrame.bottom); 68e6b5c05aa0236dc42107d028a366a3fd2678677bMathias Agopian} 69e6b5c05aa0236dc42107d028a366a3fd2678677bMathias Agopian 705d3de309f44f6a72f2a46db792f3865088897039Mathias Agopianstatic int hwc_prepare(hwc_composer_device_t *dev, hwc_layer_list_t* list) { 715d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian if (list && (list->flags & HWC_GEOMETRY_CHANGED)) { 725d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian for (size_t i=0 ; i<list->numHwLayers ; i++) { 73e6b5c05aa0236dc42107d028a366a3fd2678677bMathias Agopian //dump_layer(&list->hwLayers[i]); 745d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian list->hwLayers[i].compositionType = HWC_FRAMEBUFFER; 755d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian } 765d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian } 775d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian return 0; 785d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian} 795d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 805d3de309f44f6a72f2a46db792f3865088897039Mathias Agopianstatic int hwc_set(hwc_composer_device_t *dev, 815d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian hwc_display_t dpy, 825d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian hwc_surface_t sur, 835d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian hwc_layer_list_t* list) 845d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian{ 85e6b5c05aa0236dc42107d028a366a3fd2678677bMathias Agopian //for (size_t i=0 ; i<list->numHwLayers ; i++) { 86e6b5c05aa0236dc42107d028a366a3fd2678677bMathias Agopian // dump_layer(&list->hwLayers[i]); 87e6b5c05aa0236dc42107d028a366a3fd2678677bMathias Agopian //} 88e6b5c05aa0236dc42107d028a366a3fd2678677bMathias Agopian 895d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian EGLBoolean sucess = eglSwapBuffers((EGLDisplay)dpy, (EGLSurface)sur); 905d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian if (!sucess) { 915d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian return HWC_EGL_ERROR; 925d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian } 935d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian return 0; 945d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian} 955d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 965d3de309f44f6a72f2a46db792f3865088897039Mathias Agopianstatic int hwc_device_close(struct hw_device_t *dev) 975d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian{ 985d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian struct hwc_context_t* ctx = (struct hwc_context_t*)dev; 995d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian if (ctx) { 1005d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian free(ctx); 1015d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian } 1025d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian return 0; 1035d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian} 1045d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 1055d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian/*****************************************************************************/ 1065d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 1075d3de309f44f6a72f2a46db792f3865088897039Mathias Agopianstatic int hwc_device_open(const struct hw_module_t* module, const char* name, 1085d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian struct hw_device_t** device) 1095d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian{ 1105d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian int status = -EINVAL; 1115d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian if (!strcmp(name, HWC_HARDWARE_COMPOSER)) { 1125d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian struct hwc_context_t *dev; 1135d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian dev = (hwc_context_t*)malloc(sizeof(*dev)); 1145d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 1155d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian /* initialize our state here */ 1165d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian memset(dev, 0, sizeof(*dev)); 1175d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 1185d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian /* initialize the procs */ 1195d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian dev->device.common.tag = HARDWARE_DEVICE_TAG; 1205d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian dev->device.common.version = 0; 1215d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian dev->device.common.module = const_cast<hw_module_t*>(module); 1225d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian dev->device.common.close = hwc_device_close; 1235d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 1245d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian dev->device.prepare = hwc_prepare; 1255d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian dev->device.set = hwc_set; 1265d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian 1275d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian *device = &dev->device.common; 1285d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian status = 0; 1295d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian } 1305d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian return status; 1315d3de309f44f6a72f2a46db792f3865088897039Mathias Agopian} 132