diff options
| author | 2013-08-24 00:12:41 +0000 | |
|---|---|---|
| committer | 2013-08-24 00:12:42 +0000 | |
| commit | f2e4fcd96c11861bd0af1a9525344c1b691c9de9 (patch) | |
| tree | d271ba56545d7b9ff1569a5cbfedd60c380976a4 | |
| parent | ed127ea3834045597a072dcf31877ff3084582ff (diff) | |
| parent | bef42c50ebda2d63400f92611e1dd857c03bb38c (diff) | |
Merge changes I34935d21,If423cd29 into klp-dev
* changes:
handle several vsync signal correctly
only use format compatible with CPU consumers
| -rw-r--r-- | opengl/libs/EGL/eglApi.cpp | 43 | ||||
| -rw-r--r-- | services/surfaceflinger/DisplayHardware/HWComposer.cpp | 22 | ||||
| -rw-r--r-- | services/surfaceflinger/DisplayHardware/HWComposer.h | 4 |
3 files changed, 46 insertions, 23 deletions
diff --git a/opengl/libs/EGL/eglApi.cpp b/opengl/libs/EGL/eglApi.cpp index a81c450277..7410c12e25 100644 --- a/opengl/libs/EGL/eglApi.cpp +++ b/opengl/libs/EGL/eglApi.cpp @@ -386,8 +386,6 @@ static int modifyFormatColorspace(int fmt, EGLint colorspace) { switch (fmt) { case HAL_PIXEL_FORMAT_RGBA_8888: return HAL_PIXEL_FORMAT_sRGB_A_8888; case HAL_PIXEL_FORMAT_RGBX_8888: return HAL_PIXEL_FORMAT_sRGB_X_8888; - // TODO: this should go away once drivers stop using BGRA EGLConfigs - case HAL_PIXEL_FORMAT_BGRA_8888: return HAL_PIXEL_FORMAT_sRGB_A_8888; } } return fmt; @@ -410,24 +408,39 @@ EGLSurface eglCreateWindowSurface( EGLDisplay dpy, EGLConfig config, return setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); } - // Set the native window's buffers format to match this config. + // Set the native window's buffers format to match what this config requests. // Whether to use sRGB gamma is not part of the EGLconfig, but is part // of our native format. So if sRGB gamma is requested, we have to // modify the EGLconfig's format before setting the native window's // format. - EGLint format; - if (!cnx->egl.eglGetConfigAttrib(iDpy, config, EGL_NATIVE_VISUAL_ID, - &format)) { - ALOGE("eglGetConfigAttrib(EGL_NATIVE_VISUAL_ID) failed: %#x", - eglGetError()); - format = 0; + + // by default, just pick RGBA_8888 + EGLint format = HAL_PIXEL_FORMAT_RGBA_8888; + + EGLint a = 0; + cnx->egl.eglGetConfigAttrib(iDpy, config, EGL_ALPHA_SIZE, &a); + if (a > 0) { + // alpha-channel requested, there's really only one suitable format + format = HAL_PIXEL_FORMAT_RGBA_8888; + } else { + EGLint r, g, b; + r = g = b = 0; + cnx->egl.eglGetConfigAttrib(iDpy, config, EGL_RED_SIZE, &r); + cnx->egl.eglGetConfigAttrib(iDpy, config, EGL_GREEN_SIZE, &g); + cnx->egl.eglGetConfigAttrib(iDpy, config, EGL_BLUE_SIZE, &b); + EGLint colorDepth = r + g + b; + if (colorDepth <= 16) { + format = HAL_PIXEL_FORMAT_RGB_565; + } else { + format = HAL_PIXEL_FORMAT_RGBX_8888; + } } - if (attrib_list) { - for (const EGLint* attr = attrib_list; *attr != EGL_NONE; - attr += 2) { - if (*attr == EGL_GL_COLORSPACE_KHR && - dp->haveExtension("EGL_KHR_gl_colorspace")) { - format = modifyFormatColorspace(format, *(attr+1)); + + // now select a corresponding sRGB format if needed + if (attrib_list && dp->haveExtension("EGL_KHR_gl_colorspace")) { + for (const EGLint* attr = attrib_list; *attr != EGL_NONE; attr += 2) { + if (*attr == EGL_GL_COLORSPACE_KHR) { + format = modifyFormatColorspace(format, attr[1]); } } } diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp index e7d0d239cf..32c55fd1fb 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp +++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp @@ -87,12 +87,17 @@ HWComposer::HWComposer( mFbDev(0), mHwc(0), mNumDisplays(1), mCBContext(new cb_context), mEventHandler(handler), - mVSyncCount(0), mDebugForceFakeVSync(false) + mDebugForceFakeVSync(false) { for (size_t i =0 ; i<MAX_HWC_DISPLAYS ; i++) { mLists[i] = 0; } + for (size_t i=0 ; i<HWC_NUM_PHYSICAL_DISPLAY_TYPES ; i++) { + mLastHwVSync[i] = 0; + mVSyncCounts[i] = 0; + } + char value[PROPERTY_VALUE_MAX]; property_get("debug.sf.no_hw_vsync", value, "0"); mDebugForceFakeVSync = atoi(value); @@ -278,10 +283,15 @@ void HWComposer::invalidate() { } void HWComposer::vsync(int disp, int64_t timestamp) { - ATRACE_INT("VSYNC", ++mVSyncCount&1); - mEventHandler.onVSyncReceived(disp, timestamp); - Mutex::Autolock _l(mLock); - mLastHwVSync = timestamp; + if (uint32_t(disp) < HWC_NUM_PHYSICAL_DISPLAY_TYPES) { + char tag[16]; + snprintf(tag, sizeof(tag), "VSYNC_%1u", disp); + ATRACE_INT(tag, ++mVSyncCounts[disp] & 1); + + mEventHandler.onVSyncReceived(disp, timestamp); + Mutex::Autolock _l(mLock); + mLastHwVSync[disp] = timestamp; + } } void HWComposer::hotplug(int disp, int connected) { @@ -415,7 +425,7 @@ nsecs_t HWComposer::getRefreshTimestamp(int disp) const { // the refresh period and whatever closest timestamp we have. Mutex::Autolock _l(mLock); nsecs_t now = systemTime(CLOCK_MONOTONIC); - return now - ((now - mLastHwVSync) % mDisplayData[disp].refresh); + return now - ((now - mLastHwVSync[disp]) % mDisplayData[disp].refresh); } sp<Fence> HWComposer::getDisplayFence(int disp) const { diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.h b/services/surfaceflinger/DisplayHardware/HWComposer.h index d901c621e8..9f961139b7 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.h +++ b/services/surfaceflinger/DisplayHardware/HWComposer.h @@ -342,14 +342,14 @@ private: cb_context* mCBContext; EventHandler& mEventHandler; - size_t mVSyncCount; + size_t mVSyncCounts[HWC_NUM_PHYSICAL_DISPLAY_TYPES]; sp<VSyncThread> mVSyncThread; bool mDebugForceFakeVSync; BitSet32 mAllocatedDisplayIDs; // protected by mLock mutable Mutex mLock; - mutable nsecs_t mLastHwVSync; + mutable nsecs_t mLastHwVSync[HWC_NUM_PHYSICAL_DISPLAY_TYPES]; // thread-safe mutable Mutex mEventControlLock; |