Implement the egl and gl layers of EGL Image.

Add end2end tests and unittests.

BUG=angleproject:970

Change-Id: Ie8306971730a793f08dfd09ead1bfd6ff3e4623d
Reviewed-on: https://chromium-review.googlesource.com/291260
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Tested-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/Renderbuffer.cpp b/src/libANGLE/Renderbuffer.cpp
index 85b920b..eb6357e 100644
--- a/src/libANGLE/Renderbuffer.cpp
+++ b/src/libANGLE/Renderbuffer.cpp
@@ -12,20 +12,20 @@
 
 #include "common/utilities.h"
 #include "libANGLE/FramebufferAttachment.h"
+#include "libANGLE/Image.h"
 #include "libANGLE/Texture.h"
 #include "libANGLE/formatutils.h"
 #include "libANGLE/renderer/d3d/RenderTargetD3D.h"
 
 namespace gl
 {
-
 Renderbuffer::Renderbuffer(rx::RenderbufferImpl *impl, GLuint id)
-  : FramebufferAttachmentObject(id),
-    mRenderbuffer(impl),
-    mWidth(0),
-    mHeight(0),
-    mInternalFormat(GL_RGBA4),
-    mSamples(0)
+    : egl::ImageSibling(id),
+      mRenderbuffer(impl),
+      mWidth(0),
+      mHeight(0),
+      mInternalFormat(GL_RGBA4),
+      mSamples(0)
 {
 }
 
@@ -36,6 +36,8 @@
 
 Error Renderbuffer::setStorage(GLenum internalformat, size_t width, size_t height)
 {
+    orphanImages();
+
     Error error = mRenderbuffer->setStorage(internalformat, width, height);
     if (error.isError())
     {
@@ -52,6 +54,8 @@
 
 Error Renderbuffer::setStorageMultisample(size_t samples, GLenum internalformat, size_t width, size_t height)
 {
+    orphanImages();
+
     Error error = mRenderbuffer->setStorageMultisample(samples, internalformat, width, height);
     if (error.isError())
     {
@@ -66,6 +70,26 @@
     return Error(GL_NO_ERROR);
 }
 
+Error Renderbuffer::setStorageEGLImageTarget(egl::Image *image)
+{
+    orphanImages();
+
+    Error error = mRenderbuffer->setStorageEGLImageTarget(image);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    setTargetImage(image);
+
+    mWidth          = image->getWidth();
+    mHeight         = image->getHeight();
+    mInternalFormat = image->getInternalFormat();
+    mSamples        = 0;
+
+    return Error(GL_NO_ERROR);
+}
+
 rx::RenderbufferImpl *Renderbuffer::getImplementation()
 {
     ASSERT(mRenderbuffer);