blob: 9bc3f0d2afb278800c20848f777ab2d6375af459 [file] [log] [blame]
Dileep Marchyaee4b6072019-11-13 16:22:38 +05301/*
Dileep Marchyab7680042020-05-08 13:05:38 +05302 * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
Dileep Marchyaee4b6072019-11-13 16:22:38 +05303 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above
10 * copyright notice, this list of conditions and the following
11 * disclaimer in the documentation and/or other materials provided
12 * with the distribution.
13 * * Neither the name of The Linux Foundation nor the names of its
14 * contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#ifndef __COMPOSER_EXTN_INTF_H__
31#define __COMPOSER_EXTN_INTF_H__
32
33#include <dlfcn.h>
Dileep Marchyae0138f52019-11-15 19:49:17 +053034#include "frame_scheduler_intf.h"
Dileep Marchyab7680042020-05-08 13:05:38 +053035#include "display_extn_intf.h"
Dileep Marchyae0138f52019-11-15 19:49:17 +053036
37#define COMPOSER_EXTN_REV_MAJOR (1)
38#define COMPOSER_EXTN_REV_MINOR (0)
39#define COMPOSER_EXTN_VERSION_TAG ((uint16_t) ((COMPOSER_EXTN_REV_MAJOR << 8) \
40 | COMPOSER_EXTN_REV_MINOR))
Dileep Marchyaee4b6072019-11-13 16:22:38 +053041
42namespace composer {
43
44class ComposerExtnIntf {
Dileep Marchyae0138f52019-11-15 19:49:17 +053045 public:
46 virtual int CreateFrameScheduler(FrameSchedulerIntf **intf) = 0;
47 virtual void DestroyFrameScheduler(FrameSchedulerIntf *intf) = 0;
Dileep Marchyab7680042020-05-08 13:05:38 +053048 virtual int CreateDisplayExtn(DisplayExtnIntf **intf) = 0;
49 virtual void DestroyDisplayExtn(DisplayExtnIntf *intf) = 0;
Dileep Marchyaee4b6072019-11-13 16:22:38 +053050 protected:
51 virtual ~ComposerExtnIntf() { }
52};
53
54class ComposerExtnLib {
55 public:
56 static ComposerExtnIntf * GetInstance() {
57 return g_composer_ext_lib_.composer_ext_intf_;
58 }
59
60 private:
61 const char *lib_name = "libcomposerextn.qti.so";
62
Dileep Marchyae0138f52019-11-15 19:49:17 +053063 typedef int (*CreateComposerExtn)(uint16_t version, ComposerExtnIntf **intf);
64 typedef void (*DestroyComposerExtn)(ComposerExtnIntf *intf);
Dileep Marchyaee4b6072019-11-13 16:22:38 +053065
66 ComposerExtnLib() {
67 lib_obj_ = ::dlopen(lib_name, RTLD_NOW);
68 if (!lib_obj_) {
69 return;
70 }
71
Dileep Marchyae0138f52019-11-15 19:49:17 +053072 create_composer_ext_fn_ = reinterpret_cast<CreateComposerExtn>(
73 ::dlsym(lib_obj_, "CreateComposerExtn"));
74 destroy_composer_ext_fn_ = reinterpret_cast<DestroyComposerExtn>(
75 ::dlsym(lib_obj_, "DestroyComposerExtn"));
76 if (create_composer_ext_fn_ && destroy_composer_ext_fn_) {
77 create_composer_ext_fn_(COMPOSER_EXTN_VERSION_TAG, &composer_ext_intf_);
Dileep Marchyaee4b6072019-11-13 16:22:38 +053078 }
79 }
80
81 ~ComposerExtnLib() {
82 if (composer_ext_intf_) {
Dileep Marchyae0138f52019-11-15 19:49:17 +053083 destroy_composer_ext_fn_(composer_ext_intf_);
Dileep Marchyaee4b6072019-11-13 16:22:38 +053084 }
85
86 if (lib_obj_) {
87 ::dlclose(lib_obj_);
88 }
89 }
90
91 static ComposerExtnLib g_composer_ext_lib_;
92 void *lib_obj_ = nullptr;
Dileep Marchyae0138f52019-11-15 19:49:17 +053093 CreateComposerExtn create_composer_ext_fn_ = nullptr;
94 DestroyComposerExtn destroy_composer_ext_fn_ = nullptr;
Dileep Marchyaee4b6072019-11-13 16:22:38 +053095 ComposerExtnIntf *composer_ext_intf_ = nullptr;
96};
97
98} // namespace composer
99
100#endif // __COMPOSER_EXTN_INTF_H__