Refactor HAL to GL format conversions.
Bug 25390254
Change-Id: I434e6d319335be00204eff88f09c98b2dd4f2acc
Reviewed-on: https://swiftshader-review.googlesource.com/4188
Reviewed-by: Alexis Hétu <sugoi@google.com>
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/common/AndroidCommon.cpp b/src/OpenGL/common/AndroidCommon.cpp
index ff91c7b..861cf91 100644
--- a/src/OpenGL/common/AndroidCommon.cpp
+++ b/src/OpenGL/common/AndroidCommon.cpp
@@ -1,60 +1,58 @@
-#include <system/window.h>
-#include "GL/glcorearb.h"
-#include "GL/glext.h"
-#include "EGL/egl.h"
+#include "AndroidCommon.hpp"
+
+#include "../../Common/DebugAndroid.hpp"
+
+#include <GLES/glext.h>
+#include <system/graphics.h>
#define GL_RGB565 0x8D62
#define SW_YV12_BT601 0x32315659 // YCrCb 4:2:0 Planar, 16-byte aligned, BT.601 color space, studio swing
#define SW_YV12_BT709 0x48315659 // YCrCb 4:2:0 Planar, 16-byte aligned, BT.709 color space, studio swing
#define SW_YV12_JFIF 0x4A315659 // YCrCb 4:2:0 Planar, 16-byte aligned, BT.601 color space, full swing
-#include "AndroidCommon.hpp"
-
-#include "../../Common/DebugAndroid.hpp"
-#include "../../Common/GrallocAndroid.hpp"
-
-GLenum getColorFormatFromAndroid(int format)
+GLenum GLPixelFormatFromAndroid(int halFormat)
{
- switch(format)
- {
- 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_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;
- case HAL_PIXEL_FORMAT_BLOB:
- case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
- default:
- ALOGE("%s badness unsupported format=%x", __FUNCTION__, format);
- }
- return GL_RGBA;
+ 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:
+ 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;
+ case HAL_PIXEL_FORMAT_BLOB:
+ case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
+ default:
+ ALOGE("%s badness unsupported HAL format=%x", __FUNCTION__, halFormat);
+ }
+
+ return GL_RGBA;
}
-// Used internally
-GLenum getPixelFormatFromAndroid(int format)
+GLenum GLPixelTypeFromAndroid(int halFormat)
{
- switch(format)
- {
- case HAL_PIXEL_FORMAT_RGBA_8888:
- case HAL_PIXEL_FORMAT_RGBX_8888:
- case HAL_PIXEL_FORMAT_RGB_888:
- 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_BLOB:
- case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
- default:
- ALOGE("%s badness unsupported format=%x", __FUNCTION__, format);
- }
- return GL_UNSIGNED_BYTE;
+ switch(halFormat)
+ {
+ case HAL_PIXEL_FORMAT_RGBA_8888:
+ case HAL_PIXEL_FORMAT_RGBX_8888:
+ case HAL_PIXEL_FORMAT_RGB_888:
+ 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_BLOB:
+ case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
+ default:
+ ALOGE("%s badness unsupported HAL format=%x", __FUNCTION__, halFormat);
+ }
+
+ return GL_UNSIGNED_BYTE;
}
diff --git a/src/OpenGL/common/AndroidCommon.hpp b/src/OpenGL/common/AndroidCommon.hpp
index 15c6224..6112970 100644
--- a/src/OpenGL/common/AndroidCommon.hpp
+++ b/src/OpenGL/common/AndroidCommon.hpp
@@ -1,10 +1,9 @@
#ifndef ANDROID_COMMON
#define ANDROID_COMMON
-// Used internally
-GLenum getColorFormatFromAndroid(int format);
+#include <GLES/gl.h>
-// Used internally
-GLenum getPixelFormatFromAndroid(int format);
+GLenum GLPixelFormatFromAndroid(int format);
+GLenum GLPixelTypeFromAndroid(int format);
#endif // ANDROID_COMMON
diff --git a/src/OpenGL/common/Image.hpp b/src/OpenGL/common/Image.hpp
index 3b09bc7..f2fc2af 100644
--- a/src/OpenGL/common/Image.hpp
+++ b/src/OpenGL/common/Image.hpp
@@ -181,8 +181,8 @@
public:
explicit AndroidNativeImage(ANativeWindowBuffer *nativeBuffer)
: egl::Image(0, nativeBuffer->width, nativeBuffer->height, 1,
- getColorFormatFromAndroid(nativeBuffer->format),
- getPixelFormatFromAndroid(nativeBuffer->format)),
+ GLPixelFormatFromAndroid(nativeBuffer->format),
+ GLPixelTypeFromAndroid(nativeBuffer->format)),
nativeBuffer(nativeBuffer)
{
nativeBuffer->common.incRef(&nativeBuffer->common);
@@ -204,25 +204,30 @@
virtual void *lockInternal(int x, int y, int z, sw::Lock lock, sw::Accessor client)
{
LOGLOCK("image=%p op=%s.swsurface lock=%d", this, __FUNCTION__, lock);
+
// Always do this for reference counting.
void *data = sw::Surface::lockInternal(x, y, z, lock, client);
+
if(nativeBuffer)
{
- if (x || y || z)
+ if(x != 0 || y != 0 || z != 0)
{
ALOGI("badness: %s called with unsupported parms: image=%p x=%d y=%d z=%d", __FUNCTION__, this, x, y, z);
}
+
LOGLOCK("image=%p op=%s.ani lock=%d", this, __FUNCTION__, lock);
+
// Lock the ANativeWindowBuffer and use its address.
- data = lockNativeBuffer(
- GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
- if (lock == sw::LOCK_UNLOCKED)
+ data = lockNativeBuffer(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
+
+ if(lock == sw::LOCK_UNLOCKED)
{
// We're never going to get a corresponding unlock, so unlock
// immediately. This keeps the gralloc reference counts sane.
unlockNativeBuffer();
}
}
+
return data;
}
@@ -233,6 +238,7 @@
LOGLOCK("image=%p op=%s.ani", this, __FUNCTION__);
unlockNativeBuffer();
}
+
LOGLOCK("image=%p op=%s.swsurface", this, __FUNCTION__);
sw::Surface::unlockInternal();
}
@@ -241,6 +247,7 @@
{
LOGLOCK("image=%p op=%s lock=%d", this, __FUNCTION__, lock);
(void)sw::Surface::lockExternal(left, top, 0, lock, sw::PUBLIC);
+
return lockNativeBuffer(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
}
@@ -248,16 +255,16 @@
{
LOGLOCK("image=%p op=%s.ani", this, __FUNCTION__);
unlockNativeBuffer();
+
LOGLOCK("image=%p op=%s.swsurface", this, __FUNCTION__);
sw::Surface::unlockExternal();
}
void* lockNativeBuffer(int usage)
{
- void *buffer = 0;
- GrallocModule::getInstance()->lock(
- nativeBuffer->handle, usage, 0, 0,
- nativeBuffer->width, nativeBuffer->height, &buffer);
+ void *buffer = nullptr;
+ GrallocModule::getInstance()->lock(nativeBuffer->handle, usage, 0, 0, nativeBuffer->width, nativeBuffer->height, &buffer);
+
return buffer;
}