1/*
2// Copyright (c) 2014 Intel Corporation 
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8//      http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15*/
16#ifndef HWCOMPOSER_H
17#define HWCOMPOSER_H
18
19#include <EGL/egl.h>
20#include <hardware/hwcomposer.h>
21#include <utils/Vector.h>
22
23#include <IDisplayDevice.h>
24#include <BufferManager.h>
25#include <IDisplayContext.h>
26#include <common/base/Drm.h>
27#include <DisplayPlaneManager.h>
28#include <common/base/DisplayAnalyzer.h>
29#include <UeventObserver.h>
30
31namespace android {
32namespace intel {
33
34class Hwcomposer : public hwc_composer_device_1_t {
35public:
36    virtual ~Hwcomposer();
37public:
38    // callbacks implementation
39    virtual bool prepare(size_t numDisplays,
40                           hwc_display_contents_1_t** displays);
41    virtual bool commit(size_t numDisplays,
42                           hwc_display_contents_1_t** displays);
43    virtual bool vsyncControl(int disp, int enabled);
44    virtual bool release();
45    virtual bool dump(char *buff, int buff_len, int *cur_len);
46    virtual void registerProcs(hwc_procs_t const *procs);
47
48    virtual bool blank(int disp, int blank);
49    virtual bool getDisplayConfigs(int disp,
50                                       uint32_t *configs,
51                                       size_t *numConfigs);
52    virtual bool getDisplayAttributes(int disp,
53                                          uint32_t config,
54                                          const uint32_t *attributes,
55                                          int32_t *values);
56    virtual bool compositionComplete(int disp);
57
58    virtual bool setPowerMode(int disp, int mode);
59    virtual int  getActiveConfig(int disp);
60    virtual bool setActiveConfig(int disp, int index);
61    virtual bool setCursorPositionAsync(int disp, int x, int y);
62
63    // callbacks
64    virtual void vsync(int disp, int64_t timestamp);
65    virtual void hotplug(int disp, bool connected);
66    virtual void invalidate();
67
68    virtual bool initCheck() const;
69    virtual bool initialize();
70    virtual void deinitialize();
71
72public:
73    Drm* getDrm();
74    DisplayPlaneManager* getPlaneManager();
75    BufferManager* getBufferManager();
76    IDisplayContext* getDisplayContext();
77    DisplayAnalyzer* getDisplayAnalyzer();
78    IDisplayDevice* getDisplayDevice(int disp);
79    UeventObserver* getUeventObserver();
80
81protected:
82    Hwcomposer();
83
84public:
85    static Hwcomposer& getInstance() {
86        Hwcomposer *instance = sInstance;
87        if (instance == 0) {
88            instance = createHwcomposer();
89            sInstance = instance;
90        }
91        return *sInstance;
92    }
93    static void releaseInstance() {
94        delete sInstance;
95        sInstance = NULL;
96    }
97    // Need to be implemented
98    static Hwcomposer* createHwcomposer();
99protected:
100    virtual DisplayPlaneManager* createDisplayPlaneManager() = 0;
101    virtual BufferManager* createBufferManager() = 0;
102    virtual IDisplayDevice* createDisplayDevice(int disp,
103                                                 DisplayPlaneManager& dpm) = 0;
104    virtual IDisplayContext* createDisplayContext() = 0;
105
106protected:
107    hwc_procs_t const *mProcs;
108    Drm *mDrm;
109    DisplayPlaneManager *mPlaneManager;
110    BufferManager *mBufferManager;
111    DisplayAnalyzer *mDisplayAnalyzer;
112    Vector<IDisplayDevice*> mDisplayDevices;
113    IDisplayContext *mDisplayContext;
114    UeventObserver *mUeventObserver;
115    bool mInitialized;
116private:
117    static Hwcomposer *sInstance;
118};
119
120} // namespace intel
121}
122
123#endif /*HW_COMPOSER_H*/
124