diff options
author | Mathias Agopian <mathias@google.com> | 2009-10-28 21:00:29 -0700 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2009-10-29 16:45:41 -0700 |
commit | df2d92940550bc68c3c237937bce7ac16d9fa91b (patch) | |
tree | a21e5e8b9975cc71a6451739c5cc0e3a025e2c43 | |
parent | b0d0de329d73a70e8825ab9a7069b4c56645dc48 (diff) | |
download | frameworks_native-df2d92940550bc68c3c237937bce7ac16d9fa91b.zip frameworks_native-df2d92940550bc68c3c237937bce7ac16d9fa91b.tar.gz frameworks_native-df2d92940550bc68c3c237937bce7ac16d9fa91b.tar.bz2 |
return proper error code from eglCreateImageKHR
-rw-r--r-- | libs/surfaceflinger/LayerBuffer.cpp | 4 | ||||
-rw-r--r-- | opengl/libagl/copybit.cpp | 14 | ||||
-rw-r--r-- | opengl/libs/EGL/egl.cpp | 28 |
3 files changed, 39 insertions, 7 deletions
diff --git a/libs/surfaceflinger/LayerBuffer.cpp b/libs/surfaceflinger/LayerBuffer.cpp index 6590503..f70bcf4 100644 --- a/libs/surfaceflinger/LayerBuffer.cpp +++ b/libs/surfaceflinger/LayerBuffer.cpp @@ -437,9 +437,7 @@ void LayerBuffer::BufferSource::onDraw(const Region& clip) const } if (err != NO_ERROR) { - // OpenGL fall-back - GLuint w = 0; - GLuint h = 0; + // slower fallback GGLSurface t; t.version = sizeof(GGLSurface); t.width = src.crop.r; diff --git a/opengl/libagl/copybit.cpp b/opengl/libagl/copybit.cpp index 4b9e59b..d73d6dd 100644 --- a/opengl/libagl/copybit.cpp +++ b/opengl/libagl/copybit.cpp @@ -74,6 +74,7 @@ private: static int iterate_done(copybit_region_t const *, copybit_rect_t*) { return 0; } +public: copybit_rect_t r; }; @@ -421,6 +422,19 @@ static bool copybit(GLint x, GLint y, (enables & GGL_ENABLE_DITHER) ? COPYBIT_ENABLE : COPYBIT_DISABLE); clipRectRegion it(c); + + LOGD("dst={%d, %d, %d, %p, %p}, " + "src={%d, %d, %d, %p, %p}, " + "drect={%d,%d,%d,%d}, " + "srect={%d,%d,%d,%d}, " + "it={%d,%d,%d,%d}, " , + dst.w, dst.h, dst.format, dst.base, dst.handle, + src.w, src.h, src.format, src.base, src.handle, + drect.l, drect.t, drect.r, drect.b, + srect.l, srect.t, srect.r, srect.b, + it.r.l, it.r.t, it.r.r, it.r.b + ); + err = copybit->stretch(copybit, &dst, &src, &drect, &srect, &it); } if (err != NO_ERROR) { diff --git a/opengl/libs/EGL/egl.cpp b/opengl/libs/EGL/egl.cpp index 3efb678..5efecb0 100644 --- a/opengl/libs/EGL/egl.cpp +++ b/opengl/libs/EGL/egl.cpp @@ -1641,8 +1641,13 @@ EGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, if (dp == 0) { return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR); } - // since we don't have a way to know which implementation to call, - // we're calling all of them + + /* Since we don't have a way to know which implementation to call, + * we're calling all of them. If at least one of the implementation + * succeeded, this is a success. + */ + + EGLint currentError = eglGetError(); EGLImageKHR implImages[IMPL_NUM_IMPLEMENTATIONS]; bool success = false; @@ -1659,9 +1664,24 @@ EGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, } } } - if (!success) + + if (!success) { + // failure, if there was an error when we entered this function, + // the error flag must not be updated. + // Otherwise, the error is whatever happened in the implementation + // that faulted. + if (currentError != EGL_SUCCESS) { + setError(currentError, EGL_NO_IMAGE_KHR); + } return EGL_NO_IMAGE_KHR; - + } else { + // In case of success, we need to clear all error flags + // (especially those caused by the implementation that didn't + // succeed). TODO: we could about this if we knew this was + // a "full" success (all implementation succeeded). + eglGetError(); + } + egl_image_t* result = new egl_image_t(dpy, ctx); memcpy(result->images, implImages, sizeof(implImages)); return (EGLImageKHR)result; |