16a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu/*
2cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Copyright (c) 2014 Intel Corporation 
3cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//
4cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Licensed under the Apache License, Version 2.0 (the "License");
5cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// you may not use this file except in compliance with the License.
6cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// You may obtain a copy of the License at
7cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//
8cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//      http://www.apache.org/licenses/LICENSE-2.0
9cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//
10cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Unless required by applicable law or agreed to in writing, software
11cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// distributed under the License is distributed on an "AS IS" BASIS,
12cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// See the License for the specific language governing permissions and
14cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// limitations under the License.
15cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika*/
1658bd91c37ce1c529392d43ef624527340c91fe02Iliyan Malchev
1758bd91c37ce1c529392d43ef624527340c91fe02Iliyan Malchev#define ATRACE_TAG (ATRACE_TAG_GRAPHICS | ATRACE_TAG_HAL)
1858bd91c37ce1c529392d43ef624527340c91fe02Iliyan Malchev
196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <hardware/hardware.h>
206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <string.h>
216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <stdio.h>
226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <fcntl.h>
236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <errno.h>
240594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/utils/HwcTrace.h>
256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <Hwcomposer.h>
2658bd91c37ce1c529392d43ef624527340c91fe02Iliyan Malchev#include <utils/Trace.h>
276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
28e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#define GET_HWC_RETURN_X_IF_NULL(X) \
29e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    CTRACE(); \
304b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    Hwcomposer *hwc = static_cast<Hwcomposer*>(dev); \
31e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    do {\
32e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        if (!hwc) { \
334157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev            ELOGTRACE("invalid HWC device."); \
34e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu            return X; \
35e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        } \
36e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    } while (0)
374b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu
38e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu
39e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#define GET_HWC_RETURN_ERROR_IF_NULL()        GET_HWC_RETURN_X_IF_NULL(-EINVAL)
40e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#define GET_HWC_RETURN_VOID_IF_NULL()         GET_HWC_RETURN_X_IF_NULL()
414b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu
424b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu
436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace android {
446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace intel {
456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiustatic int hwc_prepare(struct hwc_composer_device_1 *dev,
476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                          size_t numDisplays,
486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                          hwc_display_contents_1_t** displays)
496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
5058bd91c37ce1c529392d43ef624527340c91fe02Iliyan Malchev    ATRACE_CALL();
514b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    GET_HWC_RETURN_ERROR_IF_NULL();
52e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    if (!hwc->prepare(numDisplays, displays)) {
534157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("failed to prepare");
544b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu        return -EINVAL;
556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
564b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    return 0;
576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiustatic int hwc_set(struct hwc_composer_device_1 *dev,
606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                     size_t numDisplays,
616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                     hwc_display_contents_1_t **displays)
626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
6358bd91c37ce1c529392d43ef624527340c91fe02Iliyan Malchev    ATRACE_CALL();
644b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    GET_HWC_RETURN_ERROR_IF_NULL();
65e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    if (!hwc->commit(numDisplays, displays)) {
664157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("failed to commit");
674b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu        return -EINVAL;
686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
694b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    return 0;
706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiustatic void hwc_dump(struct hwc_composer_device_1 *dev,
736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                       char *buff,
746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                       int buff_len)
756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
764b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    GET_HWC_RETURN_VOID_IF_NULL();
774b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    hwc->dump(buff, buff_len, 0);
786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid hwc_registerProcs(struct hwc_composer_device_1 *dev,
816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                          hwc_procs_t const *procs)
826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
834b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    GET_HWC_RETURN_VOID_IF_NULL();
846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    hwc->registerProcs(procs);
856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
870594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudelstatic int hwc_device_close(struct hw_device_t * /* dev */)
886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
89e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    CTRACE();
904b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    Hwcomposer::releaseInstance();
916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return 0;
926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
940594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudelstatic int hwc_query(struct hwc_composer_device_1 * /* dev */,
950594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel        int what, int* /* value */)
966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
970594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel    (void) what;
984157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev    ALOGTRACE("what = %d", what);
996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return -EINVAL;
1006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiustatic int hwc_eventControl(struct hwc_composer_device_1 *dev,
1036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                int disp,
1046a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                int event,
1056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                int enabled)
1066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
1076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    bool ret;
10858bd91c37ce1c529392d43ef624527340c91fe02Iliyan Malchev    ATRACE_CALL();
1094b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    GET_HWC_RETURN_ERROR_IF_NULL();
1106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    switch (event) {
1126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    case HWC_EVENT_VSYNC:
1136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        ret = hwc->vsyncControl(disp, enabled);
1146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        if (ret == false) {
1154157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev            ELOGTRACE("failed to control vsync");
1164b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu            return -EINVAL;
1176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        }
1186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        break;
1196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    default:
1204157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        WLOGTRACE("unsupported event %d", event);
1214b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu        break;
1226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
1236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1244b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    return 0;
1256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiustatic int hwc_getDisplayConfigs(hwc_composer_device_1_t *dev,
1286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                     int disp,
1296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                     uint32_t *configs,
1306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                     size_t *numConfigs)
1316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
13258bd91c37ce1c529392d43ef624527340c91fe02Iliyan Malchev    ATRACE_CALL();
1334b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    GET_HWC_RETURN_ERROR_IF_NULL();
1344b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    bool ret = hwc->getDisplayConfigs(disp, configs, numConfigs);
1356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (ret == false) {
1364157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        WLOGTRACE("failed to get configs of disp %d", disp);
1376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return -EINVAL;
1386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
1396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return 0;
1416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiustatic int hwc_getDisplayAttributes(hwc_composer_device_1_t *dev,
1446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                        int disp,
1456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                        uint32_t config,
1466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                        const uint32_t *attributes,
1476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                        int32_t *values)
1486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
14958bd91c37ce1c529392d43ef624527340c91fe02Iliyan Malchev    ATRACE_CALL();
1504b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    GET_HWC_RETURN_ERROR_IF_NULL();
1514b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    bool ret = hwc->getDisplayAttributes(disp, config, attributes, values);
1526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (ret == false) {
1534157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        WLOGTRACE("failed to get attributes of disp %d", disp);
1546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return -EINVAL;
1556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
1566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return 0;
1586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiustatic int hwc_compositionComplete(hwc_composer_device_1_t *dev, int disp)
1616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
16258bd91c37ce1c529392d43ef624527340c91fe02Iliyan Malchev    ATRACE_CALL();
1634b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    GET_HWC_RETURN_ERROR_IF_NULL();
1644b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    bool ret = hwc->compositionComplete(disp);
1656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (ret == false) {
1664157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("failed for disp %d", disp);
1676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return -EINVAL;
1686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
1696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return 0;
1716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
173452fbc109a9c585737bcac18f19aff40574c3d79Jim Bishstatic int hwc_setPowerMode(hwc_composer_device_1_t *dev, int disp, int mode)
174452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish{
17558bd91c37ce1c529392d43ef624527340c91fe02Iliyan Malchev    ATRACE_CALL();
176452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    GET_HWC_RETURN_ERROR_IF_NULL();
177452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    bool ret = hwc->setPowerMode(disp, mode);
178452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    if (ret == false) {
1794157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        WLOGTRACE("failed to set power mode of disp %d", disp);
180452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish        return -EINVAL;
181452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    }
182452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
183452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    return 0;
184452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish}
185452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
186452fbc109a9c585737bcac18f19aff40574c3d79Jim Bishstatic int hwc_getActiveConfig(hwc_composer_device_1_t *dev, int disp)
187452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish{
18858bd91c37ce1c529392d43ef624527340c91fe02Iliyan Malchev    ATRACE_CALL();
189452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    GET_HWC_RETURN_ERROR_IF_NULL();
190452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    int ret = hwc->getActiveConfig(disp);
191452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    if (ret == -1) {
1924157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        WLOGTRACE("failed to get active config of disp %d", disp);
193452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish        return -EINVAL;
194452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    }
195452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
196452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    return ret;
197452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish}
198452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
199452fbc109a9c585737bcac18f19aff40574c3d79Jim Bishstatic int hwc_setActiveConfig(hwc_composer_device_1_t *dev, int disp, int index)
200452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish{
20158bd91c37ce1c529392d43ef624527340c91fe02Iliyan Malchev    ATRACE_CALL();
202452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    GET_HWC_RETURN_ERROR_IF_NULL();
203452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    bool ret = hwc->setActiveConfig(disp, index);
204452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    if (ret == false) {
2054157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        WLOGTRACE("failed to set active config of disp %d", disp);
206452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish        return -EINVAL;
207452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    }
208452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
209452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    return 0;
210452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish}
211452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
21212102980abf11dc65a42a0303885c8c4e1cb7ddaAndreas Gampe// Todo: add hwc_setCursorPositionAsync after supporting patches
21312102980abf11dc65a42a0303885c8c4e1cb7ddaAndreas Gampe/*
214452fbc109a9c585737bcac18f19aff40574c3d79Jim Bishstatic int hwc_setCursorPositionAsync(hwc_composer_device_1_t *dev, int disp, int x, int y)
215452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish{
21658bd91c37ce1c529392d43ef624527340c91fe02Iliyan Malchev    ATRACE_CALL();
217452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    GET_HWC_RETURN_ERROR_IF_NULL();
218452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    bool ret = hwc->setCursorPositionAsync(disp, x, y);
219452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    if (ret == false) {
2204157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        WLOGTRACE("failed to set cursor position of disp %d", disp);
221452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish        return -EINVAL;
222452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    }
223452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
224452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    return 0;
225452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish}
22612102980abf11dc65a42a0303885c8c4e1cb7ddaAndreas Gampe*/
227452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
2286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu//------------------------------------------------------------------------------
2296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiustatic int hwc_device_open(const struct hw_module_t* module,
2316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                              const char* name,
2326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                              struct hw_device_t** device)
2336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
2344b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    if (!name) {
2354157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("invalid name.");
2364b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu        return -EINVAL;
2374b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    }
2386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2394157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev    ALOGTRACE("open device %s", name);
2406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2414b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    if (strcmp(name, HWC_HARDWARE_COMPOSER) != 0) {
2424157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("try to open unknown HWComposer %s", name);
2434b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu        return -EINVAL;
2444b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    }
2454b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu
2464b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    Hwcomposer& hwc = Hwcomposer::getInstance();
24765efc253a628175c7afa95c431b746ea20052794Andy Qiu    // initialize our state here
2484b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    if (hwc.initialize() == false) {
2494157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("failed to intialize HWComposer");
2504b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu        Hwcomposer::releaseInstance();
2514b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu        return -EINVAL;
2524b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    }
2536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
25465efc253a628175c7afa95c431b746ea20052794Andy Qiu    // initialize the procs
2554b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    hwc.hwc_composer_device_1_t::common.tag = HARDWARE_DEVICE_TAG;
2564b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    hwc.hwc_composer_device_1_t::common.module =
2574b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu        const_cast<hw_module_t*>(module);
2584b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    hwc.hwc_composer_device_1_t::common.close = hwc_device_close;
2596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2604b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    hwc.hwc_composer_device_1_t::prepare = hwc_prepare;
2614b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    hwc.hwc_composer_device_1_t::set = hwc_set;
2624b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    hwc.hwc_composer_device_1_t::dump = hwc_dump;
2634b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    hwc.hwc_composer_device_1_t::registerProcs = hwc_registerProcs;
2644b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    hwc.hwc_composer_device_1_t::query = hwc_query;
2656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2664b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    hwc.hwc_composer_device_1_t::eventControl = hwc_eventControl;
2674b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    hwc.hwc_composer_device_1_t::getDisplayConfigs = hwc_getDisplayConfigs;
2684b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    hwc.hwc_composer_device_1_t::getDisplayAttributes = hwc_getDisplayAttributes;
2696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2704b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    // This is used to hack FBO switch flush issue in SurfaceFlinger.
2714b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    hwc.hwc_composer_device_1_t::reserved_proc[0] = (void*)hwc_compositionComplete;
272452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    hwc.hwc_composer_device_1_t::common.version = HWC_DEVICE_API_VERSION_1_4;
273452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    hwc.hwc_composer_device_1_t::setPowerMode = hwc_setPowerMode;
274452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    hwc.hwc_composer_device_1_t::getActiveConfig = hwc_getActiveConfig;
275452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    hwc.hwc_composer_device_1_t::setActiveConfig = hwc_setActiveConfig;
276452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    // Todo: add hwc_setCursorPositionAsync after supporting patches
277452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    hwc.hwc_composer_device_1_t::setCursorPositionAsync = NULL;
2786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2794b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    *device = &hwc.hwc_composer_device_1_t::common;
2806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2814b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    return 0;
2826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
2836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace intel
2856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace android
2866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiustatic struct hw_module_methods_t hwc_module_methods = {
2886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    open: android::intel::hwc_device_open
2896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu};
2906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuhwc_module_t HAL_MODULE_INFO_SYM = {
2926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    common: {
2936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        tag: HARDWARE_MODULE_TAG,
2946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        version_major: 1,
295452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish        version_minor: 4,
2966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        id: HWC_HARDWARE_MODULE_ID,
2976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        name: "Intel Hardware Composer",
298e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        author: "Intel",
2996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        methods: &hwc_module_methods,
3000594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel        dso: 0,
3010594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel        reserved: { 0 },
3026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
3036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu};
304