diff options
author | Andy Qiu <junhai.qiu@intel.com> | 2015-05-01 14:11:05 -0700 |
---|---|---|
committer | Patrick Tjin <pattjin@google.com> | 2015-05-01 14:28:41 -0700 |
commit | 97ca3dba1b7c7fc5f35961ff6e6a14ef3843aa86 (patch) | |
tree | acf55ebbbc8333d857dbfd432b421c98219e89f4 | |
parent | 244c2f4bfa28df1be490dafc3a21fabd8d2c302f (diff) | |
download | android_hardware_intel_img_hwcomposer-97ca3dba1b7c7fc5f35961ff6e6a14ef3843aa86.tar.gz android_hardware_intel_img_hwcomposer-97ca3dba1b7c7fc5f35961ff6e6a14ef3843aa86.tar.bz2 android_hardware_intel_img_hwcomposer-97ca3dba1b7c7fc5f35961ff6e6a14ef3843aa86.zip |
Reuse existing frame buffer during mode setting if display resolution is not changed.
Bug: 18619361
Change-Id: I3d8cb770ead51eb19979f179d408da50b6c02236
Signed-off-by: Andy Qiu <junhai.qiu@intel.com>
-rwxr-xr-x | moorefield_hdmi/common/base/Drm.cpp | 71 | ||||
-rwxr-xr-x | moorefield_hdmi/common/devices/ExternalDevice.cpp | 11 | ||||
-rwxr-xr-x | moorefield_hdmi/include/ExternalDevice.h | 1 |
3 files changed, 37 insertions, 46 deletions
diff --git a/moorefield_hdmi/common/base/Drm.cpp b/moorefield_hdmi/common/base/Drm.cpp index 007d308..3e5138a 100755 --- a/moorefield_hdmi/common/base/Drm.cpp +++ b/moorefield_hdmi/common/base/Drm.cpp @@ -199,6 +199,7 @@ bool Drm::detect(int device) if (output->crtc->mode_valid) { ILOGTRACE("mode is valid, kernel mode settings"); memcpy(&output->mode, &output->crtc->mode, sizeof(drmModeModeInfo)); + //output->fbId = output->crtc->buffer_id; ret = true; } else { ELOGTRACE("mode is invalid. Kernel mode setting is not completed"); @@ -608,8 +609,10 @@ bool Drm::setDrmMode(int index, drmModeModeInfoPtr mode) { DrmOutput *output = &mOutputs[index]; - int oldFbId =0; + int oldFbId = 0; int oldFbHandle = 0; + // reuse current frame buffer if there is no resolution change + int fbId = -1; drmModeModeInfo currentMode; memcpy(¤tMode, &output->mode, sizeof(drmModeModeInfo)); @@ -617,55 +620,53 @@ bool Drm::setDrmMode(int index, drmModeModeInfoPtr mode) if (isSameDrmMode(mode, ¤tMode)) return true; + if (currentMode.hdisplay != mode->hdisplay || + currentMode.vdisplay != mode->vdisplay) { - if (output->fbId) { - oldFbId = output->fbId ; - output->fbId = 0; - } - - if (output->fbHandle) { + oldFbId = output->fbId; oldFbHandle = output->fbHandle; - output->fbHandle = 0; - } - // allocate frame buffer - int stride = 0; + // allocate frame buffer + int stride = 0; #ifdef INTEL_SUPPORT_HDMI_PRIMARY - output->fbHandle = Hwcomposer::getInstance().getBufferManager()->allocFrameBuffer( - DEFAULT_DRM_FB_WIDTH, DEFAULT_DRM_FB_HEIGHT, &stride); + output->fbHandle = Hwcomposer::getInstance().getBufferManager()->allocFrameBuffer( + DEFAULT_DRM_FB_WIDTH, DEFAULT_DRM_FB_HEIGHT, &stride); #else - output->fbHandle = Hwcomposer::getInstance().getBufferManager()->allocFrameBuffer( - mode->hdisplay, mode->vdisplay, &stride); + output->fbHandle = Hwcomposer::getInstance().getBufferManager()->allocFrameBuffer( + mode->hdisplay, mode->vdisplay, &stride); #endif - if (output->fbHandle == 0) { - ELOGTRACE("failed to allocate frame buffer"); - return false; - } + if (output->fbHandle == 0) { + ELOGTRACE("failed to allocate frame buffer"); + return false; + } - int ret = 0; - ret = drmModeAddFB( - mDrmFd, + int ret = 0; + ret = drmModeAddFB( + mDrmFd, #ifdef INTEL_SUPPORT_HDMI_PRIMARY - DEFAULT_DRM_FB_WIDTH, - DEFAULT_DRM_FB_HEIGHT, + DEFAULT_DRM_FB_WIDTH, + DEFAULT_DRM_FB_HEIGHT, #else - mode->hdisplay, - mode->vdisplay, + mode->hdisplay, + mode->vdisplay, #endif - DrmConfig::getFrameBufferDepth(), - DrmConfig::getFrameBufferBpp(), - stride, - output->fbHandle, - &output->fbId); - if (ret != 0) { - ELOGTRACE("drmModeAddFB failed, error: %d", ret); - return false; + DrmConfig::getFrameBufferDepth(), + DrmConfig::getFrameBufferBpp(), + stride, + output->fbHandle, + &output->fbId); + if (ret != 0) { + ELOGTRACE("drmModeAddFB failed, error: %d", ret); + return false; + } + fbId = output->fbId; } ILOGTRACE("mode set: %dx%d@%dHz", mode->hdisplay, mode->vdisplay, mode->vrefresh); - ret = drmModeSetCrtc(mDrmFd, output->crtc->crtc_id, output->fbId, 0, 0, + int ret = drmModeSetCrtc(mDrmFd, output->crtc->crtc_id, fbId, 0, 0, &output->connector->connector_id, 1, mode); + if (ret == 0) { //save mode memcpy(&output->mode, mode, sizeof(drmModeModeInfo)); diff --git a/moorefield_hdmi/common/devices/ExternalDevice.cpp b/moorefield_hdmi/common/devices/ExternalDevice.cpp index 2430c15..bd7e35f 100755 --- a/moorefield_hdmi/common/devices/ExternalDevice.cpp +++ b/moorefield_hdmi/common/devices/ExternalDevice.cpp @@ -28,8 +28,7 @@ ExternalDevice::ExternalDevice(Hwcomposer& hwc, DisplayPlaneManager& dpm) mHdcpControl(NULL), mAbortModeSettingCond(), mPendingDrmMode(), - mHotplugEventPending(false), - mExpectedRefreshRate(0) + mHotplugEventPending(false) { CTRACE(); } @@ -182,7 +181,6 @@ void ExternalDevice::setDrmMode() mHotplugEventPending = false; mHwc.hotplug(mType, true); } - mExpectedRefreshRate = 0; } @@ -279,13 +277,6 @@ void ExternalDevice::setRefreshRate(int hz) if (hz == (int)mode.vrefresh) return; - if (mExpectedRefreshRate != 0 && - mExpectedRefreshRate == hz && mHotplugEventPending) { - ILOGTRACE("Ignore a new refresh setting event because there is a same event is handling"); - return; - } - mExpectedRefreshRate = hz; - ILOGTRACE("changing refresh rate from %d to %d", mode.vrefresh, hz); mHdcpControl->stopHdcp(); diff --git a/moorefield_hdmi/include/ExternalDevice.h b/moorefield_hdmi/include/ExternalDevice.h index 6cf7332..cff2b83 100755 --- a/moorefield_hdmi/include/ExternalDevice.h +++ b/moorefield_hdmi/include/ExternalDevice.h @@ -63,7 +63,6 @@ private: Condition mAbortModeSettingCond; drmModeModeInfo mPendingDrmMode; bool mHotplugEventPending; - int mExpectedRefreshRate; private: DECLARE_THREAD(ModeSettingThread, ExternalDevice); |