From 7adf0e24868b88a1541bb88444a58d276d394e68 Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Tue, 15 Nov 2011 22:37:36 -0800 Subject: fix an issue were hwc wouldn't clear some areas of the screen. Bug: 5429709 Change-Id: I2be2be6ba2c7b89a19d79d0cbe6a4b894bb79261 --- libhwcomposer/Android.mk | 2 +- libhwcomposer/SecHWC.cpp | 25 +++++++++++++++++++++++++ libhwcomposer/SecHWCUtils.h | 1 + 3 files changed, 27 insertions(+), 1 deletion(-) (limited to 'libhwcomposer') diff --git a/libhwcomposer/Android.mk b/libhwcomposer/Android.mk index eb57887..f484dfd 100644 --- a/libhwcomposer/Android.mk +++ b/libhwcomposer/Android.mk @@ -21,7 +21,7 @@ LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_PRELINK_MODULE := false LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw -LOCAL_SHARED_LIBRARIES := liblog libcutils libEGL libhardware +LOCAL_SHARED_LIBRARIES := liblog libcutils libEGL libGLESv1_CM libhardware LOCAL_CFLAGS += -DLOG_TAG=\"hwcomposer\" LOCAL_C_INCLUDES := \ diff --git a/libhwcomposer/SecHWC.cpp b/libhwcomposer/SecHWC.cpp index 140a23e..6fe39a0 100644 --- a/libhwcomposer/SecHWC.cpp +++ b/libhwcomposer/SecHWC.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include "SecHWCUtils.h" static IMG_gralloc_module_public_t *gpsGrallocModule; @@ -291,6 +292,30 @@ static int hwc_set(hwc_composer_device_t *dev, struct sec_rect src_rect; struct sec_rect dst_rect; + + /* + * 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) { + /* we're clearing the screen using GLES here, this is very + * hack-ish, ideal we would use the fimc (if it can do it) */ + glDisable(GL_SCISSOR_TEST); + glClearColor(0, 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT); + glEnable(GL_SCISSOR_TEST); + } + + ctx->num_of_fb_layer_prev = ctx->num_of_fb_layer; + EGLBoolean sucess = eglSwapBuffers((EGLDisplay)dpy, (EGLSurface)sur); if (!sucess) { return HWC_EGL_ERROR; diff --git a/libhwcomposer/SecHWCUtils.h b/libhwcomposer/SecHWCUtils.h index 7715cb4..880e073 100644 --- a/libhwcomposer/SecHWCUtils.h +++ b/libhwcomposer/SecHWCUtils.h @@ -117,6 +117,7 @@ struct hwc_context_t { s5p_fimc_t fimc; unsigned int num_of_fb_layer; unsigned int num_of_hwc_layer; + unsigned int num_of_fb_layer_prev; }; int window_open(struct hwc_win_info_t *win, int id); -- cgit v1.1