Implements GetRenderbufferParameteriv
TRAC #11877
Signed-off-by: Andrew Lewycky
Signed-off-by: Daniel Koch

Author:    Shannon Woods

git-svn-id: http://angleproject.googlecode.com/svn/trunk@168 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Renderbuffer.cpp b/src/libGLESv2/Renderbuffer.cpp
index 86796f0..3d267ef 100644
--- a/src/libGLESv2/Renderbuffer.cpp
+++ b/src/libGLESv2/Renderbuffer.cpp
@@ -19,6 +19,7 @@
 {
     mWidth = 0;
     mHeight = 0;
+    mFormat = GL_RGBA4; // default format, needs to be one of the expected renderbuffer formats
 }
 
 Renderbuffer::~Renderbuffer()
@@ -60,6 +61,11 @@
     return mHeight;
 }
 
+GLenum Renderbuffer::getFormat()
+{
+    return mFormat;
+}
+
 Colorbuffer::Colorbuffer(IDirect3DSurface9 *renderTarget) : mRenderTarget(renderTarget)
 {
     if (renderTarget)
@@ -95,11 +101,13 @@
     {
         mWidth = width;
         mHeight = height;
+        mFormat = format;
     }
     else
     {
         mWidth = 0;
         mHeight = 0;
+        mFormat = GL_RGBA4;
     }
 }
 
@@ -184,6 +192,9 @@
 
         mWidth = description.Width;
         mHeight = description.Height;
+        mFormat = GL_DEPTH_COMPONENT16; // If the renderbuffer parameters are queried, the calling function
+                                        // will expect one of the valid renderbuffer formats for use in 
+                                        // glRenderbufferStorage
     }
 }
 
@@ -207,11 +218,15 @@
     {
         mWidth = width;
         mHeight = height;
+        mFormat = GL_DEPTH_COMPONENT16; // If the renderbuffer parameters are queried, the calling function
+                                        // will expect one of the valid renderbuffer formats for use in 
+                                        // glRenderbufferStorage
     }
     else
     {
         mWidth = 0;
         mHeight = 0;
+        mFormat = GL_RGBA4; //default format
     }
 }
 
@@ -257,6 +272,9 @@
 
         mWidth = description.Width;
         mHeight = description.Height;
+        mFormat = GL_STENCIL_INDEX8; // If the renderbuffer parameters are queried, the calling function
+                                     // will expect one of the valid renderbuffer formats for use in 
+                                     // glRenderbufferStorage
     }
 }
 
@@ -280,11 +298,15 @@
     {
         mWidth = width;
         mHeight = height;
+        mFormat = GL_STENCIL_INDEX8; // If the renderbuffer parameters are queried, the calling function
+                                     // will expect one of the valid renderbuffer formats for use in 
+                                     // glRenderbufferStorage
     }
     else
     {
         mWidth = 0;
         mHeight = 0;
+        mFormat = GL_RGBA4; //default format
     }
 }
 
diff --git a/src/libGLESv2/Renderbuffer.h b/src/libGLESv2/Renderbuffer.h
index 7672a8c..632361e 100644
--- a/src/libGLESv2/Renderbuffer.h
+++ b/src/libGLESv2/Renderbuffer.h
@@ -35,10 +35,12 @@
 
     int getWidth();
     int getHeight();
+    GLenum getFormat();
 
   protected:
     int mWidth;
     int mHeight;
+    GLenum mFormat;
 
   private:
     DISALLOW_COPY_AND_ASSIGN(Renderbuffer);
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index b9624c4..5afb6fd 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -2358,7 +2358,97 @@
 
     try
     {
-        UNIMPLEMENTED();   // FIXME
+        gl::Context *context = gl::getContext();
+
+        if (context)
+        {
+            if (target != GL_RENDERBUFFER)
+            {
+                return error(GL_INVALID_ENUM);
+            }
+
+            if (context->renderbuffer == 0)
+            {
+                return error(GL_INVALID_OPERATION);
+            }
+
+            gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->renderbuffer);
+
+            switch (pname)
+            {
+              case GL_RENDERBUFFER_WIDTH:
+                *params = renderbuffer->getWidth();
+                break;
+              case GL_RENDERBUFFER_HEIGHT:
+                *params = renderbuffer->getHeight();
+                break;
+              case GL_RENDERBUFFER_INTERNAL_FORMAT:
+                *params = renderbuffer->getFormat();
+                break;
+              case GL_RENDERBUFFER_RED_SIZE:
+                if (renderbuffer->isColorbuffer())
+                {
+                    *params = static_cast<gl::Colorbuffer*>(renderbuffer)->getRedSize();
+                }
+                else
+                {
+                    *params = 0;
+                }
+                break;
+              case GL_RENDERBUFFER_GREEN_SIZE:
+                if (renderbuffer->isColorbuffer())
+                {
+                    *params = static_cast<gl::Colorbuffer*>(renderbuffer)->getGreenSize();
+                }
+                else
+                {
+                    *params = 0;
+                }
+                break;
+              case GL_RENDERBUFFER_BLUE_SIZE:
+                if (renderbuffer->isColorbuffer())
+                {
+                    *params = static_cast<gl::Colorbuffer*>(renderbuffer)->getBlueSize();
+                }
+                else
+                {
+                    *params = 0;
+                }
+                break;
+              case GL_RENDERBUFFER_ALPHA_SIZE:
+                if (renderbuffer->isColorbuffer())
+                {
+                    *params = static_cast<gl::Colorbuffer*>(renderbuffer)->getAlphaSize();
+                }
+                else
+                {
+                    *params = 0;
+                }
+                break;
+              case GL_RENDERBUFFER_DEPTH_SIZE:
+                if (renderbuffer->isDepthbuffer())
+                {
+                    *params = static_cast<gl::Depthbuffer*>(renderbuffer)->getDepthSize();
+                }
+                else
+                {
+                    *params = 0;
+                }
+                break;
+              case GL_RENDERBUFFER_STENCIL_SIZE:
+                if (renderbuffer->isStencilbuffer())
+                {
+                    *params = static_cast<gl::Stencilbuffer*>(renderbuffer)->getStencilSize();
+                }
+                else
+                {
+                    *params = 0;
+                }
+                break;
+              default:
+                return error(GL_INVALID_ENUM);
+            }
+        }
     }
     catch(std::bad_alloc&)
     {