hwc.cpp revision f48aef64b218d42bd2ede62dcb03a3d7831ebbf9
129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/* 229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Copyright (C) 2010 The Android Open Source Project 329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Copyright (C) 2012, Code Aurora Forum. All rights reserved. 429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * 529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License"); 629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * you may not use this file except in compliance with the License. 729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * You may obtain a copy of the License at 829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * 929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * http://www.apache.org/licenses/LICENSE-2.0 1029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * 1129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Unless required by applicable law or agreed to in writing, software 1229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS, 1329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * See the License for the specific language governing permissions and 1529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * limitations under the License. 1629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed */ 1729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 1829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include <fcntl.h> 1929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include <errno.h> 2029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 2129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include <cutils/log.h> 2229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include <cutils/atomic.h> 2329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include <EGL/egl.h> 2429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 2529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "hwc_utils.h" 26f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed#include "hwc_video.h" 2729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 2829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedusing namespace qhwc; 2929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 3029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, 3129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed const char* name, 3229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed struct hw_device_t** device); 3329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 3429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic struct hw_module_methods_t hwc_module_methods = { 3529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed open: hwc_device_open 3629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}; 3729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 3829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedhwc_module_t HAL_MODULE_INFO_SYM = { 3929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed common: { 4029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed tag: HARDWARE_MODULE_TAG, 4129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed version_major: 2, 4229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed version_minor: 0, 4329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed id: HWC_HARDWARE_MODULE_ID, 4429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed name: "Qualcomm Hardware Composer Module", 4529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed author: "CodeAurora Forum", 4629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed methods: &hwc_module_methods, 4729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed dso: 0, 4829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed reserved: {0}, 4929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 5029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}; 5129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 5229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/* 5329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Save callback functions registered to HWC 5429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed */ 5529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic void hwc_registerProcs(struct hwc_composer_device* dev, 5629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed hwc_procs_t const* procs) 5729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 5829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 5929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if(!ctx) { 6029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGE("%s: Invalid context", __FUNCTION__); 6129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return; 6229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 6329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ctx->device.reserved_proc[0] = (void*)procs; 6429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 6529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 6629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic int hwc_prepare(hwc_composer_device_t *dev, hwc_layer_list_t* list) 6729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 6829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 69f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed ctx->overlayInUse = false; 70f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 71f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed //Prepare is called after a vsync, so unlock previous buffers here. 72f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed ctx->qbuf->unlockAllPrevious(); 73f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 7429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if (LIKELY(list)) { 7529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed getLayerStats(ctx, list); 76f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed if(VideoOverlay::prepare(ctx, list)) { 77f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed ctx->overlayInUse = true; 78f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed //Nothing here 79f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed } else if (0) { 80f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed //Other features 81f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed ctx->overlayInUse = true; 8229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 8329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 8429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return 0; 8529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 8629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 8729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic int hwc_set(hwc_composer_device_t *dev, 8829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed hwc_display_t dpy, 8929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed hwc_surface_t sur, 9029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed hwc_layer_list_t* list) 9129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 9229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed int ret = 0; 9329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 9429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if (LIKELY(list)) { 95f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed VideoOverlay::draw(ctx, list); 9629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed EGLBoolean sucess = eglSwapBuffers((EGLDisplay)dpy, (EGLSurface)sur); 9729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } else { 98f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed ctx->mOverlay->setState(ovutils::OV_CLOSED); 99f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed ctx->qbuf->unlockAllPrevious(); 10029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 101f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 102f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed if(!ctx->overlayInUse) 103f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed ctx->mOverlay->setState(ovutils::OV_CLOSED); 104f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 10529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return ret; 10629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 10729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 10829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev) 10929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 11029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if(!dev) { 11129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGE("hwc_device_close null device pointer"); 11229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return -1; 11329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 11429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed closeContext((hwc_context_t*)dev); 11529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed free(dev); 11629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 11729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return 0; 11829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 11929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 12029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name, 12129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed struct hw_device_t** device) 12229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 12329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed int status = -EINVAL; 12429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 12529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if (!strcmp(name, HWC_HARDWARE_COMPOSER)) { 12629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed struct hwc_context_t *dev; 12729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed dev = (hwc_context_t*)malloc(sizeof(*dev)); 12829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed memset(dev, 0, sizeof(*dev)); 12929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed initContext(dev); 13029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed dev->device.common.tag = HARDWARE_DEVICE_TAG; 13129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed dev->device.common.version = 0; 13229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed dev->device.common.module = const_cast<hw_module_t*>(module); 13329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed dev->device.common.close = hwc_device_close; 13429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed dev->device.prepare = hwc_prepare; 13529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed dev->device.set = hwc_set; 13629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed dev->device.registerProcs = hwc_registerProcs; 13729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *device = &dev->device.common; 13829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed status = 0; 13929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 14029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return status; 14129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 142