From e6a23d7713f657f9aadf8339fd37f8e1c20e45b4 Mon Sep 17 00:00:00 2001 From: Andrew Dodd Date: Sun, 2 Dec 2012 21:50:58 -0500 Subject: hwc: Pull in updates from exynos3 hwc Change-Id: I61e1556da3e2d1e9a8b9c22163f4f11982bda7dc --- exynos4/hal/libhwcomposer/SecHWC.cpp | 82 +++++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 33 deletions(-) diff --git a/exynos4/hal/libhwcomposer/SecHWC.cpp b/exynos4/hal/libhwcomposer/SecHWC.cpp index d439216..1831125 100644 --- a/exynos4/hal/libhwcomposer/SecHWC.cpp +++ b/exynos4/hal/libhwcomposer/SecHWC.cpp @@ -527,40 +527,45 @@ static void get_hwc_ui_lay_skipdraw_decision(struct hwc_context_t* ctx, 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; + struct hwc_context_t* ctx = (struct hwc_context_t*)dev; + int overlay_win_cnt = 0; + int compositionType = 0; + int ret; + + // Compat + hwc_display_contents_1_t* list = NULL; + if (numDisplays > 0) { + list = displays[0]; + } + #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; + 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; + 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; + 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; - } + 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))) + //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.... @@ -656,7 +661,7 @@ static int hwc_prepare(hwc_composer_device_1_t *dev, size_t numDisplays, hwc_dis reset_win_rect_info(&ctx->win[i]); } } - } + return 0; } @@ -675,8 +680,6 @@ static int hwc_set(hwc_composer_device_1_t *dev, 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)); @@ -688,6 +691,9 @@ static int hwc_set(hwc_composer_device_1_t *dev, int rotVal = 0; #endif + // Only support one display + hwc_display_contents_1_t* list = displays[0]; + if (!list) { //turn off the all windows for (int i = 0; i < NUM_OF_WIN; i++) { @@ -887,7 +893,7 @@ static int hwc_set(hwc_composer_device_1_t *dev, } } #endif - } + return 0; } @@ -1036,12 +1042,22 @@ 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; -} + struct hwc_context_t* ctx = (struct hwc_context_t*)dev; + if (blank) { + // release our resources, the screen is turning off + // in our case, there is nothing to do. + ctx->num_of_fb_layer_prev = 0; + return 0; + } + else { + // No need to unblank, will unblank on set() + return 0; + } +} + static int hwc_device_open(const struct hw_module_t* module, const char* name, struct hw_device_t** device) { -- cgit v1.2.3