Refactor validation of FramebufferRenderbuffer.
Consolidate a lot of duplicated code into helper methods. Also
move GetTargetTexture to the context class.
Change-Id: I8e3990a5e3c1976cb533941d0a0946466accec30
Reviewed-on: https://chromium-review.googlesource.com/181556
Reviewed-by: Shannon Woods <shannonwoods@chromium.org>
Tested-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libGLESv2/validationES.cpp b/src/libGLESv2/validationES.cpp
index fd3d4de..c688fcd 100644
--- a/src/libGLESv2/validationES.cpp
+++ b/src/libGLESv2/validationES.cpp
@@ -21,7 +21,7 @@
namespace gl
{
-bool ValidTextureTarget(gl::Context *context, GLenum target)
+bool ValidTextureTarget(const Context *context, GLenum target)
{
if (context->getClientVersion() < 3)
{
@@ -34,6 +34,19 @@
return true;
}
+bool ValidFramebufferTarget(GLenum target)
+{
+ META_ASSERT(GL_DRAW_FRAMEBUFFER_ANGLE == GL_DRAW_FRAMEBUFFER && GL_READ_FRAMEBUFFER_ANGLE == GL_READ_FRAMEBUFFER);
+
+ switch (target)
+ {
+ case GL_FRAMEBUFFER: return true;
+ case GL_READ_FRAMEBUFFER: return true;
+ case GL_DRAW_FRAMEBUFFER: return true;
+ default: return false;
+ }
+}
+
bool ValidMipLevel(const gl::Context *context, GLenum target, GLint level)
{
int maxLevel = 0;
@@ -171,6 +184,48 @@
return true;
}
+bool ValidateFramebufferRenderbufferParameters(gl::Context *context, GLenum target, GLenum attachment,
+ GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
+ GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
+
+ if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
+ {
+ return gl::error(GL_INVALID_OPERATION, false);
+ }
+
+ if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
+ {
+ const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
+
+ if (colorAttachment >= context->getMaximumRenderTargets())
+ {
+ return gl::error(GL_INVALID_VALUE, false);
+ }
+ }
+ else
+ {
+ switch (attachment)
+ {
+ case GL_DEPTH_ATTACHMENT:
+ break;
+ case GL_STENCIL_ATTACHMENT:
+ break;
+ case GL_DEPTH_STENCIL_ATTACHMENT:
+ if (context->getClientVersion() < 3)
+ {
+ return gl::error(GL_INVALID_ENUM, false);
+ }
+ break;
+ default:
+ return gl::error(GL_INVALID_ENUM, false);
+ }
+ }
+
+ return true;
+}
+
static bool IsPartialBlit(gl::Context *context, gl::Renderbuffer *readBuffer, gl::Renderbuffer *writeBuffer,
GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1)