Commit 740d9020 by Geoff Lang Committed by Commit Bot

Implement robust GetRenderbufferParameteriv entry points.

BUG=angleproject:1354 Change-Id: I073b75d416bd5184402b580bcebfca34f7cd28a8 Reviewed-on: https://chromium-review.googlesource.com/395110 Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent 62fce5b1
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "libANGLE/Buffer.h" #include "libANGLE/Buffer.h"
#include "libANGLE/Framebuffer.h" #include "libANGLE/Framebuffer.h"
#include "libANGLE/Program.h" #include "libANGLE/Program.h"
#include "libANGLE/Renderbuffer.h"
namespace gl namespace gl
{ {
...@@ -201,4 +202,46 @@ void QueryProgramiv(const Program *program, GLenum pname, GLint *params) ...@@ -201,4 +202,46 @@ void QueryProgramiv(const Program *program, GLenum pname, GLint *params)
break; break;
} }
} }
void QueryRenderbufferiv(const Renderbuffer *renderbuffer, GLenum pname, GLint *params)
{
ASSERT(renderbuffer != nullptr);
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().info->internalFormat;
break;
case GL_RENDERBUFFER_RED_SIZE:
*params = renderbuffer->getRedSize();
break;
case GL_RENDERBUFFER_GREEN_SIZE:
*params = renderbuffer->getGreenSize();
break;
case GL_RENDERBUFFER_BLUE_SIZE:
*params = renderbuffer->getBlueSize();
break;
case GL_RENDERBUFFER_ALPHA_SIZE:
*params = renderbuffer->getAlphaSize();
break;
case GL_RENDERBUFFER_DEPTH_SIZE:
*params = renderbuffer->getDepthSize();
break;
case GL_RENDERBUFFER_STENCIL_SIZE:
*params = renderbuffer->getStencilSize();
break;
case GL_RENDERBUFFER_SAMPLES_ANGLE:
*params = renderbuffer->getSamples();
break;
default:
UNREACHABLE();
break;
}
}
} }
...@@ -17,6 +17,7 @@ namespace gl ...@@ -17,6 +17,7 @@ namespace gl
class Buffer; class Buffer;
class Framebuffer; class Framebuffer;
class Program; class Program;
class Renderbuffer;
void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer, void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
GLenum attachment, GLenum attachment,
...@@ -24,6 +25,7 @@ void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer, ...@@ -24,6 +25,7 @@ void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
GLint *params); GLint *params);
void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params); void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params);
void QueryProgramiv(const Program *program, GLenum pname, GLint *params); void QueryProgramiv(const Program *program, GLenum pname, GLint *params);
void QueryRenderbufferiv(const Renderbuffer *renderbuffer, GLenum pname, GLint *params);
} }
#endif // LIBANGLE_QUERYUTILS_H_ #endif // LIBANGLE_QUERYUTILS_H_
...@@ -311,6 +311,63 @@ bool ValidateReadPixelsBase(ValidationContext *context, ...@@ -311,6 +311,63 @@ bool ValidateReadPixelsBase(ValidationContext *context,
return true; return true;
} }
bool ValidateGetRenderbufferParameterivBase(Context *context,
GLenum target,
GLenum pname,
GLsizei *length)
{
if (length)
{
*length = 0;
}
if (target != GL_RENDERBUFFER)
{
context->handleError(Error(GL_INVALID_ENUM, "Invalid target."));
return false;
}
Renderbuffer *renderbuffer = context->getGLState().getCurrentRenderbuffer();
if (renderbuffer == nullptr)
{
context->handleError(Error(GL_INVALID_OPERATION, "No renderbuffer bound."));
return false;
}
switch (pname)
{
case GL_RENDERBUFFER_WIDTH:
case GL_RENDERBUFFER_HEIGHT:
case GL_RENDERBUFFER_INTERNAL_FORMAT:
case GL_RENDERBUFFER_RED_SIZE:
case GL_RENDERBUFFER_GREEN_SIZE:
case GL_RENDERBUFFER_BLUE_SIZE:
case GL_RENDERBUFFER_ALPHA_SIZE:
case GL_RENDERBUFFER_DEPTH_SIZE:
case GL_RENDERBUFFER_STENCIL_SIZE:
break;
case GL_RENDERBUFFER_SAMPLES_ANGLE:
if (!context->getExtensions().framebufferMultisample)
{
context->handleError(
Error(GL_INVALID_ENUM, "GL_ANGLE_framebuffer_multisample is not enabled."));
return false;
}
break;
default:
context->handleError(Error(GL_INVALID_ENUM, "Unknown pname."));
return false;
}
if (length)
{
*length = 1;
}
return true;
}
} // anonymous namespace } // anonymous namespace
bool ValidTextureTarget(const ValidationContext *context, GLenum target) bool ValidTextureTarget(const ValidationContext *context, GLenum target)
...@@ -3807,4 +3864,37 @@ bool ValidateGetProgramivRobustANGLE(Context *context, ...@@ -3807,4 +3864,37 @@ bool ValidateGetProgramivRobustANGLE(Context *context,
return true; return true;
} }
bool ValidateGetRenderbufferParameteriv(Context *context,
GLenum target,
GLenum pname,
GLint *params)
{
return ValidateGetRenderbufferParameterivBase(context, target, pname, nullptr);
}
bool ValidateGetRenderbufferParameterivRobustANGLE(Context *context,
GLenum target,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLint *params)
{
if (!ValidateRobustEntryPoint(context, bufSize))
{
return false;
}
if (!ValidateGetRenderbufferParameterivBase(context, target, pname, length))
{
return false;
}
if (!ValidateRobustBufferSize(context, bufSize, *length))
{
return false;
}
return true;
}
} // namespace gl } // namespace gl
...@@ -340,6 +340,17 @@ bool ValidateGetProgramivRobustANGLE(Context *context, ...@@ -340,6 +340,17 @@ bool ValidateGetProgramivRobustANGLE(Context *context,
GLsizei bufSize, GLsizei bufSize,
GLsizei *numParams); GLsizei *numParams);
bool ValidateGetRenderbufferParameteriv(Context *context,
GLenum target,
GLenum pname,
GLint *params);
bool ValidateGetRenderbufferParameterivRobustANGLE(Context *context,
GLenum target,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLint *params);
// Error messages shared here for use in testing. // Error messages shared here for use in testing.
extern const char *g_ExceedsMaxElementErrorMessage; extern const char *g_ExceedsMaxElementErrorMessage;
} // namespace gl } // namespace gl
......
...@@ -1520,64 +1520,14 @@ void GL_APIENTRY GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* ...@@ -1520,64 +1520,14 @@ void GL_APIENTRY GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint*
Context *context = GetValidGlobalContext(); Context *context = GetValidGlobalContext();
if (context) if (context)
{ {
if (target != GL_RENDERBUFFER) if (!context->skipValidation() &&
{ !ValidateGetRenderbufferParameteriv(context, target, pname, params))
context->handleError(Error(GL_INVALID_ENUM));
return;
}
if (context->getGLState().getRenderbufferId() == 0)
{ {
context->handleError(Error(GL_INVALID_OPERATION));
return; return;
} }
Renderbuffer *renderbuffer = Renderbuffer *renderbuffer = context->getGLState().getCurrentRenderbuffer();
context->getRenderbuffer(context->getGLState().getRenderbufferId()); QueryRenderbufferiv(renderbuffer, pname, params);
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().info->internalFormat;
break;
case GL_RENDERBUFFER_RED_SIZE:
*params = renderbuffer->getRedSize();
break;
case GL_RENDERBUFFER_GREEN_SIZE:
*params = renderbuffer->getGreenSize();
break;
case GL_RENDERBUFFER_BLUE_SIZE:
*params = renderbuffer->getBlueSize();
break;
case GL_RENDERBUFFER_ALPHA_SIZE:
*params = renderbuffer->getAlphaSize();
break;
case GL_RENDERBUFFER_DEPTH_SIZE:
*params = renderbuffer->getDepthSize();
break;
case GL_RENDERBUFFER_STENCIL_SIZE:
*params = renderbuffer->getStencilSize();
break;
case GL_RENDERBUFFER_SAMPLES_ANGLE:
if (!context->getExtensions().framebufferMultisample)
{
context->handleError(Error(GL_INVALID_ENUM));
return;
}
*params = renderbuffer->getSamples();
break;
default:
context->handleError(Error(GL_INVALID_ENUM));
return;
}
} }
} }
......
...@@ -2172,7 +2172,21 @@ ANGLE_EXPORT void GL_APIENTRY GetRenderbufferParameterivRobustANGLE(GLenum targe ...@@ -2172,7 +2172,21 @@ ANGLE_EXPORT void GL_APIENTRY GetRenderbufferParameterivRobustANGLE(GLenum targe
"(GLenum target = 0x%X, GLenum pname = 0x%X, GLsizei bufsize = %d, GLsizei* length = " "(GLenum target = 0x%X, GLenum pname = 0x%X, GLsizei bufsize = %d, GLsizei* length = "
"0x%0.8p, GLint* params = 0x%0.8p)", "0x%0.8p, GLint* params = 0x%0.8p)",
target, pname, bufSize, length, params); target, pname, bufSize, length, params);
UNIMPLEMENTED();
Context *context = GetValidGlobalContext();
if (context)
{
GLsizei numParams = 0;
if (!ValidateGetRenderbufferParameterivRobustANGLE(context, target, pname, bufSize,
&numParams, params))
{
return;
}
Renderbuffer *renderbuffer = context->getGLState().getCurrentRenderbuffer();
QueryRenderbufferiv(renderbuffer, pname, params);
SetRobustLengthParam(length, numParams);
}
} }
ANGLE_EXPORT void GL_APIENTRY ANGLE_EXPORT void GL_APIENTRY
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment