display: Remove framebuffer HAL usage
This patch removes the usage of the framebuffer HAL which is
deprecated in JB MR1 onwards. The code is left for compatibility
such as conformance tests but it is unused for normal display
usage.
Change-Id: If98133bdaa759cdc41d4503ff695b225ee43cb6f
Conflicts:
libhwcomposer/hwc_utils.cpp
diff --git a/libexternal/external.cpp b/libexternal/external.cpp
index f941404..3f13906 100644
--- a/libexternal/external.cpp
+++ b/libexternal/external.cpp
@@ -683,25 +683,6 @@
return ret;
}
-/*
- * commits the changes to the external display
- */
-bool ExternalDisplay::post()
-{
- if(mFd == -1)
- return false;
-
- struct mdp_display_commit ext_commit;
- memset(&ext_commit, 0, sizeof(struct mdp_display_commit));
- ext_commit.flags = MDP_DISPLAY_COMMIT_OVERLAY;
- if (ioctl(mFd, MSMFB_DISPLAY_COMMIT, &ext_commit) == -1) {
- ALOGE("%s: MSMFB_DISPLAY_COMMIT for external failed, str: %s",
- __FUNCTION__, strerror(errno));
- return false;
- }
- return true;
-}
-
void ExternalDisplay::setDpyWfdAttr() {
if(mHwcContext) {
mHwcContext->dpyAttr[mExtDpyNum].xres = mVInfo.xres;
diff --git a/libexternal/external.h b/libexternal/external.h
index 39f8645..d46eec1 100644
--- a/libexternal/external.h
+++ b/libexternal/external.h
@@ -47,7 +47,6 @@
void setExternalDisplay(bool connected, int extFbNum = 0);
bool isExternalConnected() { return mConnected;};
void setExtDpyNum(int extDpyNum) { mExtDpyNum = extDpyNum;};
- bool post();
void setHPD(uint32_t startEnd);
void setEDIDMode(int resMode);
void setActionSafeDimension(int w, int h);
diff --git a/libgralloc/fb_priv.h b/libgralloc/fb_priv.h
index b096304..01af2e1 100644
--- a/libgralloc/fb_priv.h
+++ b/libgralloc/fb_priv.h
@@ -52,13 +52,6 @@
float fps;
uint32_t swapInterval;
uint32_t currentOffset;
- bool fbPostDone;
- pthread_mutex_t fbPostLock;
- //Condition to inform HWC that fb_post called
- pthread_cond_t fbPostCond;
- bool fbPanDone;
- pthread_mutex_t fbPanLock;
- pthread_cond_t fbPanCond;
};
diff --git a/libgralloc/framebuffer.cpp b/libgralloc/framebuffer.cpp
index cc16a5f..0335f5e 100644
--- a/libgralloc/framebuffer.cpp
+++ b/libgralloc/framebuffer.cpp
@@ -54,7 +54,6 @@
enum {
PAGE_FLIP = 0x00000001,
- LOCKED = 0x00000002
};
struct fb_context_t {
@@ -88,8 +87,8 @@
private_module_t* m =
reinterpret_cast<private_module_t*>(dev->common.module);
struct mdp_display_commit prim_commit;
+ prim_commit.wait_for_finish = 1;
memset(&prim_commit, 0, sizeof(struct mdp_display_commit));
- prim_commit.flags = MDP_DISPLAY_COMMIT_OVERLAY;
if (ioctl(m->framebuffer->fd, MSMFB_DISPLAY_COMMIT, &prim_commit) == -1) {
ALOGE("%s: MSMFB_DISPLAY_COMMIT for primary failed, str: %s",
__FUNCTION__, strerror(errno));
@@ -326,12 +325,6 @@
module->framebuffer->base = intptr_t(vaddr);
memset(vaddr, 0, fbSize);
module->currentOffset = 0;
- module->fbPostDone = false;
- pthread_mutex_init(&(module->fbPostLock), NULL);
- pthread_cond_init(&(module->fbPostCond), NULL);
- module->fbPanDone = false;
- pthread_mutex_init(&(module->fbPanLock), NULL);
- pthread_cond_init(&(module->fbPanCond), NULL);
return 0;
}
diff --git a/libgralloc/gpu.cpp b/libgralloc/gpu.cpp
index 292012b..8b9a6c5 100644
--- a/libgralloc/gpu.cpp
+++ b/libgralloc/gpu.cpp
@@ -52,77 +52,6 @@
}
-int gpu_context_t::gralloc_alloc_framebuffer_locked(size_t size, int usage,
- buffer_handle_t* pHandle)
-{
- private_module_t* m = reinterpret_cast<private_module_t*>(common.module);
-
- // we don't support framebuffer allocations with graphics heap flags
- if (usage & GRALLOC_HEAP_MASK) {
- return -EINVAL;
- }
-
- if (m->framebuffer == NULL) {
- ALOGE("%s: Invalid framebuffer", __FUNCTION__);
- return -EINVAL;
- }
-
- const uint32_t bufferMask = m->bufferMask;
- const uint32_t numBuffers = m->numBuffers;
- size_t bufferSize = m->finfo.line_length * m->info.yres;
-
- //adreno needs FB size to be page aligned
- bufferSize = roundUpToPageSize(bufferSize);
-
- if (numBuffers == 1) {
- // If we have only one buffer, we never use page-flipping. Instead,
- // we return a regular buffer which will be memcpy'ed to the main
- // screen when post is called.
- int newUsage = (usage & ~GRALLOC_USAGE_HW_FB) | GRALLOC_USAGE_HW_2D;
- return gralloc_alloc_buffer(bufferSize, newUsage, pHandle, BUFFER_TYPE_UI,
- m->fbFormat, m->info.xres, m->info.yres);
- }
-
- if (bufferMask >= ((1LU<<numBuffers)-1)) {
- // We ran out of buffers.
- return -ENOMEM;
- }
-
- // create a "fake" handle for it
- intptr_t vaddr = intptr_t(m->framebuffer->base);
- private_handle_t* hnd = new private_handle_t(
- dup(m->framebuffer->fd), bufferSize,
- private_handle_t::PRIV_FLAGS_USES_ION |
- private_handle_t::PRIV_FLAGS_FRAMEBUFFER,
- BUFFER_TYPE_UI, m->fbFormat, m->info.xres,
- m->info.yres);
-
- // find a free slot
- for (uint32_t i=0 ; i<numBuffers ; i++) {
- if ((bufferMask & (1LU<<i)) == 0) {
- m->bufferMask |= (1LU<<i);
- break;
- }
- vaddr += bufferSize;
- }
-
- hnd->base = vaddr;
- hnd->offset = vaddr - intptr_t(m->framebuffer->base);
- *pHandle = hnd;
- return 0;
-}
-
-
-int gpu_context_t::gralloc_alloc_framebuffer(size_t size, int usage,
- buffer_handle_t* pHandle)
-{
- private_module_t* m = reinterpret_cast<private_module_t*>(common.module);
- pthread_mutex_lock(&m->lock);
- int err = gralloc_alloc_framebuffer_locked(size, usage, pHandle);
- pthread_mutex_unlock(&m->lock);
- return err;
-}
-
int gpu_context_t::gralloc_alloc_buffer(size_t size, int usage,
buffer_handle_t* pHandle, int bufferType,
int format, int width, int height)
@@ -267,26 +196,20 @@
int gpu_context_t::free_impl(private_handle_t const* hnd) {
private_module_t* m = reinterpret_cast<private_module_t*>(common.module);
- if (hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER) {
- // free this buffer
- const size_t bufferSize = m->finfo.line_length * m->info.yres;
- int index = (hnd->base - m->framebuffer->base) / bufferSize;
- m->bufferMask &= ~(1<<index);
- } else {
- terminateBuffer(&m->base, const_cast<private_handle_t*>(hnd));
- IMemAlloc* memalloc = mAllocCtrl->getAllocator(hnd->flags);
- int err = memalloc->free_buffer((void*)hnd->base, (size_t) hnd->size,
- hnd->offset, hnd->fd);
- if(err)
- return err;
- // free the metadata space
- unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
- err = memalloc->free_buffer((void*)hnd->base_metadata,
- (size_t) size, hnd->offset_metadata,
- hnd->fd_metadata);
- if (err)
- return err;
- }
+
+ terminateBuffer(&m->base, const_cast<private_handle_t*>(hnd));
+ IMemAlloc* memalloc = mAllocCtrl->getAllocator(hnd->flags);
+ int err = memalloc->free_buffer((void*)hnd->base, (size_t) hnd->size,
+ hnd->offset, hnd->fd);
+ if(err)
+ return err;
+ // free the metadata space
+ unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
+ err = memalloc->free_buffer((void*)hnd->base_metadata,
+ (size_t) size, hnd->offset_metadata,
+ hnd->fd_metadata);
+ if (err)
+ return err;
delete hnd;
return 0;
diff --git a/libgralloc/gpu.h b/libgralloc/gpu.h
index 2986984..6826ffe 100644
--- a/libgralloc/gpu.h
+++ b/libgralloc/gpu.h
@@ -27,7 +27,7 @@
#include <cutils/ashmem.h>
#include "gralloc_priv.h"
-#include <fb_priv.h>
+#include "fb_priv.h"
namespace gralloc {
class IAllocController;
@@ -36,12 +36,6 @@
gpu_context_t(const private_module_t* module,
IAllocController* alloc_ctrl);
- int gralloc_alloc_framebuffer_locked(size_t size, int usage,
- buffer_handle_t* pHandle);
-
- int gralloc_alloc_framebuffer(size_t size, int usage,
- buffer_handle_t* pHandle);
-
int gralloc_alloc_buffer(size_t size, int usage,
buffer_handle_t* pHandle,
int bufferType, int format,
diff --git a/libhwcomposer/hwc.cpp b/libhwcomposer/hwc.cpp
index 30555fa..540040a 100644
--- a/libhwcomposer/hwc.cpp
+++ b/libhwcomposer/hwc.cpp
@@ -25,10 +25,9 @@
#include <cutils/atomic.h>
#include <EGL/egl.h>
#include <utils/Trace.h>
-
+#include <sys/ioctl.h>
#include <overlay.h>
#include <overlayRotator.h>
-#include <fb_priv.h>
#include <mdp_version.h>
#include "hwc_utils.h"
#include "hwc_video.h"
@@ -122,6 +121,17 @@
}
}
+static int display_commit(hwc_context_t *ctx, int dpy) {
+ struct mdp_display_commit commit_info;
+ memset(&commit_info, 0, sizeof(struct mdp_display_commit));
+ commit_info.flags = MDP_DISPLAY_COMMIT_OVERLAY;
+ if(ioctl(ctx->dpyAttr[dpy].fd, MSMFB_DISPLAY_COMMIT, &commit_info) == -1) {
+ ALOGE("%s: MSMFB_DISPLAY_COMMIT for primary failed", __FUNCTION__);
+ return -errno;
+ }
+ return 0;
+}
+
static int hwc_prepare_primary(hwc_composer_device_1 *dev,
hwc_display_contents_1_t *list) {
hwc_context_t* ctx = (hwc_context_t*)(dev);
@@ -217,8 +227,6 @@
{
int ret = 0;
hwc_context_t* ctx = (hwc_context_t*)(dev);
- private_module_t* m = reinterpret_cast<private_module_t*>(
- ctx->mFbDev->common.module);
pthread_mutex_lock(&ctx->vstate.lock);
switch(event) {
case HWC_EVENT_VSYNC:
@@ -243,8 +251,7 @@
{
ATRACE_CALL();
hwc_context_t* ctx = (hwc_context_t*)(dev);
- private_module_t* m = reinterpret_cast<private_module_t*>(
- ctx->mFbDev->common.module);
+
Locker::Autolock _l(ctx->mBlankLock);
int ret = 0;
ALOGD("%s: %s display: %d", __FUNCTION__,
@@ -255,13 +262,13 @@
ctx->mOverlay->configBegin();
ctx->mOverlay->configDone();
ctx->mRotMgr->clear();
- ret = ioctl(m->framebuffer->fd, FBIOBLANK, FB_BLANK_POWERDOWN);
+ ret = ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK,FB_BLANK_POWERDOWN);
if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected == true) {
// Surfaceflinger does not send Blank/unblank event to hwc
// for virtual display, handle it explicitly when blank for
// primary is invoked, so that any pipes unset get committed
- if (!ctx->mExtDisplay->post()) {
+ if (display_commit(ctx, HWC_DISPLAY_VIRTUAL) < 0) {
ret = -1;
ALOGE("%s:post failed for virtual display !!",
__FUNCTION__);
@@ -270,7 +277,7 @@
}
}
} else {
- ret = ioctl(m->framebuffer->fd, FBIOBLANK, FB_BLANK_UNBLANK);
+ ret = ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, FB_BLANK_UNBLANK);
if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected == true) {
ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = !blank;
}
@@ -278,12 +285,11 @@
break;
case HWC_DISPLAY_EXTERNAL:
if(blank) {
- // External post commits the changes to display
- // Call this on blank, so that any pipe unsets gets committed
- if (!ctx->mExtDisplay->post()) {
+ // call external framebuffer commit on blank,
+ // so that any pipe unsets gets committed
+ if (display_commit(ctx, dpy) < 0) {
ret = -1;
- ALOGE("%s:post failed for external display !! ",
- __FUNCTION__);
+ ALOGE("%s:post failed for external display !! ", __FUNCTION__);
}
} else {
}
@@ -311,8 +317,6 @@
int param, int* value)
{
hwc_context_t* ctx = (hwc_context_t*)(dev);
- private_module_t* m = reinterpret_cast<private_module_t*>(
- ctx->mFbDev->common.module);
int supported = HWC_DISPLAY_PRIMARY_BIT;
switch (param) {
@@ -320,10 +324,6 @@
// Not supported for now
value[0] = 0;
break;
- case HWC_VSYNC_PERIOD: //Not used for hwc > 1.1
- value[0] = m->fps;
- ALOGI("fps: %d", value[0]);
- break;
case HWC_DISPLAY_TYPES_SUPPORTED:
if(ctx->mMDP.hasOverlay)
supported |= HWC_DISPLAY_EXTERNAL_BIT;
@@ -336,6 +336,7 @@
}
+
static int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
ATRACE_CALL();
int ret = 0;
@@ -375,9 +376,10 @@
}
}
}
- if (ctx->mFbDev->post(ctx->mFbDev, fbLayer->handle)) {
- ALOGE("%s: ctx->mFbDev->post fail!", __FUNCTION__);
- ret = -1;
+
+ if (display_commit(ctx, dpy) < 0) {
+ ALOGE("%s: display commit fail!", __FUNCTION__);
+ return -1;
}
}
@@ -425,9 +427,10 @@
ret = -1;
}
}
- if (!ctx->mExtDisplay->post()) {
- ALOGE("%s: ctx->mExtDisplay->post fail!", __FUNCTION__);
- ret = -1;
+
+ if (display_commit(ctx, dpy) < 0) {
+ ALOGE("%s: display commit fail!", __FUNCTION__);
+ return -1;
}
}
diff --git a/libhwcomposer/hwc_fbupdate.cpp b/libhwcomposer/hwc_fbupdate.cpp
index e79523d..f7fce09 100644
--- a/libhwcomposer/hwc_fbupdate.cpp
+++ b/libhwcomposer/hwc_fbupdate.cpp
@@ -20,7 +20,6 @@
#define DEBUG_FBUPDATE 0
#include <gralloc_priv.h>
-#include <fb_priv.h>
#include "hwc_fbupdate.h"
namespace qhwc {
diff --git a/libhwcomposer/hwc_utils.cpp b/libhwcomposer/hwc_utils.cpp
index 11f7dc5..496dc21 100644
--- a/libhwcomposer/hwc_utils.cpp
+++ b/libhwcomposer/hwc_utils.cpp
@@ -23,7 +23,6 @@
#include <EGL/egl.h>
#include <cutils/properties.h>
#include <gralloc_priv.h>
-#include <fb_priv.h>
#include <overlay.h>
#include <overlayRotator.h>
#include "hwc_utils.h"
@@ -46,25 +45,59 @@
namespace qhwc {
-// Opens Framebuffer device
-static void openFramebufferDevice(hwc_context_t *ctx)
+static int openFramebufferDevice(hwc_context_t *ctx)
{
- hw_module_t const *module;
- if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module) == 0) {
- framebuffer_open(module, &(ctx->mFbDev));
- private_module_t* m = reinterpret_cast<private_module_t*>(
- ctx->mFbDev->common.module);
- //xres, yres may not be 32 aligned
- ctx->dpyAttr[HWC_DISPLAY_PRIMARY].stride = m->finfo.line_length /
- (m->info.xres/8);
- ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres = m->info.xres;
- ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres = m->info.yres;
- ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xdpi = ctx->mFbDev->xdpi;
- ctx->dpyAttr[HWC_DISPLAY_PRIMARY].ydpi = ctx->mFbDev->ydpi;
- ctx->dpyAttr[HWC_DISPLAY_PRIMARY].vsync_period =
- 1000000000l / ctx->mFbDev->fps;
- ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd = openFb(HWC_DISPLAY_PRIMARY);
+ struct fb_fix_screeninfo finfo;
+ struct fb_var_screeninfo info;
+
+ int fb_fd = openFb(HWC_DISPLAY_PRIMARY);
+
+ if (ioctl(fb_fd, FBIOGET_VSCREENINFO, &info) == -1)
+ return -errno;
+
+ if (int(info.width) <= 0 || int(info.height) <= 0) {
+ // the driver doesn't return that information
+ // default to 160 dpi
+ info.width = ((info.xres * 25.4f)/160.0f + 0.5f);
+ info.height = ((info.yres * 25.4f)/160.0f + 0.5f);
}
+
+ float xdpi = (info.xres * 25.4f) / info.width;
+ float ydpi = (info.yres * 25.4f) / info.height;
+
+#ifdef MSMFB_METADATA_GET
+ struct msmfb_metadata metadata;
+ memset(&metadata, 0 , sizeof(metadata));
+ metadata.op = metadata_op_frame_rate;
+
+ if (ioctl(fb_fd, MSMFB_METADATA_GET, &metadata) == -1) {
+ ALOGE("Error retrieving panel frame rate");
+ return -errno;
+ }
+
+ float fps = metadata.data.panel_frame_rate;
+#else
+ //XXX: Remove reserved field usage on all baselines
+ //The reserved[3] field is used to store FPS by the driver.
+ float fps = info.reserved[3] & 0xFF;
+#endif
+
+ if (ioctl(fb_fd, FBIOGET_FSCREENINFO, &finfo) == -1)
+ return -errno;
+
+ if (finfo.smem_len <= 0)
+ return -errno;
+
+ ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd = fb_fd;
+ //xres, yres may not be 32 aligned
+ ctx->dpyAttr[HWC_DISPLAY_PRIMARY].stride = finfo.line_length /(info.xres/8);
+ ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres = info.xres;
+ ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres = info.yres;
+ ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xdpi = xdpi;
+ ctx->dpyAttr[HWC_DISPLAY_PRIMARY].ydpi = ydpi;
+ ctx->dpyAttr[HWC_DISPLAY_PRIMARY].vsync_period = 1000000000l / fps;
+
+ return 0;
}
void initContext(hwc_context_t *ctx)
@@ -143,9 +176,7 @@
}
}
- if(ctx->mFbDev) {
- framebuffer_close(ctx->mFbDev);
- ctx->mFbDev = NULL;
+ if(ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd) {
close(ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd);
ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd = -1;
}
diff --git a/libhwcomposer/hwc_utils.h b/libhwcomposer/hwc_utils.h
index 67745f4..7221c13 100644
--- a/libhwcomposer/hwc_utils.h
+++ b/libhwcomposer/hwc_utils.h
@@ -29,6 +29,7 @@
#include <utils/String8.h>
#include "qdMetaData.h"
#include <overlayUtils.h>
+#include <linux/fb.h>
#define ALIGN_TO(x, align) (((x) + ((align)-1)) & ~((align)-1))
#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true ))
@@ -44,7 +45,6 @@
//Fwrd decls
struct hwc_context_t;
-struct framebuffer_device_t;
namespace ovutils = overlay::utils;
@@ -262,8 +262,6 @@
struct hwc_context_t {
hwc_composer_device_1_t device;
const hwc_procs_t* proc;
- //Framebuffer device
- framebuffer_device_t *mFbDev;
//CopyBit objects
qhwc::CopyBit *mCopyBit[MAX_DISPLAYS];
diff --git a/liboverlay/overlayUtils.cpp b/liboverlay/overlayUtils.cpp
index 4cc7a37..2eed1e9 100644
--- a/liboverlay/overlayUtils.cpp
+++ b/liboverlay/overlayUtils.cpp
@@ -32,7 +32,6 @@
#include <linux/msm_mdp.h>
#include <cutils/properties.h>
#include "gralloc_priv.h"
-#include "fb_priv.h"
#include "overlayUtils.h"
#include "mdpWrapper.h"
#include "mdp_version.h"