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