summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Qiu <junhai.qiu@intel.com>2015-05-01 14:11:05 -0700
committerPatrick Tjin <pattjin@google.com>2015-05-01 14:28:41 -0700
commit97ca3dba1b7c7fc5f35961ff6e6a14ef3843aa86 (patch)
treeacf55ebbbc8333d857dbfd432b421c98219e89f4
parent244c2f4bfa28df1be490dafc3a21fabd8d2c302f (diff)
downloadandroid_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-xmoorefield_hdmi/common/base/Drm.cpp71
-rwxr-xr-xmoorefield_hdmi/common/devices/ExternalDevice.cpp11
-rwxr-xr-xmoorefield_hdmi/include/ExternalDevice.h1
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(&currentMode, &output->mode, sizeof(drmModeModeInfo));
@@ -617,55 +620,53 @@ bool Drm::setDrmMode(int index, drmModeModeInfoPtr mode)
if (isSameDrmMode(mode, &currentMode))
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);