14a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh/* 24a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* Copyright (c) 2014 - 2016, The Linux Foundation. All rights reserved. 34a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* 44a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* Redistribution and use in source and binary forms, with or without modification, are permitted 54a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* provided that the following conditions are met: 64a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* * Redistributions of source code must retain the above copyright notice, this list of 74a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* conditions and the following disclaimer. 84a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* * Redistributions in binary form must reproduce the above copyright notice, this list of 94a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* conditions and the following disclaimer in the documentation and/or other materials provided 104a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* with the distribution. 114a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* * Neither the name of The Linux Foundation nor the names of its contributors may be used to 124a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* endorse or promote products derived from this software without specific prior written 134a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* permission. 144a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* 154a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 164a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 174a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 184a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 194a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 204a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 214a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 224a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 234a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*/ 244a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 254a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include <dlfcn.h> 264a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include <utils/locker.h> 274a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include <utils/constants.h> 284a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include <utils/debug.h> 294a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 304a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include "core_impl.h" 314a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include "display_primary.h" 324a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include "display_hdmi.h" 334a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include "display_virtual.h" 344a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include "hw_info_interface.h" 354a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include "color_manager.h" 364a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 374a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#define __CLASS__ "CoreImpl" 384a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 394a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhnamespace sdm { 404a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 414a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain VongsouvanhCoreImpl::CoreImpl(BufferAllocator *buffer_allocator, 424a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh BufferSyncHandler *buffer_sync_handler, 434a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh SocketHandler *socket_handler) 444a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh : buffer_allocator_(buffer_allocator), buffer_sync_handler_(buffer_sync_handler), 454a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh socket_handler_(socket_handler) { 464a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh} 474a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 484a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain VongsouvanhDisplayError CoreImpl::Init() { 494a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh SCOPE_LOCK(locker_); 504a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayError error = kErrorNone; 514a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 524a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh // Try to load extension library & get handle to its interface. 534a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh if (extension_lib_.Open(EXTENSION_LIBRARY_NAME)) { 544a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh if (!extension_lib_.Sym(CREATE_EXTENSION_INTERFACE_NAME, 554a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh reinterpret_cast<void **>(&create_extension_intf_)) || 564a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh !extension_lib_.Sym(DESTROY_EXTENSION_INTERFACE_NAME, 574a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh reinterpret_cast<void **>(&destroy_extension_intf_))) { 584a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DLOGE("Unable to load symbols, error = %s", extension_lib_.Error()); 594a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh return kErrorUndefined; 604a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } 614a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 624a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh error = create_extension_intf_(EXTENSION_VERSION_TAG, &extension_intf_); 634a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh if (error != kErrorNone) { 644a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DLOGE("Unable to create interface"); 654a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh return error; 664a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } 674a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } else { 684a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DLOGW("Unable to load = %s, error = %s", EXTENSION_LIBRARY_NAME, extension_lib_.Error()); 694a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } 704a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 714a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh error = HWInfoInterface::Create(&hw_info_intf_); 724a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh if (error != kErrorNone) { 734a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh goto CleanupOnError; 744a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } 754a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 764a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh error = hw_info_intf_->GetHWResourceInfo(&hw_resource_); 774a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh if (error != kErrorNone) { 784a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh goto CleanupOnError; 794a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } 804a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 814a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh error = comp_mgr_.Init(hw_resource_, extension_intf_, buffer_allocator_, 824a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh buffer_sync_handler_, socket_handler_); 834a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 844a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh if (error != kErrorNone) { 854a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh goto CleanupOnError; 864a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } 874a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 884a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh error = ColorManagerProxy::Init(hw_resource_); 894a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh // if failed, doesn't affect display core functionalities. 904a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh if (error != kErrorNone) { 914a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DLOGW("Unable creating color manager and continue without it."); 924a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } 934a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 944a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh return kErrorNone; 954a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 964a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain VongsouvanhCleanupOnError: 974a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh if (hw_info_intf_) { 984a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh HWInfoInterface::Destroy(hw_info_intf_); 994a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } 1004a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1014a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh return error; 1024a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh} 1034a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1044a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain VongsouvanhDisplayError CoreImpl::Deinit() { 1054a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh SCOPE_LOCK(locker_); 1064a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1074a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh ColorManagerProxy::Deinit(); 1084a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1094a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh comp_mgr_.Deinit(); 1104a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh HWInfoInterface::Destroy(hw_info_intf_); 1114a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1124a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh return kErrorNone; 1134a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh} 1144a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1154a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain VongsouvanhDisplayError CoreImpl::CreateDisplay(DisplayType type, DisplayEventHandler *event_handler, 1164a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayInterface **intf) { 1174a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh SCOPE_LOCK(locker_); 1184a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1194a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh if (!event_handler || !intf) { 1204a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh return kErrorParameters; 1214a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } 1224a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1234a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayBase *display_base = NULL; 1244a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1254a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh switch (type) { 1264a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh case kPrimary: 1274a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh display_base = new DisplayPrimary(event_handler, hw_info_intf_, buffer_sync_handler_, 1284a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh buffer_allocator_, &comp_mgr_); 1294a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh break; 1304a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh case kHDMI: 1314a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh display_base = new DisplayHDMI(event_handler, hw_info_intf_, buffer_sync_handler_, 1324a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh buffer_allocator_, &comp_mgr_); 1334a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh break; 1344a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh case kVirtual: 1354a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh display_base = new DisplayVirtual(event_handler, hw_info_intf_, buffer_sync_handler_, 1364a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh buffer_allocator_, &comp_mgr_); 1374a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh break; 1384a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh default: 1394a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DLOGE("Spurious display type %d", type); 1404a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh return kErrorParameters; 1414a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } 1424a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1434a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh if (!display_base) { 1444a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh return kErrorMemory; 1454a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } 1464a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1474a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayError error = display_base->Init(); 1484a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh if (error != kErrorNone) { 1494a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh delete display_base; 1504a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh return error; 1514a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } 1524a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1534a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh *intf = display_base; 1544a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh return kErrorNone; 1554a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh} 1564a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1574a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain VongsouvanhDisplayError CoreImpl::DestroyDisplay(DisplayInterface *intf) { 1584a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh SCOPE_LOCK(locker_); 1594a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1604a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh if (!intf) { 1614a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh return kErrorParameters; 1624a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } 1634a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1644a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayBase *display_base = static_cast<DisplayBase *>(intf); 1654a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh display_base->Deinit(); 1664a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh delete display_base; 1674a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1684a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh return kErrorNone; 1694a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh} 1704a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1714a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain VongsouvanhDisplayError CoreImpl::SetMaxBandwidthMode(HWBwModes mode) { 1724a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh SCOPE_LOCK(locker_); 1734a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1744a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh return comp_mgr_.SetMaxBandwidthMode(mode); 1754a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh} 1764a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1774a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain VongsouvanhDisplayError CoreImpl::GetFirstDisplayInterfaceType(HWDisplayInterfaceInfo *hw_disp_info) { 1784a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh return hw_info_intf_->GetFirstDisplayInterfaceType(hw_disp_info); 1794a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh} 1804a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1814a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh} // namespace sdm 1824a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 183