Implement basic ANDROID_image_native_buffer support.

Change-Id: I7e844eb7c313455d48cd2fc09440f10d639b4c77
Reviewed-on: https://swiftshader-review.googlesource.com/2758
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Greg Hartman <ghartman@google.com>
Reviewed-by: Ping-Hao Wu <pinghao@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLESv2/Image.cpp b/src/OpenGL/libGLESv2/Image.cpp
index 6a36db5..dd8acd7 100644
--- a/src/OpenGL/libGLESv2/Image.cpp
+++ b/src/OpenGL/libGLESv2/Image.cpp
@@ -53,13 +53,13 @@
 		UNIMPLEMENTED();
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<Alpha>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		memcpy(dest + xoffset, source, width);
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<AlphaFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		const float *sourceF = reinterpret_cast<const float*>(source);
@@ -74,7 +74,7 @@
 		}
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<AlphaHalfFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		const unsigned short *sourceH = reinterpret_cast<const unsigned short*>(source);
@@ -89,13 +89,13 @@
 		}
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<Luminance>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		memcpy(dest + xoffset, source, width);
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<LuminanceFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		const float *sourceF = reinterpret_cast<const float*>(source);
@@ -110,7 +110,7 @@
 		}
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<LuminanceHalfFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		const unsigned short *sourceH = reinterpret_cast<const unsigned short*>(source);
@@ -125,13 +125,13 @@
 		}
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<LuminanceAlpha>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		memcpy(dest + xoffset * 2, source, width * 2);
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<LuminanceAlphaFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		const float *sourceF = reinterpret_cast<const float*>(source);
@@ -146,7 +146,7 @@
 		}
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<LuminanceAlphaHalfFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		const unsigned short *sourceH = reinterpret_cast<const unsigned short*>(source);
@@ -161,7 +161,7 @@
 		}
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<RGBUByte>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		unsigned char *destB = dest + xoffset * 4;
@@ -175,7 +175,7 @@
 		}
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<RGB565>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		const unsigned short *source565 = reinterpret_cast<const unsigned short*>(source);
@@ -191,7 +191,7 @@
 		}
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<RGBFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		const float *sourceF = reinterpret_cast<const float*>(source);
@@ -206,7 +206,7 @@
 		}
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<RGBHalfFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		const unsigned short *sourceH = reinterpret_cast<const unsigned short*>(source);
@@ -221,7 +221,7 @@
 		}
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<RGBAUByte>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		const unsigned int *sourceI = reinterpret_cast<const unsigned int*>(source);
@@ -234,7 +234,7 @@
 		}
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<RGBA4444>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		const unsigned short *source4444 = reinterpret_cast<const unsigned short*>(source);
@@ -250,7 +250,7 @@
 		}
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<RGBA5551>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		const unsigned short *source5551 = reinterpret_cast<const unsigned short*>(source);
@@ -266,25 +266,25 @@
 		}
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<RGBAFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		memcpy(dest + xoffset * 16, source, width * 16);
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<RGBAHalfFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		memcpy(dest + xoffset * 8, source, width * 8);
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<BGRA>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		memcpy(dest + xoffset * 4, source, width * 4);
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<D16>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		const unsigned short *sourceD16 = reinterpret_cast<const unsigned short*>(source);
@@ -296,7 +296,7 @@
 		}
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<D24>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		const unsigned int *sourceD24 = reinterpret_cast<const unsigned int*>(source);
@@ -308,7 +308,7 @@
 		}
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<D32>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		const unsigned int *sourceD32 = reinterpret_cast<const unsigned int*>(source);
@@ -320,7 +320,7 @@
 		}
 	}
 
-	template<>

+	template<>
 	void LoadImageRow<S8>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		const unsigned int *sourceI = reinterpret_cast<const unsigned int*>(source);
@@ -670,4 +670,44 @@
 
 		unlock();
 	}
-}
\ No newline at end of file
+
+	#if defined(__ANDROID__)
+	GLenum Image::getColorFormatFromAndroid(int format)
+	{
+		switch(format)
+		{
+		case HAL_PIXEL_FORMAT_RGBA_8888:
+		case HAL_PIXEL_FORMAT_RGBX_8888:
+			return GL_RGBA;
+		case HAL_PIXEL_FORMAT_RGB_888:
+			return GL_RGB;
+		case HAL_PIXEL_FORMAT_RGB_565:
+			return GL_RGB565_OES;
+		case HAL_PIXEL_FORMAT_BGRA_8888:
+			return GL_BGRA_EXT;
+		case HAL_PIXEL_FORMAT_sRGB_A_8888:
+		case HAL_PIXEL_FORMAT_sRGB_X_8888:
+		case HAL_PIXEL_FORMAT_YV12:
+		case HAL_PIXEL_FORMAT_Y8:
+		case HAL_PIXEL_FORMAT_Y16:
+		case HAL_PIXEL_FORMAT_RAW_SENSOR:
+		case HAL_PIXEL_FORMAT_BLOB:
+		case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
+		case HAL_PIXEL_FORMAT_YCbCr_420_888:
+		default:
+			UNIMPLEMENTED();
+		}
+		return GL_RGBA;
+	}
+
+	GLenum Image::getPixelFormatFromAndroid(int format)
+	{
+		if(format == HAL_PIXEL_FORMAT_Y16)
+		{
+			return GL_UNSIGNED_SHORT;
+		}
+
+		return GL_UNSIGNED_BYTE;
+	}
+	#endif
+}