Implement EGL_KHR_gl_renderbuffer_image support.

BUG=14610416

Change-Id: I406d356a70c2c3b2a2b6861b7a8c00a01fe5c8cf
Reviewed-on: https://swiftshader-review.googlesource.com/1061
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/GLES2/libGLESv2/Renderbuffer.cpp b/src/GLES2/libGLESv2/Renderbuffer.cpp
index 31f27a9..6ca0c15 100644
--- a/src/GLES2/libGLESv2/Renderbuffer.cpp
+++ b/src/GLES2/libGLESv2/Renderbuffer.cpp
@@ -90,13 +90,25 @@
     mTexture2D->releaseProxy(proxy);
 }
 
-// Increments refcount on surface.
-// caller must release() the returned surface
+// Increments refcount on image.
+// caller must release() the returned image
 Image *RenderbufferTexture2D::getRenderTarget()
 {
 	return mTexture2D->getRenderTarget(GL_TEXTURE_2D, 0);
 }
 
+// Increments refcount on image.
+// caller must release() the returned image
+Image *RenderbufferTexture2D::createSharedImage()
+{
+    return mTexture2D->createSharedImage(GL_TEXTURE_2D, 0);
+}
+
+bool RenderbufferTexture2D::isShared() const
+{
+    return mTexture2D->isShared(GL_TEXTURE_2D, 0);
+}
+
 GLsizei RenderbufferTexture2D::getWidth() const
 {
 	return mTexture2D->getWidth(GL_TEXTURE_2D, 0);
@@ -146,13 +158,25 @@
     mTextureCubeMap->releaseProxy(proxy);
 }
 
-// Increments refcount on surface.
-// caller must release() the returned surface
+// Increments refcount on image.
+// caller must release() the returned image
 Image *RenderbufferTextureCubeMap::getRenderTarget()
 {
 	return mTextureCubeMap->getRenderTarget(mTarget, 0);
 }
 
+// Increments refcount on image.
+// caller must release() the returned image
+Image *RenderbufferTextureCubeMap::createSharedImage()
+{
+    return mTextureCubeMap->createSharedImage(mTarget, 0);
+}
+
+bool RenderbufferTextureCubeMap::isShared() const
+{
+    return mTextureCubeMap->isShared(mTarget, 0);
+}
+
 GLsizei RenderbufferTextureCubeMap::getWidth() const
 {
 	return mTextureCubeMap->getWidth(mTarget, 0);
@@ -207,13 +231,25 @@
     RefCountObject::release();
 }
 
-// Increments refcount on surface.
-// caller must Release() the returned surface
+// Increments refcount on image.
+// caller must Release() the returned image
 Image *Renderbuffer::getRenderTarget()
 {
 	return mInstance->getRenderTarget();
 }
 
+// Increments refcount on image.
+// caller must Release() the returned image
+Image *Renderbuffer::createSharedImage()
+{
+    return mInstance->createSharedImage();
+}
+
+bool Renderbuffer::isShared() const
+{
+    return mInstance->isShared();
+}
+
 GLsizei Renderbuffer::getWidth() const
 {
 	return mInstance->getWidth();
@@ -290,13 +326,6 @@
 {
 }
 
-// Increments refcount on surface.
-// caller must Release() the returned surface
-Image *RenderbufferStorage::getRenderTarget()
-{
-	return NULL;
-}
-
 GLsizei RenderbufferStorage::getWidth() const
 {
 	return mWidth;
@@ -369,8 +398,8 @@
 	}
 }
 
-// Increments refcount on surface.
-// caller must release() the returned surface
+// Increments refcount on image.
+// caller must release() the returned image
 Image *Colorbuffer::getRenderTarget()
 {
 	if(mRenderTarget)
@@ -381,6 +410,24 @@
 	return mRenderTarget;
 }
 
+// Increments refcount on image.
+// caller must release() the returned image
+Image *Colorbuffer::createSharedImage()
+{
+    if(mRenderTarget)
+    {
+        mRenderTarget->addRef();
+        mRenderTarget->markShared();
+    }
+
+    return mRenderTarget;
+}
+
+bool Colorbuffer::isShared() const
+{
+    return mRenderTarget->isShared();
+}
+
 DepthStencilbuffer::DepthStencilbuffer(Image *depthStencil) : mDepthStencil(depthStencil)
 {
 	if(depthStencil)
@@ -429,8 +476,8 @@
 	}
 }
 
-// Increments refcount on surface.
-// caller must release() the returned surface
+// Increments refcount on image.
+// caller must release() the returned image
 Image *DepthStencilbuffer::getRenderTarget()
 {
 	if(mDepthStencil)
@@ -441,6 +488,24 @@
 	return mDepthStencil;
 }
 
+// Increments refcount on image.
+// caller must release() the returned image
+Image *DepthStencilbuffer::createSharedImage()
+{
+    if(mDepthStencil)
+    {
+        mDepthStencil->addRef();
+        mDepthStencil->markShared();
+    }
+
+    return mDepthStencil;
+}
+
+bool DepthStencilbuffer::isShared() const
+{
+    return mDepthStencil->isShared();
+}
+
 Depthbuffer::Depthbuffer(Image *depthStencil) : DepthStencilbuffer(depthStencil)
 {
 	if(depthStencil)