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