From 1604f777d11c40daae8ec91d8ea75625996bfbac Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Tue, 18 Sep 2012 21:54:42 -0700 Subject: [PATCH] one more step toward HDMI support getDisplayInfo() now returns proper information for HWC managed displays. hotplug is sitll not supported; so this is not fully correct as the information returned will be bogus if the HDMI screen is not plugged in. Bug: 7191563 Change-Id: If55d8e829fae0443571548155007f486cdf9bc9f --- .../surfaceflinger/DisplayHardware/HWComposer.cpp | 19 +++--- .../surfaceflinger/DisplayHardware/HWComposer.h | 2 +- services/surfaceflinger/SurfaceFlinger.cpp | 68 +++++++++++++--------- 3 files changed, 54 insertions(+), 35 deletions(-) diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp index 9429ae6edd..caec250cf7 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp +++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp @@ -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 ; igetDisplayConfigs(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() { diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.h b/services/surfaceflinger/DisplayHardware/HWComposer.h index f253ecc762..415633217c 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.h +++ b/services/surfaceflinger/DisplayHardware/HWComposer.h @@ -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& acquireFence, const sp& buf); diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 38aa0122a9..bd587f2a71 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -522,16 +522,21 @@ bool SurfaceFlinger::authenticateSurfaceTexture( } status_t SurfaceFlinger::getDisplayInfo(const sp& 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& display, DisplayInfo* static int getBuildDensity() { return getDensityFromProperty("ro.sf.lcd_density"); } }; - // The density of the device is provided by a build property - float density = Density::getBuildDensity() / 160.0f; - if (density == 0) { - // the build doesn't provide a density -- this is wrong! - // use xdpi instead - ALOGE("ro.sf.lcd_density must be defined as a build property"); - density = xdpi / 160.0f; - } - if (Density::getEmuDensity()) { - // if "qemu.sf.lcd_density" is specified, it overrides everything - xdpi = ydpi = density = Density::getEmuDensity(); - density /= 160.0f; + + 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) { + // the build doesn't provide a density -- this is wrong! + // use xdpi instead + ALOGE("ro.sf.lcd_density must be defined as a build property"); + density = xdpi / 160.0f; + } + if (Density::getEmuDensity()) { + // if "qemu.sf.lcd_density" is specified, it overrides everything + xdpi = ydpi = density = Density::getEmuDensity(); + density /= 160.0f; + } + info->density = density; + + // TODO: this needs to go away (currently needed only by webkit) + sp hw(getDefaultDisplayDevice()); + info->orientation = hw->getOrientation(); + 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; } - sp hw(getDefaultDisplayDevice()); - info->w = hw->getWidth(); - info->h = hw->getHeight(); + info->w = hwc.getWidth(type); + info->h = hwc.getHeight(type); 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); + info->fps = float(1e9 / hwc.getRefreshPeriod(type)); return NO_ERROR; } -- 2.11.0