Implement EGL_ANDROID_image_native_buffer.
BUG=angleproject:2508
Change-Id: I8ef2ce8320edeb336727905055f47bb299dec2ea
Reviewed-on: https://chromium-review.googlesource.com/c/1238886
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Yuly Novikov <ynovikov@chromium.org>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/DisplayImpl.cpp b/src/libANGLE/renderer/DisplayImpl.cpp
index 80c044a..cbfc1a8 100644
--- a/src/libANGLE/renderer/DisplayImpl.cpp
+++ b/src/libANGLE/renderer/DisplayImpl.cpp
@@ -44,6 +44,15 @@
return egl::EglBadDisplay() << "DisplayImpl::validateClientBuffer unimplemented.";
}
+egl::Error DisplayImpl::validateImageClientBuffer(const gl::Context *context,
+ EGLenum target,
+ EGLClientBuffer clientBuffer,
+ const egl::AttributeMap &attribs) const
+{
+ UNREACHABLE();
+ return egl::EglBadDisplay() << "DisplayImpl::validateImageClientBuffer unimplemented.";
+}
+
const egl::Caps &DisplayImpl::getCaps() const
{
if (!mCapsInitialized)
diff --git a/src/libANGLE/renderer/DisplayImpl.h b/src/libANGLE/renderer/DisplayImpl.h
index cb3515d..45bedd9 100644
--- a/src/libANGLE/renderer/DisplayImpl.h
+++ b/src/libANGLE/renderer/DisplayImpl.h
@@ -66,6 +66,10 @@
EGLenum buftype,
EGLClientBuffer clientBuffer,
const egl::AttributeMap &attribs) const;
+ virtual egl::Error validateImageClientBuffer(const gl::Context *context,
+ EGLenum target,
+ EGLClientBuffer clientBuffer,
+ const egl::AttributeMap &attribs) const;
virtual std::string getVendorString() const = 0;
diff --git a/src/libANGLE/renderer/EGLImplFactory.h b/src/libANGLE/renderer/EGLImplFactory.h
index 72530f0..181cc01 100644
--- a/src/libANGLE/renderer/EGLImplFactory.h
+++ b/src/libANGLE/renderer/EGLImplFactory.h
@@ -31,6 +31,7 @@
{
class ContextImpl;
class ImageImpl;
+class ExternalImageSiblingImpl;
class SurfaceImpl;
class EGLImplFactory : angle::NonCopyable
@@ -41,16 +42,16 @@
virtual SurfaceImpl *createWindowSurface(const egl::SurfaceState &state,
EGLNativeWindowType window,
- const egl::AttributeMap &attribs) = 0;
+ const egl::AttributeMap &attribs) = 0;
virtual SurfaceImpl *createPbufferSurface(const egl::SurfaceState &state,
- const egl::AttributeMap &attribs) = 0;
+ const egl::AttributeMap &attribs) = 0;
virtual SurfaceImpl *createPbufferFromClientBuffer(const egl::SurfaceState &state,
EGLenum buftype,
EGLClientBuffer clientBuffer,
const egl::AttributeMap &attribs) = 0;
virtual SurfaceImpl *createPixmapSurface(const egl::SurfaceState &state,
NativePixmapType nativePixmap,
- const egl::AttributeMap &attribs) = 0;
+ const egl::AttributeMap &attribs) = 0;
virtual ImageImpl *createImage(const egl::ImageState &state,
const gl::Context *context,
@@ -65,6 +66,15 @@
virtual StreamProducerImpl *createStreamProducerD3DTexture(
egl::Stream::ConsumerType consumerType,
const egl::AttributeMap &attribs) = 0;
+
+ virtual ExternalImageSiblingImpl *createExternalImageSibling(const gl::Context *context,
+ EGLenum target,
+ EGLClientBuffer buffer,
+ const egl::AttributeMap &attribs)
+ {
+ UNREACHABLE();
+ return nullptr;
+ }
};
} // namespace rx
diff --git a/src/libANGLE/renderer/ImageImpl.h b/src/libANGLE/renderer/ImageImpl.h
index d044639..8f5d720 100644
--- a/src/libANGLE/renderer/ImageImpl.h
+++ b/src/libANGLE/renderer/ImageImpl.h
@@ -11,6 +11,8 @@
#include "common/angleutils.h"
#include "libANGLE/Error.h"
+#include "libANGLE/formatutils.h"
+#include "libANGLE/renderer/FramebufferAttachmentObjectImpl.h"
namespace gl
{
@@ -26,6 +28,18 @@
namespace rx
{
+class ExternalImageSiblingImpl : public FramebufferAttachmentObjectImpl
+{
+ public:
+ virtual ~ExternalImageSiblingImpl() {}
+
+ virtual gl::Format getFormat() const = 0;
+ virtual bool isRenderable(const gl::Context *context) const = 0;
+ virtual bool isTexturable(const gl::Context *context) const = 0;
+ virtual gl::Extents getSize() const = 0;
+ virtual size_t getSamples() const = 0;
+};
+
class ImageImpl : angle::NonCopyable
{
public:
diff --git a/src/libANGLE/renderer/gl/egl/DisplayEGL.cpp b/src/libANGLE/renderer/gl/egl/DisplayEGL.cpp
index 54c8056..e19fa47 100644
--- a/src/libANGLE/renderer/gl/egl/DisplayEGL.cpp
+++ b/src/libANGLE/renderer/gl/egl/DisplayEGL.cpp
@@ -131,6 +131,8 @@
outExtensions->glTexture3DImage = mEGL->hasExtension("EGL_KHR_gl_texture_3D_image");
outExtensions->glRenderbufferImage = mEGL->hasExtension("EGL_KHR_gl_renderbuffer_image");
+ outExtensions->imageNativeBuffer = mEGL->hasExtension("EGL_ANDROID_image_native_buffer");
+
DisplayGL::generateExtensions(outExtensions);
}
diff --git a/src/libANGLE/renderer/gl/egl/ExternalImageSiblingEGL.h b/src/libANGLE/renderer/gl/egl/ExternalImageSiblingEGL.h
new file mode 100644
index 0000000..17c8631
--- /dev/null
+++ b/src/libANGLE/renderer/gl/egl/ExternalImageSiblingEGL.h
@@ -0,0 +1,29 @@
+//
+// Copyright 2018 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// ExternalImageSiblingEGL.h: Defines the ExternalImageSiblingEGL interface to abstract all external
+// image siblings in the EGL backend
+
+#ifndef LIBANGLE_RENDERER_GL_EGL_EXTERNALIMAGESIBLINGEGL_H_
+#define LIBANGLE_RENDERER_GL_EGL_EXTERNALIMAGESIBLINGEGL_H_
+
+#include "libANGLE/renderer/ImageImpl.h"
+
+namespace rx
+{
+
+class ExternalImageSiblingEGL : public ExternalImageSiblingImpl
+{
+ public:
+ ExternalImageSiblingEGL() {}
+ virtual ~ExternalImageSiblingEGL() {}
+
+ virtual EGLClientBuffer getBuffer() const = 0;
+};
+
+} // namespace rx
+
+#endif // LIBANGLE_RENDERER_GL_EGL_EXTERNALIMAGESIBLINGEGL_H_
diff --git a/src/libANGLE/renderer/gl/egl/ImageEGL.cpp b/src/libANGLE/renderer/gl/egl/ImageEGL.cpp
index 12b5ceb..6a903fa 100644
--- a/src/libANGLE/renderer/gl/egl/ImageEGL.cpp
+++ b/src/libANGLE/renderer/gl/egl/ImageEGL.cpp
@@ -15,6 +15,7 @@
#include "libANGLE/renderer/gl/StateManagerGL.h"
#include "libANGLE/renderer/gl/TextureGL.h"
#include "libANGLE/renderer/gl/egl/ContextEGL.h"
+#include "libANGLE/renderer/gl/egl/ExternalImageSiblingEGL.h"
#include "libANGLE/renderer/gl/egl/FunctionsEGL.h"
namespace rx
@@ -71,6 +72,13 @@
buffer = gl_egl::GLObjectHandleToEGLClientBuffer(renderbufferGL->getRenderbufferID());
mNativeInternalFormat = renderbufferGL->getNativeInternalFormat();
}
+ else if (egl::IsExternalImageTarget(mTarget))
+ {
+ const ExternalImageSiblingEGL *externalImageSibling =
+ GetImplAs<ExternalImageSiblingEGL>(GetAs<egl::ExternalImageSibling>(mState.source));
+ buffer = externalImageSibling->getBuffer();
+ mNativeInternalFormat = externalImageSibling->getFormat().info->sizedInternalFormat;
+ }
else
{
UNREACHABLE();
diff --git a/src/libANGLE/renderer/gl/egl/android/DisplayAndroid.cpp b/src/libANGLE/renderer/gl/egl/android/DisplayAndroid.cpp
index 3b9459b..f1ddecf 100644
--- a/src/libANGLE/renderer/gl/egl/android/DisplayAndroid.cpp
+++ b/src/libANGLE/renderer/gl/egl/android/DisplayAndroid.cpp
@@ -22,6 +22,7 @@
#include "libANGLE/renderer/gl/egl/PbufferSurfaceEGL.h"
#include "libANGLE/renderer/gl/egl/RendererEGL.h"
#include "libANGLE/renderer/gl/egl/WindowSurfaceEGL.h"
+#include "libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.h"
#include "libANGLE/renderer/gl/renderergl_utils.h"
namespace
@@ -453,6 +454,37 @@
return ANativeWindow_getFormat(window) >= 0;
}
+egl::Error DisplayAndroid::validateImageClientBuffer(const gl::Context *context,
+ EGLenum target,
+ EGLClientBuffer clientBuffer,
+ const egl::AttributeMap &attribs) const
+{
+ switch (target)
+ {
+ case EGL_NATIVE_BUFFER_ANDROID:
+ return egl::NoError();
+
+ default:
+ return DisplayEGL::validateImageClientBuffer(context, target, clientBuffer, attribs);
+ }
+}
+
+ExternalImageSiblingImpl *DisplayAndroid::createExternalImageSibling(
+ const gl::Context *context,
+ EGLenum target,
+ EGLClientBuffer buffer,
+ const egl::AttributeMap &attribs)
+{
+ switch (target)
+ {
+ case EGL_NATIVE_BUFFER_ANDROID:
+ return new NativeBufferImageSiblingAndroid(buffer);
+
+ default:
+ return DisplayEGL::createExternalImageSibling(context, target, buffer, attribs);
+ }
+}
+
DeviceImpl *DisplayAndroid::createDevice()
{
UNIMPLEMENTED();
diff --git a/src/libANGLE/renderer/gl/egl/android/DisplayAndroid.h b/src/libANGLE/renderer/gl/egl/android/DisplayAndroid.h
index cf75d36..e80f507 100644
--- a/src/libANGLE/renderer/gl/egl/android/DisplayAndroid.h
+++ b/src/libANGLE/renderer/gl/egl/android/DisplayAndroid.h
@@ -54,6 +54,15 @@
egl::Error restoreLostDevice(const egl::Display *display) override;
bool isValidNativeWindow(EGLNativeWindowType window) const override;
+ egl::Error validateImageClientBuffer(const gl::Context *context,
+ EGLenum target,
+ EGLClientBuffer clientBuffer,
+ const egl::AttributeMap &attribs) const override;
+
+ ExternalImageSiblingImpl *createExternalImageSibling(const gl::Context *context,
+ EGLenum target,
+ EGLClientBuffer buffer,
+ const egl::AttributeMap &attribs) override;
DeviceImpl *createDevice() override;
diff --git a/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.cpp b/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.cpp
new file mode 100644
index 0000000..f3125b9
--- /dev/null
+++ b/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.cpp
@@ -0,0 +1,98 @@
+//
+// Copyright 2018 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// NativeBufferImageSiblingAndroid.cpp: Implements the NativeBufferImageSiblingAndroid class
+
+#include "libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.h"
+
+#include "libANGLE/renderer/gl/egl/android/android_util.h"
+
+// Taken from cutils/native_handle.h:
+// https://android.googlesource.com/platform/system/core/+/master/libcutils/include/cutils/native_handle.h
+typedef struct native_handle
+{
+ int version; /* sizeof(native_handle_t) */
+ int numFds; /* number of file-descriptors at &data[0] */
+ int numInts; /* number of ints at &data[numFds] */
+ int data[0]; /* numFds + numInts ints */
+} native_handle_t;
+
+// Taken from nativebase/nativebase.h
+// https://android.googlesource.com/platform/frameworks/native/+/master/libs/nativebase/include/nativebase/nativebase.h
+typedef const native_handle_t *buffer_handle_t;
+
+typedef struct android_native_base_t
+{
+ /* a magic value defined by the actual EGL native type */
+ int magic;
+ /* the sizeof() of the actual EGL native type */
+ int version;
+ void *reserved[4];
+ /* reference-counting interface */
+ void (*incRef)(struct android_native_base_t *base);
+ void (*decRef)(struct android_native_base_t *base);
+} android_native_base_t;
+
+typedef struct ANativeWindowBuffer
+{
+ struct android_native_base_t common;
+ int width;
+ int height;
+ int stride;
+ int format;
+ int usage_deprecated;
+ uintptr_t layerCount;
+ void *reserved[1];
+ const native_handle_t *handle;
+ uint64_t usage;
+ // we needed extra space for storing the 64-bits usage flags
+ // the number of slots to use from reserved_proc depends on the
+ // architecture.
+ void *reserved_proc[8 - (sizeof(uint64_t) / sizeof(void *))];
+} ANativeWindowBuffer_t;
+
+namespace rx
+{
+NativeBufferImageSiblingAndroid::NativeBufferImageSiblingAndroid(EGLClientBuffer buffer)
+ : mBuffer(static_cast<struct ANativeWindowBuffer *>(buffer))
+{
+}
+
+NativeBufferImageSiblingAndroid::~NativeBufferImageSiblingAndroid()
+{
+}
+
+gl::Format NativeBufferImageSiblingAndroid::getFormat() const
+{
+ return gl::Format(android::NativePixelFormatToGLInternalFormat(mBuffer->format));
+}
+
+bool NativeBufferImageSiblingAndroid::isRenderable(const gl::Context *context) const
+{
+ return true;
+}
+
+bool NativeBufferImageSiblingAndroid::isTexturable(const gl::Context *context) const
+{
+ return true;
+}
+
+gl::Extents NativeBufferImageSiblingAndroid::getSize() const
+{
+ return gl::Extents(mBuffer->width, mBuffer->height, 1);
+}
+
+size_t NativeBufferImageSiblingAndroid::getSamples() const
+{
+ return 0;
+}
+
+EGLClientBuffer NativeBufferImageSiblingAndroid::getBuffer() const
+{
+ return static_cast<EGLClientBuffer>(mBuffer);
+}
+
+} // namespace rx
diff --git a/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.h b/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.h
new file mode 100644
index 0000000..20c8960
--- /dev/null
+++ b/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.h
@@ -0,0 +1,42 @@
+//
+// Copyright 2018 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// NativeBufferImageSiblingAndroid.h: Defines the NativeBufferImageSiblingAndroid to wrap EGL images
+// created from ANativeWindowBuffer objects
+
+#ifndef LIBANGLE_RENDERER_GL_EGL_ANDROID_NATIVEBUFFERIMAGESIBLINGANDROID_H_
+#define LIBANGLE_RENDERER_GL_EGL_ANDROID_NATIVEBUFFERIMAGESIBLINGANDROID_H_
+
+#include "libANGLE/renderer/gl/egl/ExternalImageSiblingEGL.h"
+
+struct ANativeWindowBuffer;
+
+namespace rx
+{
+
+class NativeBufferImageSiblingAndroid : public ExternalImageSiblingEGL
+{
+ public:
+ NativeBufferImageSiblingAndroid(EGLClientBuffer buffer);
+ virtual ~NativeBufferImageSiblingAndroid();
+
+ // ExternalImageSiblingImpl interface
+ gl::Format getFormat() const override;
+ bool isRenderable(const gl::Context *context) const override;
+ bool isTexturable(const gl::Context *context) const override;
+ gl::Extents getSize() const override;
+ size_t getSamples() const override;
+
+ // ExternalImageSiblingEGL interface
+ EGLClientBuffer getBuffer() const override;
+
+ private:
+ struct ANativeWindowBuffer *mBuffer;
+};
+
+} // namespace rx
+
+#endif // LIBANGLE_RENDERER_GL_EGL_ANDROID_NATIVEBUFFERIMAGESIBLINGANDROID_H_
diff --git a/src/libANGLE/renderer/gl/egl/android/android_util.cpp b/src/libANGLE/renderer/gl/egl/android/android_util.cpp
new file mode 100644
index 0000000..8ead15d
--- /dev/null
+++ b/src/libANGLE/renderer/gl/egl/android/android_util.cpp
@@ -0,0 +1,158 @@
+//
+// Copyright 2018 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// android_util.cpp: Utilities for the using the Android platform
+
+#include "libANGLE/renderer/gl/egl/android/android_util.h"
+
+namespace rx
+{
+
+namespace
+{
+
+// Taken from android/hardware_buffer.h
+// https://android.googlesource.com/platform/frameworks/native/+/master/libs/nativewindow/include/android/hardware_buffer.h
+
+// AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM AHARDWAREBUFFER_FORMAT_B4G4R4A4_UNORM,
+// AHARDWAREBUFFER_FORMAT_B5G5R5A1_UNORM formats were deprecated and re-added explicitly.
+
+// clang-format off
+/**
+ * Buffer pixel formats.
+ */
+enum {
+ /**
+ * Corresponding formats:
+ * Vulkan: VK_FORMAT_R8G8B8A8_UNORM
+ * OpenGL ES: GL_RGBA8
+ */
+ AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM = 1,
+ /**
+ * 32 bits per pixel, 8 bits per channel format where alpha values are
+ * ignored (always opaque).
+ * Corresponding formats:
+ * Vulkan: VK_FORMAT_R8G8B8A8_UNORM
+ * OpenGL ES: GL_RGB8
+ */
+ AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM = 2,
+ /**
+ * Corresponding formats:
+ * Vulkan: VK_FORMAT_R8G8B8_UNORM
+ * OpenGL ES: GL_RGB8
+ */
+ AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM = 3,
+ /**
+ * Corresponding formats:
+ * Vulkan: VK_FORMAT_R5G6B5_UNORM_PACK16
+ * OpenGL ES: GL_RGB565
+ */
+ AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM = 4,
+ AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM = 5,
+ AHARDWAREBUFFER_FORMAT_B4G4R4A4_UNORM = 6,
+ AHARDWAREBUFFER_FORMAT_B5G5R5A1_UNORM = 7,
+ /**
+ * Corresponding formats:
+ * Vulkan: VK_FORMAT_R16G16B16A16_SFLOAT
+ * OpenGL ES: GL_RGBA16F
+ */
+ AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT = 0x16,
+ /**
+ * Corresponding formats:
+ * Vulkan: VK_FORMAT_A2B10G10R10_UNORM_PACK32
+ * OpenGL ES: GL_RGB10_A2
+ */
+ AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM = 0x2b,
+ /**
+ * An opaque binary blob format that must have height 1, with width equal to
+ * the buffer size in bytes.
+ */
+ AHARDWAREBUFFER_FORMAT_BLOB = 0x21,
+ /**
+ * Corresponding formats:
+ * Vulkan: VK_FORMAT_D16_UNORM
+ * OpenGL ES: GL_DEPTH_COMPONENT16
+ */
+ AHARDWAREBUFFER_FORMAT_D16_UNORM = 0x30,
+ /**
+ * Corresponding formats:
+ * Vulkan: VK_FORMAT_X8_D24_UNORM_PACK32
+ * OpenGL ES: GL_DEPTH_COMPONENT24
+ */
+ AHARDWAREBUFFER_FORMAT_D24_UNORM = 0x31,
+ /**
+ * Corresponding formats:
+ * Vulkan: VK_FORMAT_D24_UNORM_S8_UINT
+ * OpenGL ES: GL_DEPTH24_STENCIL8
+ */
+ AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT = 0x32,
+ /**
+ * Corresponding formats:
+ * Vulkan: VK_FORMAT_D32_SFLOAT
+ * OpenGL ES: GL_DEPTH_COMPONENT32F
+ */
+ AHARDWAREBUFFER_FORMAT_D32_FLOAT = 0x33,
+ /**
+ * Corresponding formats:
+ * Vulkan: VK_FORMAT_D32_SFLOAT_S8_UINT
+ * OpenGL ES: GL_DEPTH32F_STENCIL8
+ */
+ AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT = 0x34,
+ /**
+ * Corresponding formats:
+ * Vulkan: VK_FORMAT_S8_UINT
+ * OpenGL ES: GL_STENCIL_INDEX8
+ */
+ AHARDWAREBUFFER_FORMAT_S8_UINT = 0x35,
+};
+// clang-format on
+
+} // anonymous namespace
+
+namespace android
+{
+GLenum NativePixelFormatToGLInternalFormat(int pixelFormat)
+{
+ switch (pixelFormat)
+ {
+ case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM:
+ return GL_RGBA8;
+ case AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM:
+ return GL_RGB8;
+ case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM:
+ return GL_RGB8;
+ case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM:
+ return GL_RGB565;
+ case AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM:
+ return GL_BGRA8_EXT;
+ case AHARDWAREBUFFER_FORMAT_B4G4R4A4_UNORM:
+ return GL_RGBA4;
+ case AHARDWAREBUFFER_FORMAT_B5G5R5A1_UNORM:
+ return GL_RGB5_A1;
+ case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT:
+ return GL_RGBA16F;
+ case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM:
+ return GL_RGB10_A2;
+ case AHARDWAREBUFFER_FORMAT_BLOB:
+ return GL_NONE;
+ case AHARDWAREBUFFER_FORMAT_D16_UNORM:
+ return GL_DEPTH_COMPONENT16;
+ case AHARDWAREBUFFER_FORMAT_D24_UNORM:
+ return GL_DEPTH_COMPONENT24;
+ case AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT:
+ return GL_DEPTH24_STENCIL8;
+ case AHARDWAREBUFFER_FORMAT_D32_FLOAT:
+ return GL_DEPTH_COMPONENT32F;
+ case AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT:
+ return GL_DEPTH32F_STENCIL8;
+ case AHARDWAREBUFFER_FORMAT_S8_UINT:
+ return GL_STENCIL_INDEX8;
+ default:
+ return GL_NONE;
+ }
+}
+}
+}
diff --git a/src/libANGLE/renderer/gl/egl/android/android_util.h b/src/libANGLE/renderer/gl/egl/android/android_util.h
new file mode 100644
index 0000000..aaad466
--- /dev/null
+++ b/src/libANGLE/renderer/gl/egl/android/android_util.h
@@ -0,0 +1,23 @@
+//
+// Copyright 2018 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// android_util.h: Utilities for the using the Android platform
+
+#ifndef LIBANGLE_RENDERER_GL_EGL_ANDROID_ANDROID_UTIL_H_
+#define LIBANGLE_RENDERER_GL_EGL_ANDROID_ANDROID_UTIL_H_
+
+#include "angle_gl.h"
+
+namespace rx
+{
+
+namespace android
+{
+GLenum NativePixelFormatToGLInternalFormat(int pixelFormat);
+}
+}
+
+#endif // LIBANGLE_RENDERER_GL_EGL_ANDROID_ANDROID_UTIL_H_
\ No newline at end of file