summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2009-10-28 21:00:29 -0700
committerMathias Agopian <mathias@google.com>2009-10-29 16:45:41 -0700
commitdf2d92940550bc68c3c237937bce7ac16d9fa91b (patch)
treea21e5e8b9975cc71a6451739c5cc0e3a025e2c43
parentb0d0de329d73a70e8825ab9a7069b4c56645dc48 (diff)
downloadframeworks_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.cpp4
-rw-r--r--opengl/libagl/copybit.cpp14
-rw-r--r--opengl/libs/EGL/egl.cpp28
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;