Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f2fe3932 authored by Mathias Agopian's avatar Mathias Agopian Committed by Android Git Automerger
Browse files

am 1604f777: one more step toward HDMI support

* commit '1604f777':
  one more step toward HDMI support
parents 29c286ee 1604f777
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -187,7 +187,10 @@ HWComposer::HWComposer(
                    mDisplayData[HWC_DISPLAY_PRIMARY].refresh);
        }
    } else if (mHwc) {
        queryDisplayProperties(HWC_DISPLAY_PRIMARY);
        // here we're guaranteed to have at least HWC 1.1
        for (size_t i =0 ; i<HWC_NUM_DISPLAY_TYPES ; i++) {
            queryDisplayProperties(i);
        }
    }

    if (needVSyncThread) {
@@ -319,7 +322,8 @@ static const uint32_t DISPLAY_ATTRIBUTES[] = {
#define ANDROID_DENSITY_TV    213
#define ANDROID_DENSITY_XHIGH 320

void HWComposer::queryDisplayProperties(int disp) {
status_t HWComposer::queryDisplayProperties(int disp) {

    LOG_ALWAYS_FATAL_IF(!mHwc || !hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1));

    // use zero as default value for unspecified attributes
@@ -329,13 +333,13 @@ void HWComposer::queryDisplayProperties(int disp) {
    uint32_t config;
    size_t numConfigs = 1;
    status_t err = mHwc->getDisplayConfigs(mHwc, disp, &config, &numConfigs);
    LOG_ALWAYS_FATAL_IF(err, "getDisplayAttributes failed (%s)", strerror(-err));

    if (err == NO_ERROR) {
        mHwc->getDisplayAttributes(mHwc, disp, config, DISPLAY_ATTRIBUTES,
                values);
    if (err != NO_ERROR) {
        // this can happen if an unpluggable display is not connected
        return err;
    }

    mHwc->getDisplayAttributes(mHwc, disp, config, DISPLAY_ATTRIBUTES, values);

    int32_t w = 0, h = 0;
    for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) {
        switch (DISPLAY_ATTRIBUTES[i]) {
@@ -371,6 +375,7 @@ void HWComposer::queryDisplayProperties(int disp) {
            mDisplayData[disp].ydpi = ANDROID_DENSITY_TV;
        }
    }
    return NO_ERROR;
}

int32_t HWComposer::allocateDisplayId() {
+1 −1
Original line number Diff line number Diff line
@@ -274,7 +274,7 @@ private:
    inline void vsync(int disp, int64_t timestamp);
    inline void hotplug(int disp, int connected);

    void queryDisplayProperties(int disp);
    status_t queryDisplayProperties(int disp);

    status_t setFramebufferTarget(int32_t id,
            const sp<Fence>& acquireFence, const sp<GraphicBuffer>& buf);
+41 −27
Original line number Diff line number Diff line
@@ -522,16 +522,21 @@ bool SurfaceFlinger::authenticateSurfaceTexture(
}

status_t SurfaceFlinger::getDisplayInfo(const sp<IBinder>& display, DisplayInfo* info) {
    // TODO: this is mostly here only for compatibility
    //       the display size is needed but the display metrics should come from elsewhere
    if (display != mDefaultDisplays[ISurfaceComposer::eDisplayIdMain]) {
        // TODO: additional displays not yet supported
        return BAD_INDEX;
    int32_t type = BAD_VALUE;
    for (int i=0 ; i<DisplayDevice::NUM_DISPLAY_TYPES ; i++) {
        if (display == mDefaultDisplays[i]) {
            type = i;
            break;
        }
    }

    if (type < 0) {
        return type;
    }

    const HWComposer& hwc(getHwComposer());
    float xdpi = hwc.getDpiX(HWC_DISPLAY_PRIMARY);
    float ydpi = hwc.getDpiY(HWC_DISPLAY_PRIMARY);
    float xdpi = hwc.getDpiX(type);
    float ydpi = hwc.getDpiY(type);

    // TODO: Not sure if display density should handled by SF any longer
    class Density {
@@ -549,6 +554,8 @@ status_t SurfaceFlinger::getDisplayInfo(const sp<IBinder>& display, DisplayInfo*
        static int getBuildDensity()  {
            return getDensityFromProperty("ro.sf.lcd_density"); }
    };

    if (type == DisplayDevice::DISPLAY_PRIMARY) {
        // The density of the device is provided by a build property
        float density = Density::getBuildDensity() / 160.0f;
        if (density == 0) {
@@ -562,17 +569,24 @@ status_t SurfaceFlinger::getDisplayInfo(const sp<IBinder>& display, DisplayInfo*
            xdpi = ydpi = density = Density::getEmuDensity();
            density /= 160.0f;
        }
        info->density = density;

        // TODO: this needs to go away (currently needed only by webkit)
        sp<const DisplayDevice> hw(getDefaultDisplayDevice());
    info->w = hw->getWidth();
    info->h = hw->getHeight();
    info->xdpi = xdpi;
    info->ydpi = ydpi;
    info->fps = float(1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY));
    info->density = density;
        info->orientation = hw->getOrientation();
    // TODO: this needs to go away (currently needed only by webkit)
        getPixelFormatInfo(hw->getFormat(), &info->pixelFormatInfo);
    } else {
        // TODO: where should this value come from?
        static const int TV_DENSITY = 213;
        info->density = TV_DENSITY / 160.0f;
        info->orientation = 0;
    }

    info->w = hwc.getWidth(type);
    info->h = hwc.getHeight(type);
    info->xdpi = xdpi;
    info->ydpi = ydpi;
    info->fps = float(1e9 / hwc.getRefreshPeriod(type));
    return NO_ERROR;
}