libhwcomposer: keep window 2 open

Window 2 is used to query global info about the LCD.

Kanged from patch for aries by Greg Hackmann <ghackmann@google.com>

Change-Id: Idf754d4536337d6c06652c1d0c744dc7c0936b15
tirimbino
codeworkx 12 years ago
parent 8b9deaf74e
commit 39aefd0fc4
  1. 31
      exynos4/hal/libhwcomposer/SecHWC.cpp
  2. 27
      exynos4/hal/libhwcomposer/SecHWCUtils.cpp
  3. 4
      exynos4/hal/libhwcomposer/SecHWCUtils.h

@ -927,7 +927,7 @@ static int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy,
switch (event) { switch (event) {
case HWC_EVENT_VSYNC: case HWC_EVENT_VSYNC:
int val = !!enabled; int val = !!enabled;
int err = ioctl(ctx->win[0].fd, S3CFB_SET_VSYNC_INT, &val); int err = ioctl(ctx->global_lcd_win.fd, S3CFB_SET_VSYNC_INT, &val);
if (err < 0) if (err < 0)
return -errno; return -errno;
@ -1022,6 +1022,11 @@ static int hwc_device_close(struct hw_device_t *dev)
ret = -1; ret = -1;
} }
if (window_close(&ctx->global_lcd_win) < 0) {
SEC_HWC_Log(HWC_LOG_ERROR, "%s::window_close() fail", __func__);
ret = -1;
}
for (i = 0; i < NUM_OF_WIN; i++) { for (i = 0; i < NUM_OF_WIN; i++) {
if (window_close(&ctx->win[i]) < 0) if (window_close(&ctx->win[i]) < 0)
SEC_HWC_Log(HWC_LOG_DEBUG, "%s::window_close() fail", __func__); SEC_HWC_Log(HWC_LOG_DEBUG, "%s::window_close() fail", __func__);
@ -1061,7 +1066,7 @@ static int hwc_device_open(const struct hw_module_t* module, const char* name,
dev->device.prepare = hwc_prepare; dev->device.prepare = hwc_prepare;
dev->device.set = hwc_set; dev->device.set = hwc_set;
dev->device.eventControl = hwc_eventControl; dev->device.eventControl = hwc_eventControl;
dev->device.blank = hwc_blank; dev->device.blank = hwc_blank;
dev->device.query = hwc_query; dev->device.query = hwc_query;
dev->device.registerProcs = hwc_registerProcs; dev->device.registerProcs = hwc_registerProcs;
*device = &dev->device.common; *device = &dev->device.common;
@ -1069,17 +1074,24 @@ static int hwc_device_open(const struct hw_module_t* module, const char* name,
//initializing //initializing
memset(&(dev->fimc), 0, sizeof(s5p_fimc_t)); memset(&(dev->fimc), 0, sizeof(s5p_fimc_t));
/* open WIN0 & WIN1 here */ /* open WIN0 & WIN1 here */
for (int i = 0; i < NUM_OF_WIN; i++) { for (int i = 0; i < NUM_OF_WIN; i++) {
if (window_open(&(dev->win[i]), i) < 0) { if (window_open(&(dev->win[i]), i) < 0) {
SEC_HWC_Log(HWC_LOG_ERROR, SEC_HWC_Log(HWC_LOG_ERROR,
"%s:: Failed to open window %d device ", __func__, i); "%s:: Failed to open window %d device ", __func__, i);
status = -EINVAL; status = -EINVAL;
goto err; goto err;
} }
} }
/* open window 2, used to query global LCD info */
if (window_open(&dev->global_lcd_win, 2) < 0) {
SEC_HWC_Log(HWC_LOG_ERROR, "%s:: Failed to open window 2 device ", __func__);
status = -EINVAL;
goto err;
}
if (window_get_global_lcd_info(dev->win[0].fd, &dev->lcd_info) < 0) { if (window_get_global_lcd_info(dev) < 0) {
SEC_HWC_Log(HWC_LOG_ERROR, SEC_HWC_Log(HWC_LOG_ERROR,
"%s::window_get_global_lcd_info is failed : %s", "%s::window_get_global_lcd_info is failed : %s",
__func__, strerror(errno)); __func__, strerror(errno));
@ -1152,6 +1164,9 @@ err:
if (destroyFimc(&dev->fimc) < 0) if (destroyFimc(&dev->fimc) < 0)
SEC_HWC_Log(HWC_LOG_ERROR, "%s::destroyFimc() fail", __func__); SEC_HWC_Log(HWC_LOG_ERROR, "%s::destroyFimc() fail", __func__);
if (window_close(&dev->global_lcd_win) < 0)
SEC_HWC_Log(HWC_LOG_ERROR, "%s::window_close() fail", __func__);
for (int i = 0; i < NUM_OF_WIN; i++) { for (int i = 0; i < NUM_OF_WIN; i++) {
if (window_close(&dev->win[i]) < 0) if (window_close(&dev->win[i]) < 0)
SEC_HWC_Log(HWC_LOG_DEBUG, "%s::window_close() fail", __func__); SEC_HWC_Log(HWC_LOG_DEBUG, "%s::window_close() fail", __func__);

@ -105,6 +105,15 @@ int window_open(struct hwc_win_info_t *win, int id)
case 1: case 1:
real_id = 4; real_id = 4;
break; break;
case 2:
real_id = 0;
break;
case 3:
real_id = 1;
break;
case 4:
real_id = 2;
break;
default: default:
SEC_HWC_Log(HWC_LOG_ERROR, "%s::id(%d) is weird", __func__, id); SEC_HWC_Log(HWC_LOG_ERROR, "%s::id(%d) is weird", __func__, id);
goto error; goto error;
@ -272,16 +281,26 @@ int window_hide(struct hwc_win_info_t *win)
return 0; return 0;
} }
int window_get_global_lcd_info(int fd, struct fb_var_screeninfo *lcd_info) int window_get_global_lcd_info(struct hwc_context_t *ctx)
{ {
if (ioctl(fd, FBIOGET_VSCREENINFO, lcd_info) < 0) { if (ioctl(ctx->global_lcd_win.fd, FBIOGET_VSCREENINFO, &ctx->lcd_info) < 0) {
SEC_HWC_Log(HWC_LOG_ERROR, "FBIOGET_VSCREENINFO failed : %s", SEC_HWC_Log(HWC_LOG_ERROR, "FBIOGET_VSCREENINFO failed : %s",
strerror(errno)); strerror(errno));
return -1; return -1;
} }
SEC_HWC_Log(HWC_LOG_DEBUG, "%s:: Default LCD x(%d),y(%d)", if (ctx->lcd_info.xres == 0) {
__func__, lcd_info->xres, lcd_info->yres); SEC_HWC_Log(HWC_LOG_ERROR, "ATTENTION: XRES IS 0");
}
if (ctx->lcd_info.yres == 0) {
SEC_HWC_Log(HWC_LOG_ERROR, "ATTENTION: YRES IS 0");
}
if (ctx->lcd_info.bits_per_pixel == 0) {
SEC_HWC_Log(HWC_LOG_ERROR, "ATTENTION: BPP IS 0");
}
return 0; return 0;
} }

@ -78,6 +78,7 @@
#ifdef SAMSUNG_EXYNOS4210 #ifdef SAMSUNG_EXYNOS4210
#define PP_DEVICE_DEV_NAME "/dev/video1" #define PP_DEVICE_DEV_NAME "/dev/video1"
#endif #endif
/* cacheable configuration */ /* cacheable configuration */
#define V4L2_CID_CACHEABLE (V4L2_CID_BASE+40) #define V4L2_CID_CACHEABLE (V4L2_CID_BASE+40)
@ -156,6 +157,7 @@ struct hwc_context_t {
/* our private state goes below here */ /* our private state goes below here */
struct hwc_win_info_t win[NUM_OF_WIN]; struct hwc_win_info_t win[NUM_OF_WIN];
struct hwc_win_info_t global_lcd_win;
#ifdef SKIP_DUMMY_UI_LAY_DRAWING #ifdef SKIP_DUMMY_UI_LAY_DRAWING
struct hwc_ui_lay_info win_virt[NUM_OF_DUMMY_WIN]; struct hwc_ui_lay_info win_virt[NUM_OF_DUMMY_WIN];
int fb_lay_skip_initialized; int fb_lay_skip_initialized;
@ -278,7 +280,7 @@ int window_get_info (struct hwc_win_info_t *win, int win_num);
int window_pan_display(struct hwc_win_info_t *win); int window_pan_display(struct hwc_win_info_t *win);
int window_show (struct hwc_win_info_t *win); int window_show (struct hwc_win_info_t *win);
int window_hide (struct hwc_win_info_t *win); int window_hide (struct hwc_win_info_t *win);
int window_get_global_lcd_info(int fd, struct fb_var_screeninfo *lcd_info); int window_get_global_lcd_info(struct hwc_context_t *ctx);
int createFimc (s5p_fimc_t *fimc); int createFimc (s5p_fimc_t *fimc);
int destroyFimc(s5p_fimc_t *fimc); int destroyFimc(s5p_fimc_t *fimc);

Loading…
Cancel
Save