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