diff options
Diffstat (limited to 'libs/ui')
| -rw-r--r-- | libs/ui/EGLUtils.cpp | 41 | ||||
| -rw-r--r-- | libs/ui/FramebufferNativeWindow.cpp | 41 |
2 files changed, 68 insertions, 14 deletions
diff --git a/libs/ui/EGLUtils.cpp b/libs/ui/EGLUtils.cpp index 80bfdfd..1663313 100644 --- a/libs/ui/EGLUtils.cpp +++ b/libs/ui/EGLUtils.cpp @@ -17,6 +17,7 @@ #define LOG_TAG "EGLUtils" +#include <cutils/log.h> #include <utils/Errors.h> #include <ui/EGLUtils.h> @@ -29,6 +30,28 @@ namespace android { // ---------------------------------------------------------------------------- +const char *EGLUtils::strerror(EGLint err) +{ + switch (err){ + case EGL_SUCCESS: return "EGL_SUCCESS"; + case EGL_NOT_INITIALIZED: return "EGL_NOT_INITIALIZED"; + case EGL_BAD_ACCESS: return "EGL_BAD_ACCESS"; + case EGL_BAD_ALLOC: return "EGL_BAD_ALLOC"; + case EGL_BAD_ATTRIBUTE: return "EGL_BAD_ATTRIBUTE"; + case EGL_BAD_CONFIG: return "EGL_BAD_CONFIG"; + case EGL_BAD_CONTEXT: return "EGL_BAD_CONTEXT"; + case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE"; + case EGL_BAD_DISPLAY: return "EGL_BAD_DISPLAY"; + case EGL_BAD_MATCH: return "EGL_BAD_MATCH"; + case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP"; + case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW"; + case EGL_BAD_PARAMETER: return "EGL_BAD_PARAMETER"; + case EGL_BAD_SURFACE: return "EGL_BAD_SURFACE"; + case EGL_CONTEXT_LOST: return "EGL_CONTEXT_LOST"; + default: return "UNKNOWN"; + } +} + status_t EGLUtils::selectConfigForPixelFormat( EGLDisplay dpy, EGLint const* attrs, @@ -37,6 +60,9 @@ status_t EGLUtils::selectConfigForPixelFormat( { EGLint numConfigs = -1, n=0; + if (!attrs) + return BAD_VALUE; + if (outConfig == NULL) return BAD_VALUE; @@ -65,12 +91,13 @@ status_t EGLUtils::selectConfigForPixelFormat( EGLConfig config = NULL; for (i=0 ; i<n ; i++) { EGLint r,g,b,a; - eglGetConfigAttrib(dpy, configs[i], EGL_RED_SIZE, &r); - eglGetConfigAttrib(dpy, configs[i], EGL_GREEN_SIZE, &g); - eglGetConfigAttrib(dpy, configs[i], EGL_BLUE_SIZE, &b); - eglGetConfigAttrib(dpy, configs[i], EGL_ALPHA_SIZE, &a); + EGLConfig curr = configs[i]; + eglGetConfigAttrib(dpy, curr, EGL_RED_SIZE, &r); + eglGetConfigAttrib(dpy, curr, EGL_GREEN_SIZE, &g); + eglGetConfigAttrib(dpy, curr, EGL_BLUE_SIZE, &b); + eglGetConfigAttrib(dpy, curr, EGL_ALPHA_SIZE, &a); if (fbSzA == a && fbSzR == r && fbSzG == g && fbSzB == b) { - config = configs[i]; + config = curr; break; } } @@ -93,6 +120,10 @@ status_t EGLUtils::selectConfigForNativeWindow( { int err; int format; + + if (!window) + return BAD_VALUE; + if ((err = window->query(window, NATIVE_WINDOW_FORMAT, &format)) < 0) { return err; } diff --git a/libs/ui/FramebufferNativeWindow.cpp b/libs/ui/FramebufferNativeWindow.cpp index 7b85c7f..f6c666d 100644 --- a/libs/ui/FramebufferNativeWindow.cpp +++ b/libs/ui/FramebufferNativeWindow.cpp @@ -25,6 +25,7 @@ #include <cutils/log.h> #include <cutils/atomic.h> #include <utils/threads.h> +#include <utils/RefBase.h> #include <ui/SurfaceComposerClient.h> #include <ui/Rect.h> @@ -81,10 +82,16 @@ FramebufferNativeWindow::FramebufferNativeWindow() hw_module_t const* module; if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module) == 0) { int stride; - framebuffer_open(module, &fbDev); - gralloc_open(module, &grDev); int err; + err = framebuffer_open(module, &fbDev); + LOGE_IF(err, "couldn't open framebuffer HAL (%s)", strerror(-err)); + + err = gralloc_open(module, &grDev); + LOGE_IF(err, "couldn't open gralloc HAL (%s)", strerror(-err)); + // bail out if we can't initialize the modules + if (!fbDev || !grDev) + return; mUpdateOnDemand = (fbDev->setUpdateRect != 0); @@ -127,11 +134,19 @@ FramebufferNativeWindow::FramebufferNativeWindow() android_native_window_t::query = query; } -FramebufferNativeWindow::~FramebufferNativeWindow() { - grDev->free(grDev, buffers[0]->handle); - grDev->free(grDev, buffers[1]->handle); - gralloc_close(grDev); - framebuffer_close(fbDev); +FramebufferNativeWindow::~FramebufferNativeWindow() +{ + if (grDev) { + if (buffers[0] != NULL) + grDev->free(grDev, buffers[0]->handle); + if (buffers[1] != NULL) + grDev->free(grDev, buffers[1]->handle); + gralloc_close(grDev); + } + + if (fbDev) { + framebuffer_close(fbDev); + } } status_t FramebufferNativeWindow::setUpdateRectangle(const Rect& r) @@ -216,6 +231,7 @@ int FramebufferNativeWindow::query(android_native_window_t* window, *value = fb->format; return NO_ERROR; } + *value = 0; return BAD_VALUE; } @@ -223,9 +239,16 @@ int FramebufferNativeWindow::query(android_native_window_t* window, }; // namespace android // ---------------------------------------------------------------------------- +using namespace android; EGLNativeWindowType android_createDisplaySurface(void) { - return new android::FramebufferNativeWindow(); + FramebufferNativeWindow* w; + w = new FramebufferNativeWindow(); + if (w->getDevice() == NULL) { + // get a ref so it can be destroyed when we exit this block + sp<FramebufferNativeWindow> ref(w); + return NULL; + } + return (EGLNativeWindowType)w; } - |
