hwc: Pull in updates from exynos3 hwc
authorAndrew Dodd <atd7@cornell.edu>
Mon, 3 Dec 2012 02:50:58 +0000 (21:50 -0500)
committerEspen Fjellvær Olsen <espen@mrfjo.org>
Tue, 11 Dec 2012 12:45:31 +0000 (13:45 +0100)
Change-Id: I61e1556da3e2d1e9a8b9c22163f4f11982bda7dc

exynos4/hal/libhwcomposer/SecHWC.cpp

index d43921615e5dbf630036c029da46429e347698ba..18311250b184bb37f27daeed252b62b671dc5da7 100644 (file)
@@ -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)
 {