Merge "display: Remove framebuffer HAL usage"
This commit is contained in:
committed by
Gerrit - the friendly Code Review server
commit
dc7e3fe018
@@ -683,25 +683,6 @@ bool ExternalDisplay::writeHPDOption(int userOption) const
|
||||
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;
|
||||
|
||||
@@ -47,7 +47,6 @@ public:
|
||||
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);
|
||||
|
||||
@@ -52,13 +52,6 @@ struct private_module_t {
|
||||
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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -54,7 +54,6 @@ static inline int max(int a, int b) {
|
||||
|
||||
enum {
|
||||
PAGE_FLIP = 0x00000001,
|
||||
LOCKED = 0x00000002
|
||||
};
|
||||
|
||||
struct fb_context_t {
|
||||
@@ -88,8 +87,8 @@ static int fb_post(struct framebuffer_device_t* dev, buffer_handle_t buffer)
|
||||
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 @@ int mapFrameBufferLocked(struct private_module_t* module)
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -52,77 +52,6 @@ gpu_context_t::gpu_context_t(const private_module_t* module,
|
||||
|
||||
}
|
||||
|
||||
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,12 +196,7 @@ int gpu_context_t::alloc_impl(int w, int h, int format, int usage,
|
||||
|
||||
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,
|
||||
@@ -286,7 +210,6 @@ int gpu_context_t::free_impl(private_handle_t const* hnd) {
|
||||
hnd->fd_metadata);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
delete hnd;
|
||||
return 0;
|
||||
|
||||
@@ -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 @@ class gpu_context_t : public alloc_device_t {
|
||||
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,
|
||||
|
||||
@@ -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 void reset_layer_prop(hwc_context_t* ctx, int dpy) {
|
||||
}
|
||||
}
|
||||
|
||||
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 @@ static int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy,
|
||||
{
|
||||
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 @@ static int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank)
|
||||
{
|
||||
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 @@ static int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank)
|
||||
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 @@ static int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank)
|
||||
}
|
||||
}
|
||||
} 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 @@ static int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank)
|
||||
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 @@ static int hwc_query(struct hwc_composer_device_1* dev,
|
||||
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 @@ static int hwc_query(struct hwc_composer_device_1* dev,
|
||||
// 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_query(struct hwc_composer_device_1* dev,
|
||||
|
||||
}
|
||||
|
||||
|
||||
static int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
|
||||
ATRACE_CALL();
|
||||
int ret = 0;
|
||||
@@ -375,9 +376,10 @@ static int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
|
||||
}
|
||||
}
|
||||
}
|
||||
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 @@ static int hwc_set_external(hwc_context_t *ctx,
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
|
||||
#define DEBUG_FBUPDATE 0
|
||||
#include <gralloc_priv.h>
|
||||
#include <fb_priv.h>
|
||||
#include "hwc_fbupdate.h"
|
||||
|
||||
namespace qhwc {
|
||||
|
||||
@@ -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 ovutils = overlay::utils;
|
||||
|
||||
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 @@ void closeContext(hwc_context_t *ctx)
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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 vsync_state {
|
||||
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];
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user