summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorespenfjo <espen@mrfjo.org>2012-12-01 18:52:36 +0100
committercodeworkx <codeworkx@cyanogenmod.org>2012-12-01 18:52:36 +0100
commit34f9d5d69265777b8bb27f98cfa9855494e1266a (patch)
tree4dd86a5d124607be34003af1c7ead90bed54c693
parent1030fe0ae8322353c0e376c7ecfbd0db32636668 (diff)
downloadhardware_samsung-34f9d5d69265777b8bb27f98cfa9855494e1266a.zip
hardware_samsung-34f9d5d69265777b8bb27f98cfa9855494e1266a.tar.gz
hardware_samsung-34f9d5d69265777b8bb27f98cfa9855494e1266a.tar.bz2
exynos4: libhwcomposer: update for new api version
-rw-r--r--exynos4/hal/libhwcomposer/Android.mk14
-rw-r--r--exynos4/hal/libhwcomposer/SecHWC.cpp542
-rw-r--r--exynos4/hal/libhwcomposer/SecHWCUtils.cpp897
-rw-r--r--exynos4/hal/libhwcomposer/SecHWCUtils.h144
4 files changed, 437 insertions, 1160 deletions
diff --git a/exynos4/hal/libhwcomposer/Android.mk b/exynos4/hal/libhwcomposer/Android.mk
index 902a72f..ae93dc5 100644
--- a/exynos4/hal/libhwcomposer/Android.mk
+++ b/exynos4/hal/libhwcomposer/Android.mk
@@ -23,12 +23,8 @@ LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
LOCAL_SHARED_LIBRARIES := liblog libcutils libEGL \
libGLESv1_CM
-ifeq ($(BOARD_USE_V4L2_ION),true)
-LOCAL_SHARED_LIBRARIES += libion
-endif
-
LOCAL_C_INCLUDES := \
- $(LOCAL_PATH)/../include
+ $(TARGET_HAL_PATH)/include
LOCAL_SRC_FILES := SecHWCLog.cpp SecHWCUtils.cpp SecHWC.cpp
@@ -75,14 +71,6 @@ LOCAL_CFLAGS += -DSTD_1080P
endif
endif
-ifeq ($(BOARD_USE_V4L2),true)
-LOCAL_CFLAGS += -DBOARD_USE_V4L2
-endif
-
-ifeq ($(BOARD_USE_V4L2_ION),true)
-LOCAL_CFLAGS += -DBOARD_USE_V4L2_ION
-endif
-
LOCAL_MODULE := hwcomposer.$(TARGET_BOARD_PLATFORM)
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)
diff --git a/exynos4/hal/libhwcomposer/SecHWC.cpp b/exynos4/hal/libhwcomposer/SecHWC.cpp
index b76a885..704e5b8 100644
--- a/exynos4/hal/libhwcomposer/SecHWC.cpp
+++ b/exynos4/hal/libhwcomposer/SecHWC.cpp
@@ -27,6 +27,8 @@
#include <cutils/atomic.h>
#include <EGL/egl.h>
+#include <sys/prctl.h>
+#include <fcntl.h>
#include "SecHWCUtils.h"
@@ -63,7 +65,7 @@ static struct hw_module_methods_t hwc_module_methods = {
hwc_module_t HAL_MODULE_INFO_SYM = {
common: {
tag: HARDWARE_MODULE_TAG,
- version_major: 1,
+ version_major: 2,
version_minor: 0,
id: HWC_HARDWARE_MODULE_ID,
name: "Samsung S5PC21X hwcomposer module",
@@ -74,8 +76,8 @@ hwc_module_t HAL_MODULE_INFO_SYM = {
/*****************************************************************************/
-static void dump_layer(hwc_layer_t const* l) {
- ALOGD("\ttype=%d, flags=%08x, handle=%p, tr=%02x, blend=%04x, "
+static void dump_layer(hwc_layer_1_t const* l) {
+ SEC_HWC_Log(HWC_LOG_DEBUG,"\ttype=%d, flags=%08x, handle=%p, tr=%02x, blend=%04x, "
"{%d,%d,%d,%d}, {%d,%d,%d,%d}",
l->compositionType, l->flags, l->handle, l->transform, l->blending,
l->sourceCrop.left,
@@ -88,7 +90,7 @@ static void dump_layer(hwc_layer_t const* l) {
l->displayFrame.bottom);
}
-void calculate_rect(struct hwc_win_info_t *win, hwc_layer_t *cur,
+void calculate_rect(struct hwc_win_info_t *win, hwc_layer_1_t *cur,
sec_rect *rect)
{
rect->x = cur->displayFrame.left;
@@ -118,7 +120,7 @@ void calculate_rect(struct hwc_win_info_t *win, hwc_layer_t *cur,
}
}
-static int set_src_dst_img_rect(hwc_layer_t *cur,
+static int set_src_dst_img_rect(hwc_layer_1_t *cur,
struct hwc_win_info_t *win,
struct sec_img *src_img,
struct sec_img *dst_img,
@@ -194,62 +196,62 @@ static int set_src_dst_img_rect(hwc_layer_t *cur,
src_rect->x =
(0 - cur->displayFrame.left)
*(src_img->w)
- /(cur->displayFrame.right - cur->displayFrame.left + 1);
- if (cur->displayFrame.right + 1 > win->lcd_info.xres) {
+ /(cur->displayFrame.right - cur->displayFrame.left);
+ if (cur->displayFrame.right > win->lcd_info.xres) {
src_rect->w =
- (cur->sourceCrop.right - cur->sourceCrop.left + 1) -
+ (cur->sourceCrop.right - cur->sourceCrop.left) -
src_rect->x -
(cur->displayFrame.right - win->lcd_info.xres)
*(src_img->w)
- /(cur->displayFrame.right - cur->displayFrame.left + 1);
+ /(cur->displayFrame.right - cur->displayFrame.left);
} else {
src_rect->w =
- (cur->sourceCrop.right - cur->sourceCrop.left + 1) -
+ (cur->sourceCrop.right - cur->sourceCrop.left) -
src_rect->x;
}
} else {
src_rect->x = cur->sourceCrop.left;
- if (cur->displayFrame.right + 1 > win->lcd_info.xres) {
+ if (cur->displayFrame.right > win->lcd_info.xres) {
src_rect->w =
- (cur->sourceCrop.right - cur->sourceCrop.left + 1) -
+ (cur->sourceCrop.right - cur->sourceCrop.left) -
src_rect->x -
(cur->displayFrame.right - win->lcd_info.xres)
*(src_img->w)
- /(cur->displayFrame.right - cur->displayFrame.left + 1);
+ /(cur->displayFrame.right - cur->displayFrame.left);
} else {
src_rect->w =
- (cur->sourceCrop.right - cur->sourceCrop.left + 1);
+ (cur->sourceCrop.right - cur->sourceCrop.left);
}
}
if (cur->displayFrame.top < 0) {
src_rect->y =
(0 - cur->displayFrame.top)
*(src_img->h)
- /(cur->displayFrame.bottom - cur->displayFrame.top + 1);
- if (cur->displayFrame.bottom + 1 > win->lcd_info.yres) {
+ /(cur->displayFrame.bottom - cur->displayFrame.top);
+ if (cur->displayFrame.bottom > win->lcd_info.yres) {
src_rect->h =
- (cur->sourceCrop.bottom - cur->sourceCrop.top + 1) -
+ (cur->sourceCrop.bottom - cur->sourceCrop.top) -
src_rect->y -
(cur->displayFrame.bottom - win->lcd_info.yres)
*(src_img->h)
- /(cur->displayFrame.bottom - cur->displayFrame.top + 1);
+ /(cur->displayFrame.bottom - cur->displayFrame.top);
} else {
src_rect->h =
- (cur->sourceCrop.bottom - cur->sourceCrop.top + 1) -
+ (cur->sourceCrop.bottom - cur->sourceCrop.top) -
src_rect->y;
}
} else {
src_rect->y = cur->sourceCrop.top;
- if (cur->displayFrame.bottom + 1 > win->lcd_info.yres) {
+ if (cur->displayFrame.bottom > win->lcd_info.yres) {
src_rect->h =
- (cur->sourceCrop.bottom - cur->sourceCrop.top + 1) -
+ (cur->sourceCrop.bottom - cur->sourceCrop.top) -
src_rect->y -
(cur->displayFrame.bottom - win->lcd_info.yres)
*(src_img->h)
- /(cur->displayFrame.bottom - cur->displayFrame.top + 1);
+ /(cur->displayFrame.bottom - cur->displayFrame.top);
} else {
src_rect->h =
- (cur->sourceCrop.bottom - cur->sourceCrop.top + 1);
+ (cur->sourceCrop.bottom - cur->sourceCrop.top);
}
}
@@ -301,7 +303,7 @@ static int set_src_dst_img_rect(hwc_layer_t *cur,
return 0;
}
-static int get_hwc_compos_decision(hwc_layer_t* cur, int iter, int win_cnt)
+static int get_hwc_compos_decision(hwc_layer_1_t* cur, int iter, int win_cnt)
{
if(cur->flags & HWC_SKIP_LAYER || !cur->handle) {
SEC_HWC_Log(HWC_LOG_DEBUG, "%s::is_skip_layer %d cur->handle %x ",
@@ -351,36 +353,6 @@ static int get_hwc_compos_decision(hwc_layer_t* cur, int iter, int win_cnt)
}
}
-#ifdef SUB_TITLES_HWC
- else if ((win_cnt > 0) &&
- (prev_handle->usage & GRALLOC_USAGE_EXTERNAL_DISP)) {
- switch (prev_handle->format) {
- case HAL_PIXEL_FORMAT_RGBA_8888:
- case HAL_PIXEL_FORMAT_RGBX_8888:
- case HAL_PIXEL_FORMAT_BGRA_8888:
- case HAL_PIXEL_FORMAT_RGB_888:
- case HAL_PIXEL_FORMAT_RGB_565:
- case HAL_PIXEL_FORMAT_RGBA_5551:
- case HAL_PIXEL_FORMAT_RGBA_4444:
- compositionType = HWC_OVERLAY;
- break;
- default:
- compositionType = HWC_FRAMEBUFFER;
- break;
- }
-
- SEC_HWC_Log(HWC_LOG_DEBUG, "2nd iter###%s:: compositionType %d bpp %d"
- " format %x src[%d %d %d %d] dst[%d %d %d %d] srcImg[%d %d]",
- __func__, compositionType, prev_handle->bpp,
- prev_handle->format,
- cur->sourceCrop.left, cur->sourceCrop.right,
- cur->sourceCrop.top, cur->sourceCrop.bottom,
- cur->displayFrame.left, cur->displayFrame.right,
- cur->displayFrame.top, cur->displayFrame.bottom,
- prev_handle->width, prev_handle->height);
- }
-#endif
-
SEC_HWC_Log(HWC_LOG_DEBUG,
"%s::compositionType(%d)=>0:FB,1:OVERLAY \r\n"
" format(0x%x),magic(0x%x),flags(%d),size(%d),offset(%d)"
@@ -404,7 +376,7 @@ static void reset_win_rect_info(hwc_win_info_t *win)
}
-static int assign_overlay_window(struct hwc_context_t *ctx, hwc_layer_t *cur,
+static int assign_overlay_window(struct hwc_context_t *ctx, hwc_layer_1_t *cur,
int win_idx, int layer_idx)
{
struct hwc_win_info_t *win;
@@ -453,15 +425,139 @@ static int assign_overlay_window(struct hwc_context_t *ctx, hwc_layer_t *cur,
return 0;
}
-static int hwc_prepare(hwc_composer_device_t *dev, hwc_layer_list_t* list)
+#ifdef SKIP_DUMMY_UI_LAY_DRAWING
+static void get_hwc_ui_lay_skipdraw_decision(struct hwc_context_t* ctx,
+ hwc_display_contents_1_t* list)
{
- struct hwc_context_t* ctx = (struct hwc_context_t*)dev;
- int overlay_win_cnt = 0;
- int compositionType = 0;
- int ret;
+ private_handle_t *prev_handle;
+ hwc_layer_1_t* cur;
+ int num_of_fb_lay_skip = 0;
+ int fb_lay_tot = ctx->num_of_fb_layer + ctx->num_of_fb_lay_skip;
+
+ if (fb_lay_tot > NUM_OF_DUMMY_WIN)
+ return;
+
+ if (fb_lay_tot < 1) {
+#ifdef GL_WA_OVLY_ALL
+ ctx->ui_skip_frame_cnt++;
+ if (ctx->ui_skip_frame_cnt >= THRES_FOR_SWAP) {
+ ctx->ui_skip_frame_cnt = 0;
+ ctx->num_of_fb_layer_prev = 1;
+ }
+#endif
+ return;
+ }
+
+ if (ctx->fb_lay_skip_initialized) {
+ for (int cnt = 0; cnt < fb_lay_tot; cnt++) {
+ cur = &list->hwLayers[ctx->win_virt[cnt].layer_index];
+ if (ctx->win_virt[cnt].layer_prev_buf == (uint32_t)cur->handle)
+ num_of_fb_lay_skip++;
+ }
+#ifdef GL_WA_OVLY_ALL
+ if (ctx->ui_skip_frame_cnt >= THRES_FOR_SWAP)
+ num_of_fb_lay_skip = 0;
+#endif
+ if (num_of_fb_lay_skip != fb_lay_tot) {
+ ctx->num_of_fb_layer = fb_lay_tot;
+ ctx->num_of_fb_lay_skip = 0;
+#ifdef GL_WA_OVLY_ALL
+ ctx->ui_skip_frame_cnt = 0;
+#endif
+ for (int cnt = 0; cnt < fb_lay_tot; cnt++) {
+ cur = &list->hwLayers[ctx->win_virt[cnt].layer_index];
+ ctx->win_virt[cnt].layer_prev_buf = (uint32_t)cur->handle;
+ cur->compositionType = HWC_FRAMEBUFFER;
+ ctx->win_virt[cnt].status = HWC_WIN_FREE;
+ }
+ } else {
+ ctx->num_of_fb_layer = 0;
+ ctx->num_of_fb_lay_skip = fb_lay_tot;
+#ifdef GL_WA_OVLY_ALL
+ ctx->ui_skip_frame_cnt++;
+#endif
+ for (int cnt = 0; cnt < fb_lay_tot; cnt++) {
+ cur = &list->hwLayers[ctx->win_virt[cnt].layer_index];
+ cur->compositionType = HWC_OVERLAY;
+ ctx->win_virt[cnt].status = HWC_WIN_RESERVED;
+ }
+ }
+ } else {
+ ctx->num_of_fb_lay_skip = 0;
+ for (int i = 0; i < list->numHwLayers ; i++) {
+ if(num_of_fb_lay_skip >= NUM_OF_DUMMY_WIN)
+ break;
+
+ cur = &list->hwLayers[i];
+ if (cur->handle) {
+ prev_handle = (private_handle_t *)(cur->handle);
+
+ switch (prev_handle->format) {
+ case HAL_PIXEL_FORMAT_RGBA_8888:
+ case HAL_PIXEL_FORMAT_BGRA_8888:
+ case HAL_PIXEL_FORMAT_RGBX_8888:
+ case HAL_PIXEL_FORMAT_RGB_565:
+ cur->compositionType = HWC_FRAMEBUFFER;
+ ctx->win_virt[num_of_fb_lay_skip].layer_prev_buf =
+ (uint32_t)cur->handle;
+ ctx->win_virt[num_of_fb_lay_skip].layer_index = i;
+ ctx->win_virt[num_of_fb_lay_skip].status = HWC_WIN_FREE;
+ num_of_fb_lay_skip++;
+ break;
+ default:
+ break;
+ }
+ } else {
+ cur->compositionType = HWC_FRAMEBUFFER;
+ }
+ }
+
+ if (num_of_fb_lay_skip == fb_lay_tot)
+ ctx->fb_lay_skip_initialized = 1;
+ }
- //if geometry is not changed, there is no need to do any work here
- if (!list || (!(list->flags & HWC_GEOMETRY_CHANGED)))
+ return;
+
+}
+#endif
+
+static int hwc_prepare(hwc_composer_device_1_t *dev, size_t numDisplays, hwc_display_contents_1_t** displays)
+{
+
+ for (uint32_t i = 0; i < numDisplays; i++) {
+ hwc_display_contents_1_t *list = displays[i];
+ struct hwc_context_t* ctx = (struct hwc_context_t*)dev;
+ int overlay_win_cnt = 0;
+ int compositionType = 0;
+ int ret;
+#if defined(BOARD_USES_HDMI)
+ android::SecHdmiClient *mHdmiClient = android::SecHdmiClient::getInstance();
+ int hdmi_cable_status = (int)mHdmiClient->getHdmiCableStatus();
+
+ ctx->hdmi_cable_status = hdmi_cable_status;
+#endif
+
+#ifdef SKIP_DUMMY_UI_LAY_DRAWING
+ if ((list && (!(list->flags & HWC_GEOMETRY_CHANGED))) &&
+ (ctx->num_of_hwc_layer > 0)) {
+ get_hwc_ui_lay_skipdraw_decision(ctx, list);
+ return 0;
+ }
+ ctx->fb_lay_skip_initialized = 0;
+ ctx->num_of_fb_lay_skip = 0;
+#ifdef GL_WA_OVLY_ALL
+ ctx->ui_skip_frame_cnt = 0;
+#endif
+
+ for (int i = 0; i < NUM_OF_DUMMY_WIN; i++) {
+ ctx->win_virt[i].layer_prev_buf = 0;
+ ctx->win_virt[i].layer_index = -1;
+ ctx->win_virt[i].status = HWC_WIN_FREE;
+ }
+#endif
+
+ //if geometry is not changed, there is no need to do any work here
+ if (!list || (!(list->flags & HWC_GEOMETRY_CHANGED)))
return 0;
//all the windows are free here....
@@ -473,9 +569,27 @@ static int hwc_prepare(hwc_composer_device_t *dev, hwc_layer_list_t* list)
ctx->num_of_hwc_layer = 0;
ctx->num_of_fb_layer = 0;
ctx->num_2d_blit_layer = 0;
+ ctx->num_of_ext_disp_video_layer = 0;
+
+ for (int i = 0; i < list->numHwLayers; i++) {
+ hwc_layer_1_t *cur = &list->hwLayers[i];
+ private_handle_t *prev_handle = NULL;
+ if (cur->handle) {
+ prev_handle = (private_handle_t *)(cur->handle);
+ SEC_HWC_Log(HWC_LOG_DEBUG, "prev_handle->usage = %d", prev_handle->usage);
+ if (prev_handle->usage & GRALLOC_USAGE_EXTERNAL_DISP) {
+ ctx->num_of_ext_disp_layer++;
+ if ((prev_handle->usage & GRALLOC_USAGE_EXTERNAL_DISP) ||
+ check_yuv_format((unsigned int)prev_handle->format) == 1) {
+ ctx->num_of_ext_disp_video_layer++;
+ }
+ }
+ }
+ }
for (int i = 0; i < list->numHwLayers ; i++) {
- hwc_layer_t* cur = &list->hwLayers[i];
+ hwc_layer_1_t* cur = &list->hwLayers[i];
+ private_handle_t *prev_handle = (private_handle_t *)(cur->handle);
if (overlay_win_cnt < NUM_OF_WIN) {
compositionType = get_hwc_compos_decision(cur, 0, overlay_win_cnt);
@@ -486,7 +600,7 @@ static int hwc_prepare(hwc_composer_device_t *dev, hwc_layer_list_t* list)
} else {
ret = assign_overlay_window(ctx, cur, overlay_win_cnt, i);
if (ret != 0) {
- ALOGE("assign_overlay_window fail, change to frambuffer");
+ SEC_HWC_Log(HWC_LOG_ERROR, "assign_overlay_window fail, change to frambuffer");
cur->compositionType = HWC_FRAMEBUFFER;
ctx->num_of_fb_layer++;
continue;
@@ -501,32 +615,29 @@ static int hwc_prepare(hwc_composer_device_t *dev, hwc_layer_list_t* list)
cur->compositionType = HWC_FRAMEBUFFER;
ctx->num_of_fb_layer++;
}
- }
-
-#ifdef SUB_TITLES_HWC
- for (int i = 0; i < list->numHwLayers ; i++) {
- if (overlay_win_cnt < NUM_OF_WIN) {
- hwc_layer_t* cur = &list->hwLayers[i];
- if (get_hwc_compos_decision(cur, 1, overlay_win_cnt) == HWC_OVERLAY) {
- ret = assign_overlay_window(ctx, cur, overlay_win_cnt, i);
- if (ret == 0) {
- cur->compositionType = HWC_OVERLAY;
- cur->hints = HWC_HINT_CLEAR_FB;
- overlay_win_cnt++;
- ctx->num_of_hwc_layer++;
- ctx->num_of_fb_layer--;
- ctx->num_2d_blit_layer = 1;
- }
+#if defined(BOARD_USES_HDMI)
+ SEC_HWC_Log(HWC_LOG_DEBUG, "ext disp vid = %d, cable status = %d, composition type = %d",
+ ctx->num_of_ext_disp_video_layer, ctx->hdmi_cable_status, compositionType);
+ if (ctx->num_of_ext_disp_video_layer >= 2) {
+ if ((ctx->hdmi_cable_status) &&
+ (compositionType == HWC_OVERLAY) &&
+ (prev_handle->usage & GRALLOC_USAGE_EXTERNAL_DISP)) {
+ cur->compositionType = HWC_FRAMEBUFFER;
+ ctx->num_of_hwc_layer--;
+ overlay_win_cnt--;
+ ctx->num_of_fb_layer++;
+ cur->hints = 0;
}
}
- else
- break;
- }
#endif
+ }
#if defined(BOARD_USES_HDMI)
- android::SecHdmiClient *mHdmiClient = android::SecHdmiClient::getInstance();
+ mHdmiClient = android::SecHdmiClient::getInstance();
mHdmiClient->setHdmiHwcLayer(ctx->num_of_hwc_layer);
+ if (ctx->num_of_ext_disp_video_layer > 1) {
+ mHdmiClient->setExtDispLayerNum(0);
+ }
#endif
if (list->numHwLayers != (ctx->num_of_fb_layer + ctx->num_of_hwc_layer))
@@ -542,27 +653,27 @@ static int hwc_prepare(hwc_composer_device_t *dev, hwc_layer_list_t* list)
reset_win_rect_info(&ctx->win[i]);
}
}
-
+ }
return 0;
}
-static int hwc_set(hwc_composer_device_t *dev,
- hwc_display_t dpy,
- hwc_surface_t sur,
- hwc_layer_list_t* list)
+static int hwc_set(hwc_composer_device_1_t *dev,
+ size_t numDisplays,
+ hwc_display_contents_1_t** displays)
{
struct hwc_context_t *ctx = (struct hwc_context_t *)dev;
int skipped_window_mask = 0;
- hwc_layer_t* cur;
+ hwc_layer_1_t* cur;
struct hwc_win_info_t *win;
int ret;
int pmem_phyaddr;
- static int egl_check;
- int egl_run = 0;
struct sec_img src_img;
struct sec_img dst_img;
struct sec_rect src_work_rect;
struct sec_rect dst_work_rect;
+ bool need_swap_buffers = ctx->num_of_fb_layer > 0;
+ for (uint32_t i = 0; i < numDisplays; i++) {
+ hwc_display_contents_1_t* list = displays[i];
memset(&src_img, 0, sizeof(src_img));
memset(&dst_img, 0, sizeof(dst_img));
@@ -582,14 +693,45 @@ static int hwc_set(hwc_composer_device_t *dev,
ctx->win[i].status = HWC_WIN_FREE;
}
ctx->num_of_hwc_layer = 0;
+ need_swap_buffers = true;
- if (sur == NULL && dpy == NULL)
+ if (list->sur == NULL && list->dpy == NULL) {
+#ifdef SKIP_DUMMY_UI_LAY_DRAWING
+ ctx->fb_lay_skip_initialized = 0;
+#endif
return HWC_EGL_ERROR;
+ }
}
if(ctx->num_of_hwc_layer > NUM_OF_WIN)
ctx->num_of_hwc_layer = NUM_OF_WIN;
+ /*
+ * H/W composer documentation states:
+ * There is an implicit layer containing opaque black
+ * pixels behind all the layers in the list.
+ * It is the responsibility of the hwcomposer module to make
+ * sure black pixels are output (or blended from).
+ *
+ * Since we're using a blitter, we need to erase the frame-buffer when
+ * switching to all-overlay mode.
+ *
+ */
+ if (ctx->num_of_hwc_layer &&
+ ctx->num_of_fb_layer==0 && ctx->num_of_fb_layer_prev) {
+#ifdef SKIP_DUMMY_UI_LAY_DRAWING
+ if (ctx->num_of_fb_lay_skip == 0)
+#endif
+ {
+ glDisable(GL_SCISSOR_TEST);
+ glClearColor(0, 0, 0, 0);
+ glClear(GL_COLOR_BUFFER_BIT);
+ glEnable(GL_SCISSOR_TEST);
+ need_swap_buffers = true;
+ }
+ }
+ ctx->num_of_fb_layer_prev = ctx->num_of_fb_layer;
+
//compose hardware layers here
for (int i = 0; i < ctx->num_of_hwc_layer - ctx->num_2d_blit_layer; i++) {
win = &ctx->win[i];
@@ -603,7 +745,7 @@ static int hwc_set(hwc_composer_device_t *dev,
* double buffered (2 or more) this buffer is already rendered.
* It is the redundant src buffer for FIMC rendering.
*/
- ALOGD("SKIP FIMC rendering for Layer%d", win->layer_index);
+
#if defined(BOARD_USES_HDMI)
skip_hdmi_rendering = 1;
#endif
@@ -646,33 +788,6 @@ static int hwc_set(hwc_composer_device_t *dev,
}
}
-#ifdef SUB_TITLES_HWC
- if (ctx->num_2d_blit_layer) {
- g2d_rect srcRect;
- g2d_rect dstRect;
-
- win = &ctx->win[ctx->num_of_hwc_layer - 1];
- cur = &list->hwLayers[win->layer_index];
- set_src_dst_g2d_rect(cur, win, &srcRect, &dstRect);
- ret = runG2d(ctx, &srcRect, &dstRect,
- cur->transform);
- if (ret < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::runG2d fail : ret=%d\n",
- __func__, ret);
- skipped_window_mask |= (1 << (ctx->num_of_hwc_layer - 1));
- goto g2d_error;
- }
-
- window_pan_display(win);
-
- win->buf_index = (win->buf_index + 1) % NUM_OF_WIN_BUF;
- if (win->power_state == 0)
- window_show(win);
- }
-
-g2d_error:
-#endif
-
if (skipped_window_mask) {
//turn off the free windows
for (int i = 0; i < NUM_OF_WIN; i++) {
@@ -683,7 +798,7 @@ g2d_error:
}
}
- if (0 < ctx->num_of_fb_layer) {
+ if (need_swap_buffers) {
#ifdef CHECK_EGL_FPS
check_fps();
#endif
@@ -691,17 +806,7 @@ g2d_error:
unsigned char pixels[4];
glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
#endif
- egl_check = 1;
- egl_run = 1;
- } else {
- if (egl_check == 1) {
- egl_check = 0;
- egl_run = 1;
- }
- }
-
- if (egl_run == 1) {
- EGLBoolean sucess = eglSwapBuffers((EGLDisplay)dpy, (EGLSurface)sur);
+ EGLBoolean sucess = eglSwapBuffers((EGLDisplay)list->dpy, (EGLSurface)list->sur);
if (!sucess)
return HWC_EGL_ERROR;
}
@@ -732,14 +837,14 @@ g2d_error:
// To support S3D video playback (automatic TV mode change to 3D mode)
if (ctx->num_of_hwc_layer == 1) {
if (src_img.usage != prev_usage)
- mHdmiClient->setHdmiResolution(DEFAULT_HDMI_RESOLUTION_VALUE); // V4L2_STD_1080P_60
+ mHdmiClient->setHdmiResolution(DEFAULT_HDMI_RESOLUTION_VALUE, android::SecHdmiClient::HDMI_2D); // V4L2_STD_1080P_60
if ((src_img.usage & GRALLOC_USAGE_PRIVATE_SBS_LR) ||
(src_img.usage & GRALLOC_USAGE_PRIVATE_SBS_RL))
- mHdmiClient->setHdmiResolution(7209601); // V4L2_STD_TVOUT_720P_60_SBS_HALF
+ mHdmiClient->setHdmiResolution(DEFAULT_HDMI_S3D_SBS_RESOLUTION_VALUE, android::SecHdmiClient::HDMI_S3D_SBS); // V4L2_STD_TVOUT_720P_60_SBS_HALF
else if ((src_img.usage & GRALLOC_USAGE_PRIVATE_TB_LR) ||
(src_img.usage & GRALLOC_USAGE_PRIVATE_TB_RL))
- mHdmiClient->setHdmiResolution(1080924); // V4L2_STD_TVOUT_1080P_24_TB
+ mHdmiClient->setHdmiResolution(DEFAULT_HDMI_S3D_TB_RESOLUTION_VALUE, android::SecHdmiClient::HDMI_S3D_TB); // V4L2_STD_TVOUT_1080P_24_TB
prev_usage = src_img.usage;
} else {
@@ -747,7 +852,7 @@ g2d_error:
(prev_usage & GRALLOC_USAGE_PRIVATE_SBS_RL) ||
(prev_usage & GRALLOC_USAGE_PRIVATE_TB_LR) ||
(prev_usage & GRALLOC_USAGE_PRIVATE_TB_RL))
- mHdmiClient->setHdmiResolution(DEFAULT_HDMI_RESOLUTION_VALUE); // V4L2_STD_1080P_60
+ mHdmiClient->setHdmiResolution(DEFAULT_HDMI_RESOLUTION_VALUE, android::SecHdmiClient::HDMI_2D); // V4L2_STD_1080P_60
prev_usage = 0;
}
@@ -756,8 +861,7 @@ g2d_error:
if ((src_img.format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED)||
(src_img.format == HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP)) {
ADDRS * addr = (ADDRS *)(src_img.base);
-
- mHdmiClient->blit2Hdmi(src_img.w, src_img.h,
+ mHdmiClient->blit2Hdmi(src_work_rect.w, src_work_rect.h,
src_img.format,
(unsigned int)addr->addr_y, (unsigned int)addr->addr_cbcr, (unsigned int)addr->addr_cbcr,
0, 0,
@@ -767,7 +871,7 @@ g2d_error:
(src_img.format == HAL_PIXEL_FORMAT_YCrCb_420_SP) ||
(src_img.format == HAL_PIXEL_FORMAT_YCbCr_420_P) ||
(src_img.format == HAL_PIXEL_FORMAT_YV12)) {
- mHdmiClient->blit2Hdmi(src_img.w, src_img.h,
+ mHdmiClient->blit2Hdmi(src_work_rect.w, src_work_rect.h,
src_img.format,
(unsigned int)ctx->fimc.params.src.buf_addr_phy_rgb_y,
(unsigned int)ctx->fimc.params.src.buf_addr_phy_cb,
@@ -776,13 +880,90 @@ g2d_error:
android::SecHdmiClient::HDMI_MODE_VIDEO,
ctx->num_of_hwc_layer);
} else {
- ALOGE("%s: Unsupported format = %d", __func__, src_img.format);
+ SEC_HWC_Log(HWC_LOG_ERROR, "%s: Unsupported format = %d", __func__, src_img.format);
}
}
#endif
+ }
+ return 0;
+}
+
+static void hwc_registerProcs(struct hwc_composer_device_1* dev,
+ hwc_procs_t const* procs)
+{
+ struct hwc_context_t* ctx = (struct hwc_context_t*)dev;
+ ctx->procs = const_cast<hwc_procs_t *>(procs);
+}
+
+static int hwc_query(struct hwc_composer_device_1* dev,
+ int what, int* value)
+{
+ struct hwc_context_t* ctx = (struct hwc_context_t*)dev;
+
+ switch (what) {
+ case HWC_BACKGROUND_LAYER_SUPPORTED:
+ // we don't support the background layer yet
+ value[0] = 0;
+ break;
+ case HWC_VSYNC_PERIOD:
+ // vsync period in nanosecond
+ value[0] = 1000000000.0 / 57;
+ break;
+ default:
+ // unsupported query
+ return -EINVAL;
+ }
return 0;
}
+static int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy,
+ int event, int enabled)
+{
+ struct hwc_context_t* ctx = (struct hwc_context_t*)dev;
+
+ switch (event) {
+ case HWC_EVENT_VSYNC:
+ int val = !!enabled;
+ int err = ioctl(ctx->win[0].fd, S3CFB_SET_VSYNC_INT, &val);
+ if (err < 0)
+ return -errno;
+
+ return 0;
+ }
+ return -EINVAL;
+}
+
+
+static void *hwc_vsync_sysfs_loop(void *data)
+{
+ static char buf[4096];
+ int vsync_timestamp_fd;
+ fd_set exceptfds;
+ int res;
+ int64_t timestamp = 0;
+ hwc_context_t * ctx = (hwc_context_t *)(data);
+
+ vsync_timestamp_fd = open("/sys/devices/platform/samsung-pd.2/s3cfb.0/vsync_time", O_RDONLY);
+ char thread_name[64] = "hwcVsyncThread";
+ prctl(PR_SET_NAME, (unsigned long) &thread_name, 0, 0, 0);
+ setpriority(PRIO_PROCESS, 0, -20);
+ memset(buf, 0, sizeof(buf));
+
+ SEC_HWC_Log(HWC_LOG_DEBUG,"Using sysfs mechanism for VSYNC notification");
+
+ FD_ZERO(&exceptfds);
+ FD_SET(vsync_timestamp_fd, &exceptfds);
+ do {
+ ssize_t len = read(vsync_timestamp_fd, buf, sizeof(buf));
+ timestamp = strtoull(buf, NULL, 0);
+ ctx->procs->vsync(ctx->procs, 0, timestamp);
+ select(vsync_timestamp_fd + 1, NULL, NULL, &exceptfds, NULL);
+ lseek(vsync_timestamp_fd, 0, SEEK_SET);
+ } while (1);
+
+ return NULL;
+}
+
static int hwc_device_close(struct hw_device_t *dev)
{
struct hwc_context_t* ctx = (struct hwc_context_t*)dev;
@@ -793,23 +974,7 @@ static int hwc_device_close(struct hw_device_t *dev)
SEC_HWC_Log(HWC_LOG_ERROR, "%s::destroyFimc fail", __func__);
ret = -1;
}
-#ifdef SUB_TITLES_HWC
- if (destroyG2d(&ctx->g2d) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::destroyG2d() fail", __func__);
- ret = -1;
- }
-#endif
- if (destroyMem(&ctx->s3c_mem) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::destroyMem fail", __func__);
- ret = -1;
- }
-#ifdef USE_HW_PMEM
- if (destroyPmem(&ctx->sec_pmem) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::destroyPmem fail", __func__);
- ret = -1;
- }
-#endif
for (i = 0; i < NUM_OF_WIN; i++) {
if (window_close(&ctx->win[i]) < 0)
SEC_HWC_Log(HWC_LOG_DEBUG, "%s::window_close() fail", __func__);
@@ -819,11 +984,17 @@ static int hwc_device_close(struct hw_device_t *dev)
}
return ret;
}
-
+static int hwc_blank(struct hwc_composer_device_1 *dev, int dpy, int blank)
+{
+ // We're using an older method of screen blanking based on
+ // early_suspend in the kernel. No need to do anything here.
+ return 0;
+}
static int hwc_device_open(const struct hw_module_t* module, const char* name,
struct hw_device_t** device)
{
int status = 0;
+ int err = 0;
struct hwc_win_info_t *win;
if (strcmp(name, HWC_HARDWARE_COMPOSER))
@@ -836,22 +1007,21 @@ static int hwc_device_open(const struct hw_module_t* module, const char* name,
memset(dev, 0, sizeof(*dev));
/* initialize the procs */
- dev->device.common.tag = HARDWARE_DEVICE_TAG;
- dev->device.common.version = 0;
- dev->device.common.module = const_cast<hw_module_t*>(module);
- dev->device.common.close = hwc_device_close;
-
- dev->device.prepare = hwc_prepare;
- dev->device.set = hwc_set;
-
+ dev->device.common.tag = HARDWARE_DEVICE_TAG;
+ dev->device.common.version = HWC_DEVICE_API_VERSION_1_0;
+ dev->device.common.module = const_cast<hw_module_t*>(module);
+ dev->device.common.close = hwc_device_close;
+ dev->device.prepare = hwc_prepare;
+ dev->device.set = hwc_set;
+ dev->device.eventControl = hwc_eventControl;
+ dev->device.blank = hwc_blank;
+ dev->device.query = hwc_query;
+ dev->device.registerProcs = hwc_registerProcs;
*device = &dev->device.common;
//initializing
memset(&(dev->fimc), 0, sizeof(s5p_fimc_t));
- memset(&(dev->s3c_mem), 0, sizeof(struct s3c_mem_t));
-#ifdef USE_HW_PMEM
- memset(&(dev->sec_pmem), 0, sizeof(sec_pmem_t));
-#endif
+
/* open WIN0 & WIN1 here */
for (int i = 0; i < NUM_OF_WIN; i++) {
if (window_open(&(dev->win[i]), i) < 0) {
@@ -902,18 +1072,6 @@ static int hwc_device_open(const struct hw_module_t* module, const char* name,
}
-#ifdef USE_HW_PMEM
- if (createPmem(&dev->sec_pmem, PMEM_SIZE) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::initPmem(%d) fail", __func__, PMEM_SIZE);
- }
-#endif
-
- if (createMem(&dev->s3c_mem, 0, 0) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::createMem() fail (size=0)", __func__);
- status = -EINVAL;
- goto err;
- }
-
//create PP
if (createFimc(&dev->fimc) < 0) {
SEC_HWC_Log(HWC_LOG_ERROR, "%s::creatFimc() fail", __func__);
@@ -921,13 +1079,12 @@ static int hwc_device_open(const struct hw_module_t* module, const char* name,
goto err;
}
-#ifdef SUB_TITLES_HWC
- if (createG2d(&dev->g2d) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::createG2d() fail", __func__);
- status = -EINVAL;
+ err = pthread_create(&dev->vsync_thread, NULL, hwc_vsync_sysfs_loop, dev);
+ if (err) {
+ SEC_HWC_Log(HWC_LOG_ERROR, "%s::pthread_create() failed : %s", __func__, strerror(err));
+ status = -err;
goto err;
}
-#endif
SEC_HWC_Log(HWC_LOG_DEBUG, "%s:: hwc_device_open: SUCCESS", __func__);
@@ -936,17 +1093,6 @@ static int hwc_device_open(const struct hw_module_t* module, const char* name,
err:
if (destroyFimc(&dev->fimc) < 0)
SEC_HWC_Log(HWC_LOG_ERROR, "%s::destroyFimc() fail", __func__);
-#ifdef SUB_TITLES_HWC
- if (destroyG2d(&dev->g2d) < 0)
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::destroyG2d() fail", __func__);
-#endif
- if (destroyMem(&dev->s3c_mem) < 0)
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::destroyMem() fail", __func__);
-
-#ifdef USE_HW_PMEM
- if (destroyPmem(&dev->sec_pmem) < 0)
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::destroyPmem() fail", __func__);
-#endif
for (int i = 0; i < NUM_OF_WIN; i++) {
if (window_close(&dev->win[i]) < 0)
diff --git a/exynos4/hal/libhwcomposer/SecHWCUtils.cpp b/exynos4/hal/libhwcomposer/SecHWCUtils.cpp
index 5214e40..6351bbf 100644
--- a/exynos4/hal/libhwcomposer/SecHWCUtils.cpp
+++ b/exynos4/hal/libhwcomposer/SecHWCUtils.cpp
@@ -25,14 +25,8 @@
*/
#include "SecHWCUtils.h"
-
-#ifdef BOARD_USE_V4L2_ION
-#define V4L2_BUF_TYPE_OUTPUT V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE
-#define V4L2_BUF_TYPE_CAPTURE V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
-#else
#define V4L2_BUF_TYPE_OUTPUT V4L2_BUF_TYPE_VIDEO_OUTPUT
#define V4L2_BUF_TYPE_CAPTURE V4L2_BUF_TYPE_VIDEO_CAPTURE
-#endif
#define EXYNOS4_ALIGN( value, base ) (((value) + ((base) - 1)) & ~((base) - 1))
@@ -40,7 +34,7 @@
#ifdef CHECK_FPS
#include <sys/time.h>
#include <unistd.h>
-#define CHK_FRAME_CNT 30
+#define CHK_FRAME_CNT 57
void check_fps()
{
@@ -59,7 +53,7 @@ void check_fps()
memcpy(&tick_old, &tick, sizeof(timeval));
if (cnt == (10 + CHK_FRAME_CNT)) {
FPS = 1000*CHK_FRAME_CNT/total;
- LOGE("[FPS]:%d\n", FPS);
+ ALOGE("[FPS]:%d\n", FPS);
total = 0;
cnt = 10;
}
@@ -77,10 +71,6 @@ struct yuv_fmt_list yuv_list[] = {
{ "V4L2_PIX_FMT_NV21X", "YUV420/2P/MSB_CBCR", V4L2_PIX_FMT_NV21X, 12, 2 },
{ "V4L2_PIX_FMT_NV12X", "YUV420/2P/MSB_CRCB", V4L2_PIX_FMT_NV12X, 12, 2 },
{ "V4L2_PIX_FMT_YUV420", "YUV420/3P", V4L2_PIX_FMT_YUV420, 12, 3 },
-#ifdef BOARD_USE_V4L2_ION
- { "V4L2_PIX_FMT_YUV420M", "YUV420/3P", V4L2_PIX_FMT_YUV420M, 12, 3 },
- { "V4L2_PIX_FMT_NV12M", "YUV420/2P", V4L2_PIX_FMT_NV12M, 12, 2 },
-#endif
{ "V4L2_PIX_FMT_YUYV", "YUV422/1P/YCBYCR", V4L2_PIX_FMT_YUYV, 16, 1 },
{ "V4L2_PIX_FMT_YVYU", "YUV422/1P/YCRYCB", V4L2_PIX_FMT_YVYU, 16, 1 },
{ "V4L2_PIX_FMT_UYVY", "YUV422/1P/CBYCRY", V4L2_PIX_FMT_UYVY, 16, 1 },
@@ -110,18 +100,10 @@ int window_open(struct hwc_win_info_t *win, int id)
switch (id) {
case 0:
-#ifdef BOARD_USE_V4L2_ION
- real_id = 2;
-#else
real_id = 3;
-#endif
break;
case 1:
-#ifdef BOARD_USE_V4L2_ION
- real_id = 1;
-#else
real_id = 4;
-#endif
break;
default:
SEC_HWC_Log(HWC_LOG_ERROR, "%s::id(%d) is weird", __func__, id);
@@ -166,11 +148,6 @@ int window_close(struct hwc_win_info_t *win)
if (0 < win->fd) {
-#ifdef BOARD_USE_V4L2_ION
- ion_unmap((void *)win->addr[0], ALIGN(win->size * NUM_OF_WIN_BUF, PAGE_SIZE));
- ion_free(win->ion_fd);
-#endif
-
#ifdef ENABLE_FIMD_VSYNC
int vsync = 0;
if (ioctl(win->fd, S3CFB_SET_VSYNC_INT, &vsync) < 0)
@@ -232,26 +209,9 @@ int window_get_info(struct hwc_win_info_t *win, int win_num)
win->size = win->fix_info.line_length * win->var_info.yres;
-#ifdef BOARD_USE_V4L2_ION
- struct s3c_fb_user_ion_client ion_handle;
- void *ion_start_addr;
-
- if (ioctl(win->fd, S3CFB_GET_ION_USER_HANDLE, &ion_handle) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "Get fb ion client is failed\n");
- return -1;
- }
-
- win->ion_fd = ion_handle.fd;
- ion_start_addr = ion_map(win->ion_fd, ALIGN(win->size * NUM_OF_WIN_BUF, PAGE_SIZE), 0);
-#endif
-
for (int j = 0; j < NUM_OF_WIN_BUF; j++) {
temp_size = win->size * j;
-#ifdef BOARD_USE_V4L2_ION
- win->addr[j] = (uint32_t)ion_start_addr + temp_size;
-#else
win->addr[j] = win->fix_info.smem_start + temp_size;
-#endif
SEC_HWC_Log(HWC_LOG_DEBUG, "%s::win-%d add[%d] %x ",
__func__, win_num, j, win->addr[j]);
}
@@ -268,17 +228,10 @@ int window_pan_display(struct hwc_win_info_t *win)
struct fb_var_screeninfo *lcd_info = &(win->lcd_info);
#ifdef ENABLE_FIMD_VSYNC
-#ifdef BOARD_USE_V4L2_ION
- int fimd_num = 0;
- if (ioctl(win->fd, FBIO_WAITFORVSYNC, &fimd_num) < 0)
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::FBIO_WAITFORVSYNC fail(%s)",
- __func__, strerror(errno));
-#else
if (ioctl(win->fd, FBIO_WAITFORVSYNC, 0) < 0)
SEC_HWC_Log(HWC_LOG_ERROR, "%s::FBIO_WAITFORVSYNC fail(%s)",
__func__, strerror(errno));
#endif
-#endif
lcd_info->yoffset = lcd_info->yres * win->buf_index;
@@ -339,25 +292,10 @@ int fimc_v4l2_set_src(int fd, unsigned int hw_ver, s5p_fimc_img_info *src)
struct v4l2_crop crop;
struct v4l2_requestbuffers req;
-#ifdef BOARD_USE_V4L2_ION
- /* You MUST initialize structure for v4l2 */
- memset(&fmt, 0, sizeof(fmt));
- memset(&cropcap, 0, sizeof(cropcap));
- memset(&crop, 0, sizeof(crop));
- memset(&req, 0, sizeof(req));
-
- /* To set size & format for source image (DMA-INPUT) */
- fmt.fmt.pix_mp.num_planes = src->planes;
- fmt.fmt.pix_mp.width = src->full_width;
- fmt.fmt.pix_mp.height = src->full_height;
- fmt.fmt.pix_mp.pixelformat = src->color_space;
- fmt.fmt.pix_mp.field = V4L2_FIELD_ANY;
-#else
fmt.fmt.pix.width = src->full_width;
fmt.fmt.pix.height = src->full_height;
fmt.fmt.pix.pixelformat = src->color_space;
fmt.fmt.pix.field = V4L2_FIELD_NONE;
-#endif
fmt.type = V4L2_BUF_TYPE_OUTPUT;
if (ioctl(fd, VIDIOC_S_FMT, &fmt) < 0) {
@@ -370,10 +308,6 @@ int fimc_v4l2_set_src(int fd, unsigned int hw_ver, s5p_fimc_img_info *src)
crop.type = V4L2_BUF_TYPE_OUTPUT;
crop.c.width = src->width;
crop.c.height = src->height;
-#ifdef BOARD_USE_V4L2_ION
- crop.c.left = src->start_x;
- crop.c.top = src->start_y;
-#else
if (0x50 <= hw_ver) {
crop.c.left = src->start_x;
crop.c.top = src->start_y;
@@ -382,8 +316,6 @@ int fimc_v4l2_set_src(int fd, unsigned int hw_ver, s5p_fimc_img_info *src)
crop.c.top = 0;
}
-#endif
-
if (ioctl(fd, VIDIOC_S_CROP, &crop) < 0) {
SEC_HWC_Log(HWC_LOG_ERROR, "%s::Error in video VIDIOC_S_CROP :"
"crop.c.left : (%d), crop.c.top : (%d), crop.c.width : (%d), crop.c.height : (%d)",
@@ -410,27 +342,10 @@ int fimc_v4l2_set_dst(int fd, s5p_fimc_img_info *dst,
struct v4l2_format sFormat;
struct v4l2_control vc;
struct v4l2_framebuffer fbuf;
-#ifdef BOARD_USE_V4L2_ION
- struct v4l2_crop crop;
- struct v4l2_requestbuffers req;
-#endif
int ret;
-#ifdef BOARD_USE_V4L2_ION
- /* You MUST initialize structure for v4l2 */
- memset(&sFormat, 0, sizeof(sFormat));
- memset(&vc, 0, sizeof(vc));
- memset(&fbuf, 0, sizeof(fbuf));
- memset(&crop, 0, sizeof(crop));
- memset(&req, 0, sizeof(req));
-#endif
-
/* set rotation configuration */
-#ifdef BOARD_USE_V4L2_ION
- vc.id = V4L2_CID_ROTATE;
-#else
vc.id = V4L2_CID_ROTATION;
-#endif
vc.value = rotation;
ret = ioctl(fd, VIDIOC_S_CTRL, &vc);
@@ -463,45 +378,6 @@ int fimc_v4l2_set_dst(int fd, s5p_fimc_img_info *dst,
return -1;
}
-#ifdef BOARD_USE_V4L2_ION
- /* set destination */
- sFormat.type = V4L2_BUF_TYPE_CAPTURE;
- sFormat.fmt.pix_mp.width = dst->full_width;
- sFormat.fmt.pix_mp.height = dst->full_height;
- sFormat.fmt.pix_mp.pixelformat = dst->color_space;
- sFormat.fmt.pix_mp.num_planes = dst->planes;
- sFormat.fmt.pix.field = V4L2_FIELD_ANY;
-
- ret = ioctl(fd, VIDIOC_S_FMT, &sFormat);
- if (ret < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::Error in video VIDIOC_S_FMT (%d)", __func__, ret);
- return -1;
- }
-
- /* set destination window */
- crop.type = V4L2_BUF_TYPE_CAPTURE;
- crop.c.left = dst->start_x;
- crop.c.top = dst->start_y;
- crop.c.width = dst->width;
- crop.c.height = dst->height;
-
- ret = ioctl(fd, VIDIOC_S_CROP, &crop);
- if (ret < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::Error in video VIDIOC_S_CROP (%d)", __func__, ret);
- return -1;
- }
-
- /* input buffer type */
- req.count = 1;
- req.type = V4L2_BUF_TYPE_CAPTURE;
- req.memory = V4L2_MEMORY_USERPTR;
-
- ret = ioctl (fd, VIDIOC_REQBUFS, &req);
- if (ret < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::Error in VIDIOC_REQBUFS (%d)", __func__, ret);
- return -1;
- }
-#else
/* set size, format & address for destination image (DMA-OUTPUT) */
ret = ioctl(fd, VIDIOC_G_FBUF, &fbuf);
if (ret < 0) {
@@ -532,7 +408,6 @@ int fimc_v4l2_set_dst(int fd, s5p_fimc_img_info *dst,
SEC_HWC_Log(HWC_LOG_ERROR, "%s::Error in video VIDIOC_S_FMT (%d)", __func__, ret);
return -1;
}
-#endif
return 0;
}
@@ -549,34 +424,15 @@ int fimc_v4l2_stream_on(int fd, enum v4l2_buf_type type)
int fimc_v4l2_queue(int fd, struct fimc_buf *fimc_buf, enum v4l2_buf_type type, int index)
{
-#ifdef BOARD_USE_V4L2_ION
- struct v4l2_plane plane[3];
- int i;
-#endif
struct v4l2_buffer buf;
int ret;
-#ifdef BOARD_USE_V4L2_ION
- buf.length = fimc_buf->planes;
-#else
buf.length = 0;
buf.m.userptr = (unsigned long)fimc_buf;
-#endif
buf.memory = V4L2_MEMORY_USERPTR;
buf.index = index;
buf.type = type;
-#ifdef BOARD_USE_V4L2_ION
- if (buf.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ||
- buf.type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
- for (i = 0; i < buf.length; i++) {
- plane[i].m.userptr = fimc_buf->base[i];
- plane[i].length = fimc_buf->size[i];
- }
- }
- buf.m.planes = plane;
-#endif
-
ret = ioctl(fd, VIDIOC_QBUF, &buf);
if (0 > ret) {
SEC_HWC_Log(HWC_LOG_ERROR, "Error in VIDIOC_QBUF : (%d)", ret);
@@ -589,14 +445,7 @@ int fimc_v4l2_queue(int fd, struct fimc_buf *fimc_buf, enum v4l2_buf_type type,
int fimc_v4l2_dequeue(int fd, struct fimc_buf *fimc_buf, enum v4l2_buf_type type)
{
struct v4l2_buffer buf;
-#ifdef BOARD_USE_V4L2_ION
- struct v4l2_plane plane[3];
-#endif
-#ifdef BOARD_USE_V4L2_ION
- buf.m.planes = plane;
- buf.length = fimc_buf->planes;
-#endif
buf.memory = V4L2_MEMORY_USERPTR;
buf.type = type;
@@ -654,27 +503,6 @@ int fimc_handle_oneshot(int fd, struct fimc_buf *fimc_src_buf, struct fimc_buf *
check_fps();
#endif
-#ifdef BOARD_USE_V4L2_ION
- if (fimc_v4l2_queue(fd, fimc_src_buf, V4L2_BUF_TYPE_OUTPUT, 0) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "Fail : SRC v4l2_queue()");
- return -1;
- }
-
- if (fimc_v4l2_queue(fd, fimc_dst_buf, V4L2_BUF_TYPE_CAPTURE, 0) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "Fail : DST v4l2_queue()");
- return -2;
- }
-
- if (fimc_v4l2_stream_on(fd, V4L2_BUF_TYPE_OUTPUT) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "Fail : SRC v4l2_stream_on()");
- return -3;
- }
-
- if (fimc_v4l2_stream_on(fd, V4L2_BUF_TYPE_CAPTURE) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "Fail : DST v4l2_stream_on()");
- return -4;
- }
-#else
if (fimc_v4l2_stream_on(fd, V4L2_BUF_TYPE_OUTPUT) < 0) {
SEC_HWC_Log(HWC_LOG_ERROR, "Fail : SRC v4l2_stream_on()");
return -5;
@@ -684,38 +512,19 @@ int fimc_handle_oneshot(int fd, struct fimc_buf *fimc_src_buf, struct fimc_buf *
SEC_HWC_Log(HWC_LOG_ERROR, "Fail : SRC v4l2_queue()");
goto STREAM_OFF;
}
-#endif
if (fimc_v4l2_dequeue(fd, fimc_src_buf, V4L2_BUF_TYPE_OUTPUT) < 0) {
SEC_HWC_Log(HWC_LOG_ERROR, "Fail : SRC v4l2_dequeue()");
return -6;
}
-#ifdef BOARD_USE_V4L2_ION
- if (fimc_v4l2_dequeue(fd, fimc_dst_buf, V4L2_BUF_TYPE_CAPTURE) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "Fail : DST v4l2_dequeue()");
- return -7;
- }
-#endif
STREAM_OFF:
if (fimc_v4l2_stream_off(fd, V4L2_BUF_TYPE_OUTPUT) < 0) {
SEC_HWC_Log(HWC_LOG_ERROR, "Fail : SRC v4l2_stream_off()");
return -8;
}
-#ifdef BOARD_USE_V4L2_ION
- if (fimc_v4l2_stream_off(fd, V4L2_BUF_TYPE_CAPTURE) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "Fail : DST v4l2_stream_off()");
- return -9;
- }
-#endif
if (fimc_v4l2_clr_buf(fd, V4L2_BUF_TYPE_OUTPUT) < 0) {
SEC_HWC_Log(HWC_LOG_ERROR, "Fail : SRC v4l2_clr_buf()");
return -10;
}
-#ifdef BOARD_USE_V4L2_ION
- if (fimc_v4l2_clr_buf(fd, V4L2_BUF_TYPE_CAPTURE)< 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "Fail : DST v4l2_clr_buf()");
- return -11;
- }
-#endif
return 0;
}
@@ -823,17 +632,11 @@ static int get_src_phys_addr(struct hwc_context_t *ctx,
sec_img *src_img, sec_rect *src_rect)
{
s5p_fimc_t *fimc = &ctx->fimc;
- struct s3c_mem_alloc *ptr_mem_alloc = &ctx->s3c_mem.mem_alloc[0];
- struct s3c_mem_dma_param s3c_mem_dma;
-#ifdef USE_HW_PMEM
- sec_pmem_alloc_t *pm_alloc = &ctx->sec_pmem.sec_pmem_alloc[0];
-#endif
unsigned int src_virt_addr = 0;
unsigned int src_phys_addr = 0;
unsigned int src_frame_size = 0;
- struct pmem_region region;
ADDRS * addr;
// error check routine
@@ -884,61 +687,16 @@ static int get_src_phys_addr(struct hwc_context_t *ctx,
}
break;
default:
-#ifdef BOARD_USE_V4L2_ION
- fimc->params.src.buf_addr_phy_rgb_y = src_img->base;
- fimc->params.src.buf_addr_phy_cb = src_img->base + src_img->uoffset;
- fimc->params.src.buf_addr_phy_cr = src_img->base + src_img->uoffset + src_img->voffset;
- src_phys_addr = fimc->params.src.buf_addr_phy_rgb_y;
- break;
-#endif
if (src_img->usage & GRALLOC_USAGE_HW_FIMC1) {
fimc->params.src.buf_addr_phy_rgb_y = src_img->paddr;
fimc->params.src.buf_addr_phy_cb = src_img->paddr + src_img->uoffset;
fimc->params.src.buf_addr_phy_cr = src_img->paddr + src_img->uoffset + src_img->voffset;
src_phys_addr = fimc->params.src.buf_addr_phy_rgb_y;
- break;
- }
- // copy
- src_frame_size = FRAME_SIZE(src_img->format, src_img->w, src_img->h);
- if (src_frame_size == 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::FRAME_SIZE fail", __func__);
- return 0;
- }
-
-#ifdef USE_HW_PMEM
- if (0 <= checkPmem(&ctx->sec_pmem, 0, src_frame_size)) {
- src_virt_addr = pm_alloc->virt_addr;
- src_phys_addr = pm_alloc->phys_addr;
- pm_alloc->size = src_frame_size;
- } else
-#endif
- if (0 <= checkMem(&ctx->s3c_mem, 0, src_frame_size)) {
- src_virt_addr = ptr_mem_alloc->vir_addr;
- src_phys_addr = ptr_mem_alloc->phy_addr;
- ptr_mem_alloc->size = src_frame_size;
- } else {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::check_mem fail", __func__);
- return 0;
- }
- if ((src_img->format == HAL_PIXEL_FORMAT_YCbCr_420_P) ||
- (src_img->format == HAL_PIXEL_FORMAT_YV12) ||
- (src_img->format == HAL_PIXEL_FORMAT_YCbCr_420_SP) ||
- (src_img->format == HAL_PIXEL_FORMAT_YCrCb_420_SP)) {
- if (memcpy_rect((void *)src_virt_addr, (void*)((unsigned int)src_img->base),
- src_img->f_w, src_img->f_h, src_rect->w, src_rect->h, src_img->format) != 0)
- return 0;
} else {
- memcpy((void *)src_virt_addr, (void*)((unsigned int)src_img->base), src_frame_size);
+ SEC_HWC_Log(HWC_LOG_ERROR, "%s::\nformat = 0x%x : Not "
+ "GRALLOC_USAGE_HW_FIMC1 can not supported\n",
+ __func__, src_img->format);
}
-
-#ifdef USE_HW_PMEM
- if (pm_alloc->size == src_frame_size) {
- region.offset = 0;
- region.len = src_frame_size;
- if (ioctl(ctx->sec_pmem.pmem_master_fd, PMEM_CACHE_FLUSH, &region) < 0)
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::pmem cache flush fail ", __func__);
- }
-#endif
break;
}
}
@@ -946,19 +704,6 @@ static int get_src_phys_addr(struct hwc_context_t *ctx,
return src_phys_addr;
}
-static int get_dst_phys_addr(struct hwc_context_t *ctx, sec_img *dst_img,
- sec_rect *dst_rect, int *dst_memcpy_flag)
-{
- unsigned int dst_phys_addr = 0;
-
- if (HWC_PHYS_MEM_TYPE == dst_img->mem_type && 0 != dst_img->base)
- dst_phys_addr = dst_img->base;
- else
- dst_phys_addr = dst_img->base;
-
- return dst_phys_addr;
-}
-
static inline int rotateValueHAL2PP(unsigned char transform)
{
int rotate_flag = transform & 0x7;
@@ -1049,11 +794,7 @@ static inline int multipleOf16(int number)
static inline int widthOfPP(unsigned int ver, int pp_color_format, int number)
{
-#ifdef BOARD_USE_V4L2_ION
- if (1) {
-#else
if (0x50 <= ver) {
-#endif
switch (pp_color_format) {
/* 422 1/2/3 plane */
case V4L2_PIX_FMT_YUYV:
@@ -1156,7 +897,7 @@ static unsigned int get_yuv_planes(unsigned int fmt)
return yuv_list[sel].planes;
}
-static int runcFimcCore(struct hwc_context_t *ctx,
+static int runFimcCore(struct hwc_context_t *ctx,
unsigned int src_phys_addr, sec_img *src_img, sec_rect *src_rect,
uint32_t src_color_space,
unsigned int dst_phys_addr, sec_img *dst_img, sec_rect *dst_rect,
@@ -1168,18 +909,12 @@ static int runcFimcCore(struct hwc_context_t *ctx,
struct fimc_buf fimc_src_buf;
int src_bpp, src_planes;
-#ifdef BOARD_USE_V4L2_ION
- struct fimc_buf fimc_dst_buf;
- int dst_bpp, dst_planes;
- unsigned int src_frame_size = 0;
- unsigned int dst_frame_size = 0;
-#endif
unsigned int frame_size = 0;
bool src_cbcr_order = true;
int rotate_value = rotateValueHAL2PP(transform);
- int hflip = hflipValueHAL2PP(transform);
- int vflip = vflipValueHAL2PP(transform);
+ int hflip = 0;
+ int vflip = 0;
/* 1. param(fimc config)->src information
* - src_img,src_rect => s_fw,s_fh,s_w,s_h,s_x,s_y
@@ -1193,17 +928,6 @@ static int runcFimcCore(struct hwc_context_t *ctx,
params->src.color_space = src_color_space;
params->src.buf_addr_phy_rgb_y = src_phys_addr;
-#ifdef BOARD_USE_V4L2_ION
- params->dst.full_width = dst_img->f_w;
- params->dst.full_height = dst_img->f_h;
- params->dst.width = widthOfPP(fimc->hw_ver, dst_color_space, dst_rect->w);
- params->dst.height = heightOfPP(dst_color_space, dst_rect->h);
- params->dst.start_x = dst_rect->x;
- params->dst.start_y = dst_rect->y;
- params->dst.color_space = dst_color_space;
- params->dst.buf_addr_phy_rgb_y = dst_phys_addr;
-#endif
-
/* check src minimum */
if (src_rect->w < 16 || src_rect->h < 8) {
SEC_HWC_Log(HWC_LOG_ERROR,
@@ -1217,13 +941,13 @@ static int runcFimcCore(struct hwc_context_t *ctx,
return -1;
}
-#ifdef BOARD_USE_V4L2_ION
-#else
/* 2. param(fimc config)->dst information
* - dst_img,dst_rect,rot => d_fw,d_fh,d_w,d_h,d_x,d_y
*/
switch (rotate_value) {
case 0:
+ hflip = hflipValueHAL2PP(transform);
+ vflip = vflipValueHAL2PP(transform);
params->dst.full_width = dst_img->f_w;
params->dst.full_height = dst_img->f_h;
@@ -1235,6 +959,8 @@ static int runcFimcCore(struct hwc_context_t *ctx,
params->dst.height = heightOfPP(dst_color_space, dst_rect->h);
break;
case 90:
+ hflip = vflipValueHAL2PP(transform);
+ vflip = hflipValueHAL2PP(transform);
params->dst.full_width = dst_img->f_h;
params->dst.full_height = dst_img->f_w;
@@ -1277,10 +1003,9 @@ static int runcFimcCore(struct hwc_context_t *ctx,
break;
}
params->dst.color_space = dst_color_space;
-#endif
SEC_HWC_Log(HWC_LOG_DEBUG,
- "runcFimcCore()::"
+ "runFimcCore()::"
"SRC f.w(%d),f.h(%d),x(%d),y(%d),w(%d),h(%d)=>"
"DST f.w(%d),f.h(%d),x(%d),y(%d),w(%d),h(%d)",
params->src.full_width, params->src.full_height,
@@ -1320,35 +1045,6 @@ static int runcFimcCore(struct hwc_context_t *ctx,
* - set input buffer
* - set buffer type (V4L2_MEMORY_USERPTR)
*/
-#ifdef BOARD_USE_V4L2_ION
- switch (dst_img->format) {
- case HAL_PIXEL_FORMAT_RGBA_8888:
- case HAL_PIXEL_FORMAT_RGBX_8888:
- case HAL_PIXEL_FORMAT_RGB_888:
- case HAL_PIXEL_FORMAT_BGRA_8888:
- dst_planes = 1;
- dst_bpp = 32;
- break;
-
- case HAL_PIXEL_FORMAT_RGB_565:
- case HAL_PIXEL_FORMAT_RGBA_5551:
- case HAL_PIXEL_FORMAT_RGBA_4444:
- dst_planes = 1;
- dst_bpp = 16;
- break;
- }
-
- dst_frame_size = params->dst.width * params->dst.height ;
- params->dst.planes = dst_planes;
-
- if (dst_planes == 1) {
- fimc_dst_buf.base[0] = params->dst.buf_addr_phy_rgb_y;
- if (dst_bpp == 32)
- fimc_dst_buf.size[0] = dst_frame_size * 4;
- else if (dst_bpp == 16)
- fimc_dst_buf.size[0] = dst_frame_size * 2;
- }
-#endif
if (fimc_v4l2_set_dst(fimc->dev_fd, &params->dst, rotate_value, hflip, vflip, dst_phys_addr) < 0) {
SEC_HWC_Log(HWC_LOG_ERROR, "fimc_v4l2_set_dst is failed\n");
@@ -1361,16 +1057,13 @@ static int runcFimcCore(struct hwc_context_t *ctx,
* - set input buffer
* - set buffer type (V4L2_MEMORY_USERPTR)
*/
-#ifndef BOARD_USE_V4L2_ION
if (fimc_v4l2_set_src(fimc->dev_fd, fimc->hw_ver, &params->src) < 0) {
SEC_HWC_Log(HWC_LOG_ERROR, "fimc_v4l2_set_src is failed\n");
return -1;
}
-#endif
/* 5. Set input dma address (Y/RGB, Cb, Cr)
* - zero copy : mfc, camera
- * - memcpy to pmem : SW dec(420P), video editor(YV12)
*/
switch (src_img->format) {
case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
@@ -1390,32 +1083,9 @@ static int runcFimcCore(struct hwc_context_t *ctx,
case HAL_PIXEL_FORMAT_RGB_565:
case HAL_PIXEL_FORMAT_YV12:
default:
- if (src_img->format == HAL_PIXEL_FORMAT_YV12)
+ if (src_img->format == HAL_PIXEL_FORMAT_YV12){
src_cbcr_order = false;
-
-#ifdef BOARD_USE_V4L2_ION
- fimc_src_buf.base[0] = params->src.buf_addr_phy_rgb_y;
- if (src_cbcr_order == true) {
- fimc_src_buf.base[1] = params->src.buf_addr_phy_cb;
- fimc_src_buf.base[2] = params->src.buf_addr_phy_cr;
- } else {
- fimc_src_buf.base[1] = params->src.buf_addr_phy_cr;
- fimc_src_buf.base[2] = params->src.buf_addr_phy_cb;
}
- SEC_HWC_Log(HWC_LOG_DEBUG,
- "runFimcCore - Y=0x%X, U=0x%X, V=0x%X\n",
- fimc_src_buf.base[0], fimc_src_buf.base[1],fimc_src_buf.base[2]);
- src_frame_size = params->src.full_width * params->src.full_height;
- fimc_src_buf.size[0] = src_frame_size;
- fimc_src_buf.size[1] = src_frame_size >> 2;
- fimc_src_buf.size[2] = src_frame_size >> 2;
- SEC_HWC_Log(HWC_LOG_DEBUG,
- "runFimcCore - Y_length=%d, U_length=%d, V_length=%d\n",
- fimc_src_buf.size[0], fimc_src_buf.size[1],fimc_src_buf.size[2]);
- src_planes = get_yuv_planes(src_color_space);
-
- break;
-#endif
if (src_img->usage & GRALLOC_USAGE_HW_FIMC1) {
fimc_src_buf.base[0] = params->src.buf_addr_phy_rgb_y;
@@ -1432,108 +1102,20 @@ static int runcFimcCore(struct hwc_context_t *ctx,
fimc_src_buf.base[0], fimc_src_buf.base[1],fimc_src_buf.base[2]);
break;
}
-
- /* set source Y image */
- fimc_src_buf.base[0] = params->src.buf_addr_phy_rgb_y;
- /* set source Cb,Cr images for 2 or 3 planes */
- src_bpp = get_yuv_bpp(src_color_space);
- src_planes = get_yuv_planes(src_color_space);
- if (2 == src_planes) { /* 2 planes */
- frame_size = params->src.full_width * params->src.full_height;
- params->src.buf_addr_phy_cb =
- params->src.buf_addr_phy_rgb_y + frame_size;
- /* CbCr */
- fimc_src_buf.base[1] = params->src.buf_addr_phy_cb;
- } else if (3 == src_planes) { /* 3 planes */
- frame_size = params->src.full_width * params->src.full_height;
- params->src.buf_addr_phy_cb =
- params->src.buf_addr_phy_rgb_y + frame_size;
- if (12 == src_bpp)
- params->src.buf_addr_phy_cr =
- params->src.buf_addr_phy_cb + (frame_size >> 2);
- else
- params->src.buf_addr_phy_cr =
- params->src.buf_addr_phy_cb + (frame_size >> 1);
- /* Cb, Cr */
- if (src_cbcr_order == true) {
- fimc_src_buf.base[1] = params->src.buf_addr_phy_cb;
- fimc_src_buf.base[2] = params->src.buf_addr_phy_cr;
- }
- else {
- fimc_src_buf.base[2] = params->src.buf_addr_phy_cb;
- fimc_src_buf.base[1] = params->src.buf_addr_phy_cr;
- }
- }
- break;
}
/* 6. Run FIMC
* - stream on => queue => dequeue => stream off => clear buf
*/
-#ifdef BOARD_USE_V4L2_ION
- int ret = 0;
- params->src.planes = src_planes;
-
- if (fimc_v4l2_set_src(fimc->dev_fd, fimc->hw_ver, &params->src) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "fimc_v4l2_set_src is failed\n");
- return -1;
- }
-
- fimc_src_buf.planes = src_planes;
- fimc_dst_buf.planes = dst_planes;
-
- ret = fimc_handle_oneshot(fimc->dev_fd, &fimc_src_buf, &fimc_dst_buf);
-
- if (ret < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR,"fimc_handle_oneshot = %d\n",ret);
- if (ret == -2) {
- fimc_v4l2_clr_buf(fimc->dev_fd, V4L2_BUF_TYPE_OUTPUT);
- } else if (ret == -3) {
- fimc_v4l2_clr_buf(fimc->dev_fd, V4L2_BUF_TYPE_OUTPUT);
- fimc_v4l2_clr_buf(fimc->dev_fd, V4L2_BUF_TYPE_CAPTURE);
- }
- return ret;
- }
-#else
if (fimc_handle_oneshot(fimc->dev_fd, &fimc_src_buf, NULL) < 0) {
+ ALOGE("fimcrun fail");
fimc_v4l2_clr_buf(fimc->dev_fd, V4L2_BUF_TYPE_OUTPUT);
return -1;
}
-#endif
return 0;
}
-#ifdef SUB_TITLES_HWC
-int createG2d(sec_g2d_t *g2d)
-{
- g2d->dev_fd = open(SEC_G2D_DEV_NAME, O_RDWR);
-
- if (g2d->dev_fd <= 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::G2d open error (%d)", __func__, errno);
- goto err;
- }
-
- return 0;
-err:
- if (0 < g2d->dev_fd)
- close(g2d->dev_fd);
- g2d->dev_fd =0;
-
- return -1;
-}
-
-int destroyG2d(sec_g2d_t *g2d)
-{
- // close
- if (0 < g2d->dev_fd)
- close(g2d->dev_fd);
- g2d->dev_fd = 0;
-
- return 0;
-}
-#endif
-
int createFimc(s5p_fimc_t *fimc)
{
struct v4l2_capability cap;
@@ -1575,8 +1157,6 @@ int createFimc(s5p_fimc_t *fimc)
goto err;
}
-#ifdef BOARD_USE_V4L2_ION
-#else
vc.id = V4L2_CID_FIMC_VERSION;
vc.value = 0;
@@ -1585,7 +1165,6 @@ int createFimc(s5p_fimc_t *fimc)
goto err;
}
fimc->hw_ver = vc.value;
-#endif
return 0;
@@ -1622,7 +1201,6 @@ int runFimc(struct hwc_context_t *ctx,
unsigned int src_phys_addr = 0;
unsigned int dst_phys_addr = 0;
int rotate_value = 0;
- int flag_force_memcpy = 0;
int32_t src_color_space;
int32_t dst_color_space;
@@ -1632,7 +1210,7 @@ int runFimc(struct hwc_context_t *ctx,
return -1;
/* 2. destination address and size */
- dst_phys_addr = get_dst_phys_addr(ctx, dst_img, dst_rect, &flag_force_memcpy);
+ dst_phys_addr = dst_img->base;
if (0 == dst_phys_addr)
return -2;
@@ -1645,433 +1223,38 @@ int runFimc(struct hwc_context_t *ctx,
return -4;
/* 4. FIMC: src_rect of src_img => dst_rect of dst_img */
- if (runcFimcCore(ctx, src_phys_addr, src_img, src_rect,
+ if (runFimcCore(ctx, src_phys_addr, src_img, src_rect,
(uint32_t)src_color_space, dst_phys_addr, dst_img, dst_rect,
(uint32_t)dst_color_space, transform) < 0)
return -5;
- if (flag_force_memcpy == 1) {
-#ifdef USE_HW_PMEM
- if (0 != ctx->sec_pmem.sec_pmem_alloc[1].size) {
- struct s3c_mem_dma_param s3c_mem_dma;
-
- s3c_mem_dma.src_addr =
- (unsigned long)(ctx->sec_pmem.sec_pmem_alloc[1].virt_addr);
- s3c_mem_dma.size = ctx->sec_pmem.sec_pmem_alloc[1].size;
-
- ioctl(ctx->s3c_mem.fd, S3C_MEM_CACHE_INVAL, &s3c_mem_dma);
-
- memcpy((void*)((unsigned int)dst_img->base),
- (void *)(ctx->sec_pmem.sec_pmem_alloc[1].virt_addr),
- ctx->sec_pmem.sec_pmem_alloc[1].size);
- } else
-#endif
- {
- struct s3c_mem_alloc *ptr_mem_alloc = &ctx->s3c_mem.mem_alloc[1];
- struct s3c_mem_dma_param s3c_mem_dma;
-
- s3c_mem_dma.src_addr = (unsigned long)ptr_mem_alloc->vir_addr;
- s3c_mem_dma.size = ptr_mem_alloc->size;
-
- ioctl(ctx->s3c_mem.fd, S3C_MEM_CACHE_INVAL, &s3c_mem_dma);
-
- memcpy((void*)((unsigned int)dst_img->base),
- (void *)ptr_mem_alloc->vir_addr, ptr_mem_alloc->size);
- }
- }
-
return 0;
}
-#ifdef SUB_TITLES_HWC
-static int get_g2d_src_phys_addr(struct hwc_context_t *ctx, g2d_rect *src_rect)
-{
- sec_g2d_t *g2d = &ctx->g2d;
- struct s3c_mem_alloc *ptr_mem_alloc = &ctx->s3c_mem.mem_alloc[0];
-#ifdef USE_HW_PMEM
- sec_pmem_alloc_t *pm_alloc = &ctx->sec_pmem.sec_pmem_alloc[0];
-#endif
-
- unsigned int src_virt_addr = 0;
- unsigned int src_phys_addr = 0;
- unsigned int src_frame_size = 0;
-
- struct pmem_region region;
-
- // error check routine
- if (0 == src_rect->virt_addr) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s invalid src address\n", __func__);
- return 0;
- }
-
- src_frame_size = FRAME_SIZE(src_rect->color_format,
- src_rect->full_w, src_rect->full_h);
- if (src_frame_size == 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::FRAME_SIZE fail", __func__);
- return 0;
- }
-
-#ifdef USE_HW_PMEM
- if (0 <= checkPmem(&ctx->sec_pmem, 0, src_frame_size)) {
- src_virt_addr = pm_alloc->virt_addr;
- src_phys_addr = pm_alloc->phys_addr;
- pm_alloc->size = src_frame_size;
- } else
-#endif
- if (0 <= checkMem(&ctx->s3c_mem, 0, src_frame_size)) {
- src_virt_addr = ptr_mem_alloc->vir_addr;
- src_phys_addr = ptr_mem_alloc->phy_addr;
- ptr_mem_alloc->size = src_frame_size;
- } else {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::check_mem fail", __func__);
- return 0;
- }
- memcpy((void *)src_virt_addr, (void*)((unsigned int)src_rect->virt_addr), src_frame_size);
-
- return src_phys_addr;
-}
-
-int get_HAL_2_G2D_FORMAT(int format)
-{
- switch (format) {
- case HAL_PIXEL_FORMAT_RGBA_8888: return G2D_ABGR_8888;
- case HAL_PIXEL_FORMAT_RGBX_8888: return G2D_XBGR_8888;
- case HAL_PIXEL_FORMAT_BGRA_8888: return G2D_ARGB_8888;
- case HAL_PIXEL_FORMAT_RGB_888: return G2D_PACKED_BGR_888;
- case HAL_PIXEL_FORMAT_RGB_565: return G2D_RGB_565;
- case HAL_PIXEL_FORMAT_RGBA_5551: return G2D_RGBA_5551;
- case HAL_PIXEL_FORMAT_RGBA_4444: return G2D_RGBA_4444;
- default:
- return -1;
- }
-}
-
-static inline int rotateValueHAL2G2D(unsigned char transform)
-{
- int rotate_flag = transform & 0x7;
-
- switch (rotate_flag) {
- case HAL_TRANSFORM_ROT_90: return G2D_ROT_90;
- case HAL_TRANSFORM_ROT_180: return G2D_ROT_180;
- case HAL_TRANSFORM_ROT_270: return G2D_ROT_270;
+int check_yuv_format(unsigned int color_format) {
+ switch (color_format) {
+ case HAL_PIXEL_FORMAT_YV12:
+ case HAL_PIXEL_FORMAT_YCbCr_422_SP:
+ case HAL_PIXEL_FORMAT_YCrCb_420_SP:
+ case HAL_PIXEL_FORMAT_YCbCr_422_I:
+ case HAL_PIXEL_FORMAT_YCbCr_422_P:
+ case HAL_PIXEL_FORMAT_YCbCr_420_P:
+ case HAL_PIXEL_FORMAT_YCbCr_420_I:
+ case HAL_PIXEL_FORMAT_CbYCrY_422_I:
+ case HAL_PIXEL_FORMAT_CbYCrY_420_I:
+ case HAL_PIXEL_FORMAT_YCbCr_420_SP:
+ case HAL_PIXEL_FORMAT_YCrCb_422_SP:
+ case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
+ case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
+ case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
+ case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
+ case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP:
+ case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
+ case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
+ case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I:
+ case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
+ return 1;
default:
- return G2D_ROT_0;
- }
-}
-
-int runG2d(struct hwc_context_t *ctx, g2d_rect *src_rect, g2d_rect *dst_rect,
- uint32_t transform)
-{
- sec_g2d_t * g2d = &ctx->g2d;
- g2d_flag flag = {G2D_ROT_0, G2D_ALPHA_BLENDING_OPAQUE, 0, 0, 0, 0, 0, 0};
- int rotate_value = 0;
-
- // 1 : source address and size
- src_rect->phys_addr = get_g2d_src_phys_addr(ctx, src_rect);
- if (0 == src_rect->phys_addr)
- return -1;
-
- // 2 : destination address and size
- if (0 == dst_rect->phys_addr)
- return -2;
-
- // check whether g2d supports the src format
- src_rect->color_format = get_HAL_2_G2D_FORMAT(src_rect->color_format);
- if (0 > src_rect->color_format)
- return -3;
-
- dst_rect->color_format = get_HAL_2_G2D_FORMAT(dst_rect->color_format);
- if (0 > dst_rect->color_format)
- return -4;
-
- flag.rotate_val = rotateValueHAL2G2D(transform);
-
- // scale and rotate and alpha with FIMG
- if(stretchSecFimg(src_rect, dst_rect, &flag) < 0)
- return -5;
-
- return 0;
-}
-#endif
-
-int createMem(struct s3c_mem_t *mem, unsigned int index, unsigned int size)
-{
- struct s3c_mem_alloc *ptr_mem_alloc;
- struct s3c_mem_alloc mem_alloc_info;
-
- if (index >= NUM_OF_MEM_OBJ) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::invalid index (%d >= %d)",
- __func__, index, NUM_OF_MEM_OBJ);
- goto err;
- }
-
- ptr_mem_alloc = &mem->mem_alloc[index];
-
- if (mem->fd <= 0) {
- mem->fd = open(S3C_MEM_DEV_NAME, O_RDWR);
- if (mem->fd <= 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::open(%s) fail(%s)",
- __func__, S3C_MEM_DEV_NAME, strerror(errno));
- goto err;
- }
- }
-
- // kcoolsw : what the hell of this line??
- if (0 == size)
return 0;
-
- mem_alloc_info.size = size;
-
- if (ioctl(mem->fd, S3C_MEM_CACHEABLE_ALLOC, &mem_alloc_info) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::S3C_MEM_ALLOC(size : %d) fail",
- __func__, mem_alloc_info.size);
- goto err;
}
-
- ptr_mem_alloc->phy_addr = mem_alloc_info.phy_addr;
- ptr_mem_alloc->vir_addr = mem_alloc_info.vir_addr;
- ptr_mem_alloc->size = mem_alloc_info.size;
-
- return 0;
-
-err:
- if (0 < mem->fd)
- close(mem->fd);
- mem->fd = 0;
-
- return 0;
-}
-
-int destroyMem(struct s3c_mem_t *mem)
-{
- int i;
- struct s3c_mem_alloc *ptr_mem_alloc;
-
- if (mem->fd <= 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::invalied fd(%d) fail", __func__, mem->fd);
- return -1;
- }
-
- for (i = 0; i < NUM_OF_MEM_OBJ; i++) {
- ptr_mem_alloc = &mem->mem_alloc[i];
-
- if (0 != ptr_mem_alloc->vir_addr) {
- if (ioctl(mem->fd, S3C_MEM_FREE, ptr_mem_alloc) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::S3C_MEM_FREE fail", __func__);
- return -1;
- }
-
- ptr_mem_alloc->phy_addr = 0;
- ptr_mem_alloc->vir_addr = 0;
- ptr_mem_alloc->size = 0;
- }
- }
-
- close(mem->fd);
- mem->fd = 0;
-
- return 0;
-}
-
-int checkMem(struct s3c_mem_t *mem, unsigned int index, unsigned int size)
-{
- int ret;
- struct s3c_mem_alloc *ptr_mem_alloc;
- struct s3c_mem_alloc mem_alloc_info;
-
- if (index >= NUM_OF_MEM_OBJ) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::invalid index (%d >= %d)", __func__,
- index, NUM_OF_MEM_OBJ);
- return -1;
- }
-
- if (mem->fd <= 0) {
- ret = createMem(mem, index, size);
- return ret;
- }
-
- ptr_mem_alloc = &mem->mem_alloc[index];
-
- if (ptr_mem_alloc->size < (int)size) {
- if (0 < ptr_mem_alloc->size) {
- // free allocated mem
- if (ioctl(mem->fd, S3C_MEM_FREE, ptr_mem_alloc) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::S3C_MEM_FREE fail", __func__);
- return -1;
- }
- }
-
- // allocate mem with requested size
- mem_alloc_info.size = size;
- if (ioctl(mem->fd, S3C_MEM_CACHEABLE_ALLOC, &mem_alloc_info) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::S3C_MEM_ALLOC(size : %d) fail",
- __func__, mem_alloc_info.size);
- return -1;
- }
-
- ptr_mem_alloc->phy_addr = mem_alloc_info.phy_addr;
- ptr_mem_alloc->vir_addr = mem_alloc_info.vir_addr;
- ptr_mem_alloc->size = mem_alloc_info.size;
- }
-
- return 0;
}
-
-#ifdef USE_HW_PMEM
-int createPmem(sec_pmem_t *pm, unsigned int buf_size)
-{
- int master_fd, err = 0, i;
- void *base;
- unsigned int phys_base;
- size_t size, sub_size[NUM_OF_MEM_OBJ];
- struct pmem_region region;
-
- master_fd = open(PMEM_DEVICE_DEV_NAME, O_RDWR, 0);
- if (master_fd < 0) {
- pm->pmem_master_fd = -1;
- if (EACCES == errno) {
- return 0;
- } else {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::open(%s) fail(%s)",
- __func__, PMEM_DEVICE_DEV_NAME, strerror(errno));
- return -errno;
- }
- }
-
- if (ioctl(master_fd, PMEM_GET_TOTAL_SIZE, &region) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "PMEM_GET_TOTAL_SIZE failed, default mode");
- size = 8<<20; // 8 MiB
- } else {
- size = region.len;
- }
-
- base = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, master_fd, 0);
- if (base == MAP_FAILED) {
- SEC_HWC_Log(HWC_LOG_ERROR, "[%s] mmap failed : %d (%s)", __func__,
- errno, strerror(errno));
- base = 0;
- close(master_fd);
- master_fd = -1;
- return -errno;
- }
-
- if (ioctl(master_fd, PMEM_GET_PHYS, &region) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "PMEM_GET_PHYS failed, limp mode");
- region.offset = 0;
- }
-
- pm->pmem_master_fd = master_fd;
- pm->pmem_master_base = base;
- pm->pmem_total_size = size;
- //pm->pmem_master_phys_base = region.offset;
- phys_base = region.offset;
-
- // sec_pmem_alloc[0] for temporary buffer for source
- sub_size[0] = buf_size;
- sub_size[0] = roundUpToPageSize(sub_size[0]);
-
- for (i = 0; i < NUM_OF_MEM_OBJ; i++) {
- sec_pmem_alloc_t *pm_alloc = &(pm->sec_pmem_alloc[i]);
- int fd, ret;
- int offset = i ? sub_size[i-1] : 0;
- struct pmem_region sub = { offset, sub_size[i] };
-
- // create the "sub-heap"
- if (0 > (fd = open(PMEM_DEVICE_DEV_NAME, O_RDWR, 0))) {
- SEC_HWC_Log(HWC_LOG_ERROR,
- "[%s][index=%d] open failed (%dL) : %d (%s)",
- __func__, i, __LINE__, errno, strerror(errno));
- return -errno;
- }
-
- // connect to it
- if (0 != (ret = ioctl(fd, PMEM_CONNECT, pm->pmem_master_fd))) {
- SEC_HWC_Log(HWC_LOG_ERROR,
- "[%s][index=%d] ioctl(PMEM_CONNECT) failed : %d (%s)",
- __func__, i, errno, strerror(errno));
- close(fd);
- return -errno;
- }
-
- // make it available to the client process
- if (0 != (ret = ioctl(fd, PMEM_MAP, &sub))) {
- SEC_HWC_Log(HWC_LOG_ERROR,
- "[%s][index=%d] ioctl(PMEM_MAP) failed : %d (%s)",
- __func__, i, errno, strerror(errno));
- close(fd);
- return -errno;
- }
-
- pm_alloc->fd = fd;
- pm_alloc->total_size = sub_size[i];
- pm_alloc->offset = offset;
- pm_alloc->virt_addr = (unsigned int)base + (unsigned int)offset;
- pm_alloc->phys_addr = (unsigned int)phys_base + (unsigned int)offset;
-
-#if defined (PMEM_DEBUG)
- SEC_HWC_Log(HWC_LOG_DEBUG, "[%s] pm_alloc[%d] fd=%d total_size=%d "
- "offset=0x%x virt_addr=0x%x phys_addr=0x%x",
- __func__, i, pm_alloc->fd, pm_alloc->total_size,
- pm_alloc->offset, pm_alloc->virt_addr, pm_alloc->phys_addr);
-#endif
- }
-
- return err;
-}
-
-int destroyPmem(sec_pmem_t *pm)
-{
- int i, err;
-
- for (i=0; i<NUM_OF_MEM_OBJ; i++) {
- sec_pmem_alloc_t *pm_alloc = &(pm->sec_pmem_alloc[i]);
-
- if (0 <= pm_alloc->fd) {
- struct pmem_region sub = { pm_alloc->offset, pm_alloc->total_size };
-
- if (0 > (err = ioctl(pm_alloc->fd, PMEM_UNMAP, &sub)))
- SEC_HWC_Log(HWC_LOG_ERROR,
- "[%s][index=%d] ioctl(PMEM_UNMAP) failed : %d (%s)",
- __func__, i, errno, strerror(errno));
-#if defined (PMEM_DEBUG)
- else
- SEC_HWC_Log(HWC_LOG_DEBUG,
- "[%s] pm_alloc[%d] unmap fd=%d total_size=%d offset=0x%x",
- __func__, i, pm_alloc->fd, pm_alloc->total_size,
- pm_alloc->offset);
-#endif
- close(pm_alloc->fd);
-
- pm_alloc->fd = -1;
- pm_alloc->total_size = 0;
- pm_alloc->offset = 0;
- pm_alloc->virt_addr = 0;
- pm_alloc->phys_addr = 0;
- }
- }
-
- if (0 <= pm->pmem_master_fd) {
- munmap(pm->pmem_master_base, pm->pmem_total_size);
- close(pm->pmem_master_fd);
- pm->pmem_master_fd = -1;
- }
-
- pm->pmem_master_base = 0;
- pm->pmem_total_size = 0;
-
- return 0;
-}
-
-int checkPmem(sec_pmem_t *pm, unsigned int index, unsigned int requested_size)
-{
- sec_pmem_alloc_t *pm_alloc = &(pm->sec_pmem_alloc[index]);
-
- if (0 < pm_alloc->virt_addr &&
- requested_size <= (unsigned int)(pm_alloc->total_size))
- return 0;
-
- pm_alloc->size = 0;
- return -1;
-}
-
-#endif
diff --git a/exynos4/hal/libhwcomposer/SecHWCUtils.h b/exynos4/hal/libhwcomposer/SecHWCUtils.h
index 9873003..ac1c9ef 100644
--- a/exynos4/hal/libhwcomposer/SecHWCUtils.h
+++ b/exynos4/hal/libhwcomposer/SecHWCUtils.h
@@ -17,8 +17,8 @@
/*
*
* @author Rama, Meka(v.meka@samsung.com)
- Sangwoo, Park(sw5771.park@samsung.com)
- Jamie, Oh (jung-min.oh@samsung.com)
+ Sangwoo, Park(sw5771.park@samsung.com)
+ Jamie, Oh (jung-min.oh@samsung.com)
* @date 2011-03-11
*
*/
@@ -34,33 +34,33 @@
#include <errno.h>
#include <cutils/log.h>
-#ifdef BOARD_USE_V4L2_ION
-#include <ion.h>
-#include "s5p_fimc_v4l2.h"
-#include "sec_utils_v4l2.h"
-#else
#include <linux/videodev.h>
+#include "videodev2.h"
#include "s5p_fimc.h"
#include "sec_utils.h"
-#endif
-
-#include <linux/android_pmem.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
+#include <sys/resource.h>
#include <hardware/gralloc.h>
#include "linux/fb.h"
#include "s3c_lcd.h"
-#include "s3c_mem.h"
#include "sec_format.h"
-#define HWC_DEBUG
+#define HWC_DEBUG 1
#if defined(BOARD_USES_FIMGAPI)
#include "sec_g2d.h"
-//#define SUB_TITLES_HWC
#endif
+#define SKIP_DUMMY_UI_LAY_DRAWING
+
+#ifdef SKIP_DUMMY_UI_LAY_DRAWING
+#define GL_WA_OVLY_ALL
+#define THRES_FOR_SWAP (3427) /* 60sec in Frames. 57fps * 60 = 3427 */
+#endif
+
+#define NUM_OF_DUMMY_WIN (4)
#define NUM_OF_WIN (2)
#define NUM_OF_WIN_BUF (2)
#define NUM_OF_MEM_OBJ (1)
@@ -72,27 +72,14 @@
#define MAX_RESIZING_RATIO_LIMIT (63)
#ifdef SAMSUNG_EXYNOS4x12
-#ifdef BOARD_USE_V4L2_ION
-#define PP_DEVICE_DEV_NAME "/dev/video4"
-#else
#define PP_DEVICE_DEV_NAME "/dev/video3"
#endif
-#endif
#ifdef SAMSUNG_EXYNOS4210
#define PP_DEVICE_DEV_NAME "/dev/video1"
#endif
-
-#define S3C_MEM_DEV_NAME "/dev/s3c-mem"
-#define PMEM_DEVICE_DEV_NAME "/dev/pmem_gpu1"
-
-#ifdef BOARD_USE_V4L2_ION
-#undef USE_HW_PMEM
-#else
-#define USE_HW_PMEM
-#endif
-
-#define PMEM_SIZE (1920 * 1280 * 2)
+/* cacheable configuration */
+#define V4L2_CID_CACHEABLE (V4L2_CID_BASE+40)
struct sec_rect {
int32_t x;
@@ -127,34 +114,6 @@ inline int SEC_MAX(int x, int y)
return ((x > y) ? x : y);
}
-struct s3c_mem_t {
- int fd;
- struct s3c_mem_alloc mem_alloc[NUM_OF_MEM_OBJ];
-};
-
-#ifdef USE_HW_PMEM
-typedef struct __sec_pmem_alloc {
- int fd;
- int total_size;
- int offset;
- int size;
- unsigned int virt_addr;
- unsigned int phys_addr;
-} sec_pmem_alloc_t;
-
-typedef struct __sec_pmem {
- int pmem_master_fd;
- void *pmem_master_base;
- int pmem_total_size;
- sec_pmem_alloc_t sec_pmem_alloc[NUM_OF_MEM_OBJ];
-} sec_pmem_t;
-
-inline size_t roundUpToPageSize(size_t x)
-{
- return (x + (PAGE_SIZE-1)) & ~(PAGE_SIZE-1);
-}
-#endif
-
struct hwc_win_info_t {
int fd;
int size;
@@ -167,9 +126,6 @@ struct hwc_win_info_t {
int layer_index;
int status;
int vsync;
-#ifdef BOARD_USE_V4L2_ION
- int ion_fd;
-#endif
struct fb_fix_screeninfo fix_info;
struct fb_var_screeninfo var_info;
@@ -187,24 +143,46 @@ enum {
HWC_VIRT_MEM_TYPE,
};
+#ifdef SKIP_DUMMY_UI_LAY_DRAWING
+struct hwc_ui_lay_info{
+ uint32_t layer_prev_buf;
+ int layer_index;
+ int status;
+};
+#endif
+
struct hwc_context_t {
- hwc_composer_device_t device;
+ hwc_composer_device_1_t device;
/* our private state goes below here */
struct hwc_win_info_t win[NUM_OF_WIN];
- struct fb_var_screeninfo lcd_info;
- s5p_fimc_t fimc;
-#ifdef SUB_TITLES_HWC
- sec_g2d_t g2d;
+#ifdef SKIP_DUMMY_UI_LAY_DRAWING
+ struct hwc_ui_lay_info win_virt[NUM_OF_DUMMY_WIN];
+ int fb_lay_skip_initialized;
+ int num_of_fb_lay_skip;
+#ifdef GL_WA_OVLY_ALL
+ int ui_skip_frame_cnt;
#endif
- struct s3c_mem_t s3c_mem;
-#ifdef USE_HW_PMEM
- sec_pmem_t sec_pmem;
#endif
+
+ struct fb_var_screeninfo lcd_info;
+ s5p_fimc_t fimc;
+ hwc_procs_t *procs;
+ pthread_t uevent_thread;
+ pthread_t vsync_thread;
+
int num_of_fb_layer;
int num_of_hwc_layer;
- int num_2d_blit_layer;
+ int num_of_fb_layer_prev;
+ int num_2d_blit_layer;
uint32_t layer_prev_buf[NUM_OF_WIN];
+
+ int num_of_ext_disp_layer;
+ int num_of_ext_disp_video_layer;
+
+#ifdef BOARD_USES_HDMI
+ int hdmi_cable_status;
+#endif
};
typedef enum _LOG_LEVEL {
@@ -220,8 +198,8 @@ typedef enum _LOG_LEVEL {
#else
#define SEC_HWC_Log(a, ...) \
do { \
- if (a == HWC_LOG_ERROR) \
- ((void)_SEC_HWC_Log(a, SEC_HWC_LOG_TAG, __VA_ARGS__)); \
+ if (a == HWC_LOG_ERROR) \
+ ((void)_SEC_HWC_Log(a, SEC_HWC_LOG_TAG, __VA_ARGS__)); \
} while (0)
#endif
@@ -305,27 +283,9 @@ int window_get_global_lcd_info(int fd, struct fb_var_screeninfo *lcd_info);
int createFimc (s5p_fimc_t *fimc);
int destroyFimc(s5p_fimc_t *fimc);
int runFimc(struct hwc_context_t *ctx,
- struct sec_img *src_img, struct sec_rect *src_rect,
- struct sec_img *dst_img, struct sec_rect *dst_rect,
- uint32_t transform);
-
-#ifdef SUB_TITLES_HWC
-int runG2d(struct hwc_context_t *ctx,
- g2d_rect *src_rect, g2d_rect *dst_rect,
- uint32_t transform);
-
-int destroyG2d(sec_g2d_t *g2d);
-int createG2d(sec_g2d_t *g2d);
-#endif
-
-int createMem (struct s3c_mem_t *mem, unsigned int index, unsigned int size);
-int destroyMem(struct s3c_mem_t *mem);
-int checkMem (struct s3c_mem_t *mem, unsigned int index, unsigned int size);
-
-#ifdef USE_HW_PMEM
-int createPmem (sec_pmem_t *pm, unsigned int size);
-int destroyPmem(sec_pmem_t *pm);
-int checkPmem (sec_pmem_t *pm, unsigned int index, unsigned int size);
-#endif
+ struct sec_img *src_img, struct sec_rect *src_rect,
+ struct sec_img *dst_img, struct sec_rect *dst_rect,
+ uint32_t transform);
+int check_yuv_format(unsigned int color_format);
#endif /* ANDROID_SEC_HWC_UTILS_H_*/