Loading services/surfaceflinger/DisplayHardware/HWComposer.cpp +12 −7 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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 Loading @@ -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]) { Loading Loading @@ -371,6 +375,7 @@ void HWComposer::queryDisplayProperties(int disp) { mDisplayData[disp].ydpi = ANDROID_DENSITY_TV; } } return NO_ERROR; } int32_t HWComposer::allocateDisplayId() { Loading services/surfaceflinger/DisplayHardware/HWComposer.h +1 −1 Original line number Diff line number Diff line Loading @@ -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); Loading services/surfaceflinger/SurfaceFlinger.cpp +41 −27 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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) { Loading @@ -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; } Loading Loading
services/surfaceflinger/DisplayHardware/HWComposer.cpp +12 −7 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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 Loading @@ -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]) { Loading Loading @@ -371,6 +375,7 @@ void HWComposer::queryDisplayProperties(int disp) { mDisplayData[disp].ydpi = ANDROID_DENSITY_TV; } } return NO_ERROR; } int32_t HWComposer::allocateDisplayId() { Loading
services/surfaceflinger/DisplayHardware/HWComposer.h +1 −1 Original line number Diff line number Diff line Loading @@ -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); Loading
services/surfaceflinger/SurfaceFlinger.cpp +41 −27 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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) { Loading @@ -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; } Loading