Return EGL_BAD_ATTRIBUTE for unsupported HAL formats. As prescribed by the EGL_ANDROID_image_native_buffer extension spec. Change-Id: Id4213e245d055971bd687f484dbc5efa7958adda Reviewed-on: https://swiftshader-review.googlesource.com/4518 Tested-by: Nicolas Capens <capn@google.com> Reviewed-by: Greg Hartman <ghartman@google.com> Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/common/Image.hpp b/src/OpenGL/common/Image.hpp index e03d729..cf1f7d4 100644 --- a/src/OpenGL/common/Image.hpp +++ b/src/OpenGL/common/Image.hpp
@@ -174,46 +174,28 @@ { switch(halFormat) { - case HAL_PIXEL_FORMAT_RGBA_8888: - return GL_RGBA; - case HAL_PIXEL_FORMAT_RGBX_8888: - return GL_RGB; - case HAL_PIXEL_FORMAT_RGB_888: - ALOGE("%s badness unsupported format HAL_PIXEL_FORMAT_RGB_888", __FUNCTION__); - return GL_RGB; - case HAL_PIXEL_FORMAT_BGRA_8888: - return GL_BGRA_EXT; - case HAL_PIXEL_FORMAT_RGB_565: - return GL_RGB565; - case HAL_PIXEL_FORMAT_YV12: - return SW_YV12_BT601; - default: - ALOGE("%s badness unsupported HAL format=%x", __FUNCTION__, halFormat); + case HAL_PIXEL_FORMAT_RGBA_8888: return GL_RGBA; + case HAL_PIXEL_FORMAT_RGBX_8888: return GL_RGB; + case HAL_PIXEL_FORMAT_RGB_888: return GL_NONE; // Unsupported + case HAL_PIXEL_FORMAT_BGRA_8888: return GL_BGRA_EXT; + case HAL_PIXEL_FORMAT_RGB_565: return GL_RGB565; + case HAL_PIXEL_FORMAT_YV12: return SW_YV12_BT601; + default: return GL_NONE; } - - return GL_RGBA; } inline GLenum GLPixelTypeFromAndroid(int halFormat) { switch(halFormat) { - case HAL_PIXEL_FORMAT_RGBA_8888: - case HAL_PIXEL_FORMAT_RGBX_8888: - case HAL_PIXEL_FORMAT_BGRA_8888: - return GL_UNSIGNED_BYTE; - case HAL_PIXEL_FORMAT_RGB_565: - return GL_UNSIGNED_SHORT_5_6_5; - case HAL_PIXEL_FORMAT_YV12: - return GL_UNSIGNED_BYTE; - case HAL_PIXEL_FORMAT_RGB_888: - ALOGE("%s badness unsupported format HAL_PIXEL_FORMAT_RGB_888", __FUNCTION__); - return GL_UNSIGNED_BYTE; - default: - ALOGE("%s badness unsupported HAL format=%x", __FUNCTION__, halFormat); + case HAL_PIXEL_FORMAT_RGBA_8888: return GL_UNSIGNED_BYTE; + case HAL_PIXEL_FORMAT_RGBX_8888: return GL_UNSIGNED_BYTE; + case HAL_PIXEL_FORMAT_RGB_888: return GL_NONE; // Unsupported + case HAL_PIXEL_FORMAT_BGRA_8888: return GL_UNSIGNED_BYTE; + case HAL_PIXEL_FORMAT_RGB_565: return GL_UNSIGNED_SHORT_5_6_5; + case HAL_PIXEL_FORMAT_YV12: return GL_UNSIGNED_BYTE; + default: return GL_NONE; } - - return GL_UNSIGNED_BYTE; } class AndroidNativeImage : public egl::Image
diff --git a/src/OpenGL/libEGL/libEGL.cpp b/src/OpenGL/libEGL/libEGL.cpp index 21065c4..8922f8f 100644 --- a/src/OpenGL/libEGL/libEGL.cpp +++ b/src/OpenGL/libEGL/libEGL.cpp
@@ -896,7 +896,15 @@ #if defined(__ANDROID__) if(target == EGL_NATIVE_BUFFER_ANDROID) { - return new AndroidNativeImage(reinterpret_cast<ANativeWindowBuffer*>(buffer)); + ANativeWindowBuffer *nativeBuffer = reinterpret_cast<ANativeWindowBuffer*>(buffer); + + if(!nativeBuffer || GLPixelFormatFromAndroid(nativeBuffer->format) == GL_NONE) + { + ALOGW("%s badness unsupported HAL format=%x", __FUNCTION__, nativeBuffer ? nativeBuffer->format : 0); + return error(EGL_BAD_ATTRIBUTE, EGL_NO_IMAGE_KHR); + } + + return new AndroidNativeImage(nativeBuffer); } #endif