Home | History | Annotate | Download | only in devices
      1 /*
      2 // Copyright(c)2014 IntelCorporation
      3 //
      4 // LicensedundertheApacheLicense,Version2.0(the"License");
      5 // youmaynotusethisfileexceptincompliancewiththeLicense.
      6 // YoumayobtainacopyoftheLicenseat
      7 //
      8 // http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unlessrequiredbyapplicablelaworagreedtoinwriting,software
     11 // distributedundertheLicenseisdistributedonan"ASIS"BASIS,
     12 // WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
     13 // SeetheLicenseforthespecificlanguagegoverningpermissionsand
     14 // limitationsundertheLicense.
     15 */
     16 #include <common/utils/HwcTrace.h>
     17 #include <Hwcomposer.h>
     18 #include <DisplayQuery.h>
     19 #include <common/observers/SoftVsyncObserver.h>
     20 #include <DummyDevice.h>
     21 
     22 namespace android {
     23 namespace intel {
     24 DummyDevice::DummyDevice(uint32_t disp, Hwcomposer& hwc)
     25     : mInitialized(false),
     26       mConnected(false),
     27       mBlank(false),
     28       mDisp(disp),
     29       mHwc(hwc),
     30       mVsyncObserver(NULL),
     31       mName("Dummy")
     32 {
     33     CTRACE();
     34 }
     35 
     36 DummyDevice::~DummyDevice()
     37 {
     38     WARN_IF_NOT_DEINIT();
     39 }
     40 
     41 bool DummyDevice::prePrepare(hwc_display_contents_1_t *display)
     42 {
     43     RETURN_FALSE_IF_NOT_INIT();
     44 
     45     if (!display) {
     46         return true;
     47     }
     48 
     49     // nothing need to do for dummy display
     50     return true;
     51 }
     52 
     53 bool DummyDevice::prepare(hwc_display_contents_1_t *display)
     54 {
     55     RETURN_FALSE_IF_NOT_INIT();
     56 
     57     if (!display || mDisp >= DEVICE_VIRTUAL) {
     58         return true;
     59     }
     60 
     61     // skip all layers composition on dummy display
     62     if (display->flags & HWC_GEOMETRY_CHANGED) {
     63         for (size_t i=0; i < display->numHwLayers-1; i++) {
     64             hwc_layer_1 * player = &display->hwLayers[i];
     65             player->compositionType = HWC_OVERLAY;
     66             player->flags &= ~HWC_SKIP_LAYER;
     67         }
     68     }
     69 
     70     return true;
     71 }
     72 
     73 bool DummyDevice::commit(hwc_display_contents_1_t *display, IDisplayContext *context)
     74 {
     75     RETURN_FALSE_IF_NOT_INIT();
     76 
     77     if (!display || !context)
     78         return true;
     79 
     80     // nothing need to do for dummy display
     81     return true;
     82 }
     83 
     84 bool DummyDevice::vsyncControl(bool enabled)
     85 {
     86     RETURN_FALSE_IF_NOT_INIT();
     87     return mVsyncObserver->control(enabled);
     88 }
     89 
     90 bool DummyDevice::blank(bool blank)
     91 {
     92     RETURN_FALSE_IF_NOT_INIT();
     93 
     94     mBlank = blank;
     95 
     96     return true;
     97 }
     98 
     99 bool DummyDevice::getDisplaySize(int *width, int *height)
    100 {
    101     RETURN_FALSE_IF_NOT_INIT();
    102     if (!width || !height) {
    103         ELOGTRACE("invalid parameters");
    104         return false;
    105     }
    106 
    107     // TODO: make this platform specifc
    108     *width = 1280;//720;
    109     *height = 720;//1280;
    110     return true;
    111 }
    112 
    113 bool DummyDevice::getDisplayConfigs(uint32_t *configs,
    114                                          size_t *numConfigs)
    115 {
    116     RETURN_FALSE_IF_NOT_INIT();
    117     if (!configs || !numConfigs) {
    118         ELOGTRACE("invalid parameters");
    119         return false;
    120     }
    121 
    122     if (!mConnected) {
    123         ILOGTRACE("dummy device is not connected");
    124         return false;
    125     }
    126 
    127     *configs = 0;
    128     *numConfigs = 1;
    129 
    130     return true;
    131 }
    132 
    133 bool DummyDevice::getDisplayAttributes(uint32_t configs,
    134                                             const uint32_t *attributes,
    135                                             int32_t *values)
    136 {
    137     RETURN_FALSE_IF_NOT_INIT();
    138 
    139     if ((configs > 0) || !attributes || !values) {
    140         ELOGTRACE("invalid parameters");
    141         return false;
    142     }
    143 
    144     if (!mConnected) {
    145         ILOGTRACE("dummy device is not connected");
    146         return false;
    147     }
    148 
    149     int i = 0;
    150     while (attributes[i] != HWC_DISPLAY_NO_ATTRIBUTE) {
    151         switch (attributes[i]) {
    152         case HWC_DISPLAY_VSYNC_PERIOD:
    153             values[i] = 1e9 / 60;
    154             break;
    155         case HWC_DISPLAY_WIDTH:
    156             values[i] = 1280;
    157             break;
    158         case HWC_DISPLAY_HEIGHT:
    159             values[i] = 720;
    160             break;
    161         case HWC_DISPLAY_DPI_X:
    162             values[i] = 0;
    163             break;
    164         case HWC_DISPLAY_DPI_Y:
    165             values[i] = 0;
    166             break;
    167         default:
    168             ELOGTRACE("unknown attribute %d", attributes[i]);
    169             break;
    170         }
    171         i++;
    172     }
    173 
    174     return true;
    175 }
    176 
    177 bool DummyDevice::compositionComplete()
    178 {
    179     RETURN_FALSE_IF_NOT_INIT();
    180     return true;
    181 }
    182 
    183 bool DummyDevice::initialize()
    184 {
    185     mInitialized = true;
    186 
    187     mVsyncObserver = new SoftVsyncObserver(*this);
    188     if (!mVsyncObserver || !mVsyncObserver->initialize()) {
    189         DEINIT_AND_RETURN_FALSE("Failed to create Soft Vsync Observer");
    190         mInitialized = false;
    191     }
    192 
    193     return mInitialized;
    194 }
    195 
    196 bool DummyDevice::isConnected() const
    197 {
    198     return mConnected;
    199 }
    200 
    201 const char* DummyDevice::getName() const
    202 {
    203     return "Dummy";
    204 }
    205 
    206 int DummyDevice::getType() const
    207 {
    208     return mDisp;
    209 }
    210 
    211 void DummyDevice::onVsync(int64_t timestamp)
    212 {
    213     if (!mConnected)
    214         return;
    215 
    216     mHwc.vsync(mDisp, timestamp);
    217 }
    218 
    219 void DummyDevice::dump(Dump& d)
    220 {
    221     d.append("-------------------------------------------------------------\n");
    222     d.append("Device Name: %s (%s)\n", mName,
    223             mConnected ? "connected" : "disconnected");
    224 }
    225 
    226 void DummyDevice::deinitialize()
    227 {
    228     DEINIT_AND_DELETE_OBJ(mVsyncObserver);
    229     mInitialized = false;
    230 }
    231 
    232 bool DummyDevice::setPowerMode(int /*mode*/)
    233 {
    234     return true;
    235 }
    236 
    237 int DummyDevice::getActiveConfig()
    238 {
    239     return 0;
    240 }
    241 
    242 bool DummyDevice::setActiveConfig(int /*index*/)
    243 {
    244     return false;
    245 }
    246 
    247 } // namespace intel
    248 } // namespace android
    249