Commit f66c110c by Greg Hartman

Initial work to connect gralloc to egl::Image

Change-Id: Ia11a9520bb6525dc367e0b2956850574b29e4796 Reviewed-on: https://swiftshader-review.googlesource.com/2900Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent 46c70930
......@@ -9,6 +9,7 @@ LOCAL_SRC_FILES := \
Common/CPUID.cpp \
Common/Configurator.cpp \
Common/DebugAndroid.cpp \
Common/GrallocAndroid.cpp \
Common/Half.cpp \
Common/Math.cpp \
Common/Memory.cpp \
......@@ -65,6 +66,7 @@ LOCAL_SRC_FILES += \
Shader/VertexShader.cpp \
LOCAL_SRC_FILES += \
OpenGL/common/AndroidCommon.cpp \
OpenGL/common/NameSpace.cpp \
OpenGL/common/Object.cpp \
OpenGL/common/MatrixStack.cpp \
......
#include "GrallocAndroid.hpp"
#include <cutils/log.h>
GrallocModule* GrallocModule::getInstance()
{
static GrallocModule instance;
return &instance;
}
GrallocModule::GrallocModule()
{
const hw_module_t* module;
hw_get_module("converting_gralloc", &module);
if (module)
{
m_supportsConversion = true;
ALOGI("Loaded converting gralloc");
}
else
{
m_supportsConversion = false;
ALOGE("Falling back to standard gralloc with reduced format support");
hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);
}
if (!module)
{
ALOGE("Failed to load standard gralloc");
}
m_module = reinterpret_cast<const gralloc_module_t*>(module);
}
#ifndef GRALLOC_ANDROID
#define GRALLOC_ANDROID
#include <hardware/gralloc.h>
class GrallocModule
{
public:
static GrallocModule* getInstance();
bool supportsConversion() const { return m_supportsConversion; }
int lock(
buffer_handle_t handle, int usage,
int left, int top, int width, int height, void**vaddr) {
return m_module->lock(m_module, handle, 0, left, top, width, height, vaddr);
}
int unlock(buffer_handle_t handle) {
return m_module->unlock(m_module, handle);
}
private:
GrallocModule();
bool m_supportsConversion;
const gralloc_module_t* m_module;
};
#endif // GRALLOC_ANDROID
#include <system/window.h>
#include "GL/glcorearb.h"
#include "GL/glext.h"
#include "EGL/egl.h"
#define GL_RGB565_OES 0x8D62
#include "AndroidCommon.hpp"
#include "../../Common/DebugAndroid.hpp"
#include "../../Common/GrallocAndroid.hpp"
GLenum getColorFormatFromAndroid(int format)
{
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:
#if LATER
if (GrallocModule::getInstance()->supportsConversion()) {
return GL_RGB565_OES;
} else {
UNIMPLEMENTED();
return GL_RGB565_OES;
}
#else
return GL_RGB565_OES;
#endif
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;
}
// Used internally
GLenum getPixelFormatFromAndroid(int format)
{
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:
#if LATER
if (GrallocModule::getInstance()->supportsConversion()) {
return GL_UNSIGNED_SHORT_5_6_5;
} else {
UNIMPLEMENTED();
return GL_UNSIGNED_SHORT_5_6_5;
}
#else
return GL_UNSIGNED_SHORT_5_6_5;
#endif
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_UNSIGNED_BYTE;
}
// Used in V1 & V2 Context.cpp
GLenum isSupportedAndroidBuffer(GLuint name)
{
ANativeWindowBuffer *nativeBuffer = reinterpret_cast<ANativeWindowBuffer*>(name);
if(!name)
{
ALOGE("%s called with name==NULL %s:%d", __FUNCTION__, __FILE__, __LINE__);
return EGL_BAD_PARAMETER;
}
if(nativeBuffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
{
ALOGE("%s: failed: bad magic", __FUNCTION__);
return EGL_BAD_PARAMETER;
}
if(nativeBuffer->common.version != sizeof(ANativeWindowBuffer))
{
ALOGE("%s: failed: bad size", __FUNCTION__ );
return EGL_BAD_PARAMETER;
}
switch(nativeBuffer->format)
{
case HAL_PIXEL_FORMAT_RGBA_8888:
case HAL_PIXEL_FORMAT_RGBX_8888:
return EGL_SUCCESS;
case HAL_PIXEL_FORMAT_RGB_565:
#if LATER
if (GrallocModule::getInstance()->supportsConversion()) {
return EGL_SUCCESS;
} else {
ALOGE("%s: failed: bad format", __FUNCTION__ );
return EGL_BAD_PARAMETER;
}
#else
return EGL_SUCCESS;
#endif
default:
ALOGE("%s: failed: bad format", __FUNCTION__ );
return EGL_BAD_PARAMETER;
}
}
#ifndef ANDROID_COMMON
#define ANDROID_COMMON
static inline GLenum getColorFormatFromAndroid(int format)
{
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_OES;
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;
}
// Used internally
GLenum getColorFormatFromAndroid(int format);
// Used internally
GLenum getPixelFormatFromAndroid(int format);
// Used in V1 & V2 Context.cpp
GLenum isSupportedAndroidBuffer(GLuint name);
static inline GLenum getPixelFormatFromAndroid(int format)
// Used in V1 & V2 Context.cpp
template <typename I> I* wrapAndroidNativeWindow(GLuint name)
{
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:
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_UNSIGNED_BYTE;
ANativeWindowBuffer *nativeBuffer = reinterpret_cast<ANativeWindowBuffer*>(name);
ALOGV("%s: wrapping %p", __FUNCTION__, nativeBuffer);
nativeBuffer->common.incRef(&nativeBuffer->common);
GLenum format = getColorFormatFromAndroid(nativeBuffer->format);
GLenum type = getPixelFormatFromAndroid(nativeBuffer->format);
I *image = new I(0, nativeBuffer->width, nativeBuffer->height, format, type);
image->setNativeBuffer(nativeBuffer);
image->markShared();
return image;
}
#endif // ANDROID_COMMON
......@@ -6,6 +6,7 @@
#if defined(__ANDROID__)
#include <hardware/gralloc.h>
#include <system/window.h>
#include "../../Common/GrallocAndroid.hpp"
#endif
#ifdef __ANDROID__
......@@ -35,7 +36,6 @@ public:
#if defined(__ANDROID__)
nativeBuffer = 0;
gralloc = 0;
#endif
}
......@@ -47,7 +47,6 @@ public:
#if defined(__ANDROID__)
nativeBuffer = 0;
gralloc = 0;
#endif
}
......@@ -185,35 +184,19 @@ protected:
#if defined(__ANDROID__)
ANativeWindowBuffer *nativeBuffer;
gralloc_module_t const *gralloc;
void initGralloc()
{
hw_module_t const *module;
hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);
gralloc = reinterpret_cast<gralloc_module_t const*>(module);
}
void* lockNativeBuffer(int usage)
{
if(!gralloc)
{
initGralloc();
}
void *buffer = 0;
gralloc->lock(gralloc, nativeBuffer->handle, usage, 0, 0, nativeBuffer->width, nativeBuffer->height, &buffer);
GrallocModule::getInstance()->lock(
nativeBuffer->handle, usage, 0, 0,
nativeBuffer->width, nativeBuffer->height, &buffer);
return buffer;
}
void unlockNativeBuffer()
{
if(!gralloc)
{
initGralloc();
}
gralloc->unlock(gralloc, nativeBuffer->handle);
GrallocModule::getInstance()->unlock(nativeBuffer->handle);
}
#endif
};
......
......@@ -2639,27 +2639,7 @@ EGLenum Context::validateSharedImage(EGLenum target, GLuint name, GLuint texture
#if defined(__ANDROID__)
else if(target == EGL_NATIVE_BUFFER_ANDROID)
{
ANativeWindowBuffer *nativeBuffer = reinterpret_cast<ANativeWindowBuffer*>(name);
if(nativeBuffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
{
return EGL_BAD_PARAMETER;
}
if(nativeBuffer->common.version != sizeof(ANativeWindowBuffer))
{
return EGL_BAD_PARAMETER;
}
switch(nativeBuffer->format)
{
case HAL_PIXEL_FORMAT_RGBA_8888:
case HAL_PIXEL_FORMAT_RGBX_8888:
case HAL_PIXEL_FORMAT_RGB_565:
break;
default:
return EGL_BAD_PARAMETER;
}
return isSupportedAndroidBuffer(name);
}
#endif
else UNREACHABLE();
......@@ -2684,17 +2664,7 @@ egl::Image *Context::createSharedImage(EGLenum target, GLuint name, GLuint textu
#if defined(__ANDROID__)
else if(target == EGL_NATIVE_BUFFER_ANDROID)
{
ANativeWindowBuffer *nativeBuffer = reinterpret_cast<ANativeWindowBuffer*>(name);
nativeBuffer->common.incRef(&nativeBuffer->common);
GLenum format = getColorFormatFromAndroid(nativeBuffer->format);
GLenum type = getPixelFormatFromAndroid(nativeBuffer->format);
es1::Image *image = new Image(0, nativeBuffer->width, nativeBuffer->height, format, type);
image->setNativeBuffer(nativeBuffer);
image->markShared();
return image;
return wrapAndroidNativeWindow<es1::Image>(name);
}
#endif
else UNREACHABLE();
......
......@@ -3967,27 +3967,7 @@ EGLenum Context::validateSharedImage(EGLenum target, GLuint name, GLuint texture
#if defined(__ANDROID__)
else if(target == EGL_NATIVE_BUFFER_ANDROID)
{
ANativeWindowBuffer *nativeBuffer = reinterpret_cast<ANativeWindowBuffer*>(name);
if(nativeBuffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
{
return EGL_BAD_PARAMETER;
}
if(nativeBuffer->common.version != sizeof(ANativeWindowBuffer))
{
return EGL_BAD_PARAMETER;
}
switch(nativeBuffer->format)
{
case HAL_PIXEL_FORMAT_RGBA_8888:
case HAL_PIXEL_FORMAT_RGBX_8888:
case HAL_PIXEL_FORMAT_RGB_565:
break;
default:
return EGL_BAD_PARAMETER;
}
return isSupportedAndroidBuffer(name);
}
#endif
else UNREACHABLE();
......@@ -4025,17 +4005,7 @@ egl::Image *Context::createSharedImage(EGLenum target, GLuint name, GLuint textu
#if defined(__ANDROID__)
else if(target == EGL_NATIVE_BUFFER_ANDROID)
{
ANativeWindowBuffer *nativeBuffer = reinterpret_cast<ANativeWindowBuffer*>(name);
nativeBuffer->common.incRef(&nativeBuffer->common);
GLenum format = getColorFormatFromAndroid(nativeBuffer->format);
GLenum type = getPixelFormatFromAndroid(nativeBuffer->format);
es2::Image *image = new Image(0, nativeBuffer->width, nativeBuffer->height, format, type);
image->setNativeBuffer(nativeBuffer);
image->markShared();
return image;
return wrapAndroidNativeWindow<es2::Image>(name);
}
#endif
else UNREACHABLE();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment