Loading services/surfaceflinger/DisplayHardware/HWComposer.cpp +18 −2 Original line number Diff line number Diff line Loading @@ -179,6 +179,7 @@ HWComposer::HWComposer( config.height = mFbDev->height; config.xdpi = mFbDev->xdpi; config.ydpi = mFbDev->ydpi; config.secure = true; //XXX: Assuming primary is always true config.refresh = nsecs_t(1e9 / mFbDev->fps); disp.configs.push_back(config); disp.currentConfig = 0; Loading Loading @@ -350,6 +351,10 @@ static const uint32_t DISPLAY_ATTRIBUTES[] = { HWC_DISPLAY_HEIGHT, HWC_DISPLAY_DPI_X, HWC_DISPLAY_DPI_Y, //To specify if display is secure //Primary is considered as secure always //HDMI can be secure based on HDCP HWC_DISPLAY_SECURE, HWC_DISPLAY_NO_ATTRIBUTE, }; #define NUM_DISPLAY_ATTRIBUTES (sizeof(DISPLAY_ATTRIBUTES) / sizeof(DISPLAY_ATTRIBUTES)[0]) Loading Loading @@ -405,6 +410,9 @@ status_t HWComposer::queryDisplayProperties(int disp) { case HWC_DISPLAY_DPI_Y: config.ydpi = values[i] / 1000.0f; break; case HWC_DISPLAY_SECURE: config.secure = values[i]; break; default: ALOG_ASSERT(false, "unknown display attribute[%zu] %#x", i, DISPLAY_ATTRIBUTES[i]); Loading Loading @@ -439,6 +447,8 @@ status_t HWComposer::setVirtualDisplayProperties(int32_t id, config.width = w; config.height = h; config.xdpi = config.ydpi = getDefaultDensity(w, h); //XXXX: No need to set secure for virtual display's as its initiated by //the frameworks return NO_ERROR; } Loading Loading @@ -514,6 +524,12 @@ float HWComposer::getDpiY(int disp) const { return mDisplayData[disp].configs[currentConfig].ydpi; } bool HWComposer::isSecure(int disp) const { size_t currentConfig = mDisplayData[disp].currentConfig; return mDisplayData[disp].configs[currentConfig].secure; } nsecs_t HWComposer::getRefreshPeriod(int disp) const { size_t currentConfig = mDisplayData[disp].currentConfig; return mDisplayData[disp].configs[currentConfig].refresh; Loading Loading @@ -1240,9 +1256,9 @@ void HWComposer::dump(String8& result) const { result.appendFormat(" Display[%zd] configurations (* current):\n", i); for (size_t c = 0; c < disp.configs.size(); ++c) { const DisplayConfig& config(disp.configs[c]); result.appendFormat(" %s%zd: %ux%u, xdpi=%f, ydpi=%f, refresh=%" PRId64 "\n", result.appendFormat(" %s%zd: %ux%u, xdpi=%f, ydpi=%f, secure=%d refresh=%" PRId64 "\n", c == disp.currentConfig ? "* " : "", c, config.width, config.height, config.xdpi, config.ydpi, config.refresh); config.xdpi, config.ydpi, config.secure, config.refresh); } if (disp.list) { Loading services/surfaceflinger/DisplayHardware/HWComposer.h +2 −0 Original line number Diff line number Diff line Loading @@ -274,6 +274,7 @@ public: uint32_t height; float xdpi; float ydpi; bool secure; nsecs_t refresh; }; Loading @@ -283,6 +284,7 @@ public: sp<Fence> getDisplayFence(int disp) const; uint32_t getFormat(int disp) const; bool isConnected(int disp) const; bool isSecure(int disp) const; // These return the values for the current config of a given display index. // To get the values for all configs, use getConfigs below. Loading services/surfaceflinger/SurfaceFlinger.cpp +11 −9 Original line number Diff line number Diff line Loading @@ -278,13 +278,13 @@ void SurfaceFlinger::destroyDisplay(const sp<IBinder>& display) { setTransactionFlags(eDisplayTransactionNeeded); } void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type) { void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type, bool secure) { ALOGW_IF(mBuiltinDisplays[type], "Overwriting display token for display type %d", type); mBuiltinDisplays[type] = new BBinder(); DisplayDeviceState info(type); // All non-virtual displays are currently considered secure. info.isSecure = true; info.isSecure = secure; mCurrentState.displays.add(mBuiltinDisplays[type], info); } Loading Loading @@ -444,9 +444,9 @@ void SurfaceFlinger::init() { DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i); // set-up the displays that are already connected if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) { // All non-virtual displays are currently considered secure. bool isSecure = true; createBuiltinDisplayLocked(type); // query from hwc if the non-virtual display is secure. bool isSecure = mHwc->isSecure(i);; createBuiltinDisplayLocked(type, isSecure); wp<IBinder> token = mBuiltinDisplays[i]; sp<IGraphicBufferProducer> producer; Loading Loading @@ -626,8 +626,8 @@ status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& display, info.presentationDeadline = hwConfig.refresh - SF_VSYNC_EVENT_PHASE_OFFSET_NS + 1000000; // All non-virtual displays are currently considered secure. info.secure = true; // set secure info based on the hwcConfig info.secure = hwConfig.secure; configs->push_back(info); } Loading Loading @@ -840,7 +840,9 @@ void SurfaceFlinger::onHotplugReceived(int type, bool connected) { if (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) { Mutex::Autolock _l(mStateLock); if (connected) { createBuiltinDisplayLocked((DisplayDevice::DisplayType)type); // query from hwc if the connected display is secure bool secure = mHwc->isSecure(type);; createBuiltinDisplayLocked((DisplayDevice::DisplayType)type, secure); } else { mCurrentState.displays.removeItem(mBuiltinDisplays[type]); mBuiltinDisplays[type].clear(); Loading services/surfaceflinger/SurfaceFlinger.h +2 −1 Original line number Diff line number Diff line Loading @@ -357,7 +357,8 @@ private: void initializeDisplays(); // Create an IBinder for a builtin display and add it to current state void createBuiltinDisplayLocked(DisplayDevice::DisplayType type); void createBuiltinDisplayLocked(DisplayDevice::DisplayType type, bool secure); // NOTE: can only be called from the main thread or with mStateLock held sp<const DisplayDevice> getDisplayDevice(const wp<IBinder>& dpy) const { Loading Loading
services/surfaceflinger/DisplayHardware/HWComposer.cpp +18 −2 Original line number Diff line number Diff line Loading @@ -179,6 +179,7 @@ HWComposer::HWComposer( config.height = mFbDev->height; config.xdpi = mFbDev->xdpi; config.ydpi = mFbDev->ydpi; config.secure = true; //XXX: Assuming primary is always true config.refresh = nsecs_t(1e9 / mFbDev->fps); disp.configs.push_back(config); disp.currentConfig = 0; Loading Loading @@ -350,6 +351,10 @@ static const uint32_t DISPLAY_ATTRIBUTES[] = { HWC_DISPLAY_HEIGHT, HWC_DISPLAY_DPI_X, HWC_DISPLAY_DPI_Y, //To specify if display is secure //Primary is considered as secure always //HDMI can be secure based on HDCP HWC_DISPLAY_SECURE, HWC_DISPLAY_NO_ATTRIBUTE, }; #define NUM_DISPLAY_ATTRIBUTES (sizeof(DISPLAY_ATTRIBUTES) / sizeof(DISPLAY_ATTRIBUTES)[0]) Loading Loading @@ -405,6 +410,9 @@ status_t HWComposer::queryDisplayProperties(int disp) { case HWC_DISPLAY_DPI_Y: config.ydpi = values[i] / 1000.0f; break; case HWC_DISPLAY_SECURE: config.secure = values[i]; break; default: ALOG_ASSERT(false, "unknown display attribute[%zu] %#x", i, DISPLAY_ATTRIBUTES[i]); Loading Loading @@ -439,6 +447,8 @@ status_t HWComposer::setVirtualDisplayProperties(int32_t id, config.width = w; config.height = h; config.xdpi = config.ydpi = getDefaultDensity(w, h); //XXXX: No need to set secure for virtual display's as its initiated by //the frameworks return NO_ERROR; } Loading Loading @@ -514,6 +524,12 @@ float HWComposer::getDpiY(int disp) const { return mDisplayData[disp].configs[currentConfig].ydpi; } bool HWComposer::isSecure(int disp) const { size_t currentConfig = mDisplayData[disp].currentConfig; return mDisplayData[disp].configs[currentConfig].secure; } nsecs_t HWComposer::getRefreshPeriod(int disp) const { size_t currentConfig = mDisplayData[disp].currentConfig; return mDisplayData[disp].configs[currentConfig].refresh; Loading Loading @@ -1240,9 +1256,9 @@ void HWComposer::dump(String8& result) const { result.appendFormat(" Display[%zd] configurations (* current):\n", i); for (size_t c = 0; c < disp.configs.size(); ++c) { const DisplayConfig& config(disp.configs[c]); result.appendFormat(" %s%zd: %ux%u, xdpi=%f, ydpi=%f, refresh=%" PRId64 "\n", result.appendFormat(" %s%zd: %ux%u, xdpi=%f, ydpi=%f, secure=%d refresh=%" PRId64 "\n", c == disp.currentConfig ? "* " : "", c, config.width, config.height, config.xdpi, config.ydpi, config.refresh); config.xdpi, config.ydpi, config.secure, config.refresh); } if (disp.list) { Loading
services/surfaceflinger/DisplayHardware/HWComposer.h +2 −0 Original line number Diff line number Diff line Loading @@ -274,6 +274,7 @@ public: uint32_t height; float xdpi; float ydpi; bool secure; nsecs_t refresh; }; Loading @@ -283,6 +284,7 @@ public: sp<Fence> getDisplayFence(int disp) const; uint32_t getFormat(int disp) const; bool isConnected(int disp) const; bool isSecure(int disp) const; // These return the values for the current config of a given display index. // To get the values for all configs, use getConfigs below. Loading
services/surfaceflinger/SurfaceFlinger.cpp +11 −9 Original line number Diff line number Diff line Loading @@ -278,13 +278,13 @@ void SurfaceFlinger::destroyDisplay(const sp<IBinder>& display) { setTransactionFlags(eDisplayTransactionNeeded); } void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type) { void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type, bool secure) { ALOGW_IF(mBuiltinDisplays[type], "Overwriting display token for display type %d", type); mBuiltinDisplays[type] = new BBinder(); DisplayDeviceState info(type); // All non-virtual displays are currently considered secure. info.isSecure = true; info.isSecure = secure; mCurrentState.displays.add(mBuiltinDisplays[type], info); } Loading Loading @@ -444,9 +444,9 @@ void SurfaceFlinger::init() { DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i); // set-up the displays that are already connected if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) { // All non-virtual displays are currently considered secure. bool isSecure = true; createBuiltinDisplayLocked(type); // query from hwc if the non-virtual display is secure. bool isSecure = mHwc->isSecure(i);; createBuiltinDisplayLocked(type, isSecure); wp<IBinder> token = mBuiltinDisplays[i]; sp<IGraphicBufferProducer> producer; Loading Loading @@ -626,8 +626,8 @@ status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& display, info.presentationDeadline = hwConfig.refresh - SF_VSYNC_EVENT_PHASE_OFFSET_NS + 1000000; // All non-virtual displays are currently considered secure. info.secure = true; // set secure info based on the hwcConfig info.secure = hwConfig.secure; configs->push_back(info); } Loading Loading @@ -840,7 +840,9 @@ void SurfaceFlinger::onHotplugReceived(int type, bool connected) { if (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) { Mutex::Autolock _l(mStateLock); if (connected) { createBuiltinDisplayLocked((DisplayDevice::DisplayType)type); // query from hwc if the connected display is secure bool secure = mHwc->isSecure(type);; createBuiltinDisplayLocked((DisplayDevice::DisplayType)type, secure); } else { mCurrentState.displays.removeItem(mBuiltinDisplays[type]); mBuiltinDisplays[type].clear(); Loading
services/surfaceflinger/SurfaceFlinger.h +2 −1 Original line number Diff line number Diff line Loading @@ -357,7 +357,8 @@ private: void initializeDisplays(); // Create an IBinder for a builtin display and add it to current state void createBuiltinDisplayLocked(DisplayDevice::DisplayType type); void createBuiltinDisplayLocked(DisplayDevice::DisplayType type, bool secure); // NOTE: can only be called from the main thread or with mStateLock held sp<const DisplayDevice> getDisplayDevice(const wp<IBinder>& dpy) const { Loading