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&)
{