ES3.1: Implement framebuffer parameters api for opengl part.
Add new framebuffer parameters that can be set with glFramebufferParameteri
and queried with glGetFramebufferParameteriv.
GL_FRAMEBUFFER DEFAULT WIDTH
GL_FRAMEBUFFER_DEFAULT_HEIGHT
GL_FRAMEBUFFER_DEFAULT_SAMPLES
GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS
BUG=angleproject:1594
TEST=angle_unittests
TEST=angle_end2end_tests
TEST=dEQP-GLES31.functional.state_query.framebuffer_default.framebuffer_default*
Change-Id: I425e73a6b798fc7c73841ab98d7c8aabc381133d
Reviewed-on: https://chromium-review.googlesource.com/412126
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/validationES31.cpp b/src/libANGLE/validationES31.cpp
index 3854fbb..dd91577 100644
--- a/src/libANGLE/validationES31.cpp
+++ b/src/libANGLE/validationES31.cpp
@@ -9,6 +9,7 @@
#include "libANGLE/validationES31.h"
#include "libANGLE/Context.h"
+#include "libANGLE/Framebuffer.h"
#include "libANGLE/validationES.h"
#include "libANGLE/validationES3.h"
#include "libANGLE/VertexArray.h"
@@ -388,4 +389,120 @@
return true;
}
+
+bool ValidationFramebufferParameteri(Context *context, GLenum target, GLenum pname, GLint param)
+{
+ if (context->getClientVersion() < ES_3_1)
+ {
+ context->handleError(Error(GL_INVALID_OPERATION, "Context does not support GLES3.1."));
+ return false;
+ }
+
+ if (!ValidFramebufferTarget(target))
+ {
+ context->handleError(Error(GL_INVALID_ENUM, "Invalid framebuffer target."));
+ return false;
+ }
+
+ switch (pname)
+ {
+ case GL_FRAMEBUFFER_DEFAULT_WIDTH:
+ {
+ GLint maxWidth = context->getCaps().maxFramebufferWidth;
+ if (param < 0 || param > maxWidth)
+ {
+ context->handleError(
+ Error(GL_INVALID_VALUE,
+ "Params less than 0 or greater than GL_MAX_FRAMEBUFFER_WIDTH."));
+ return false;
+ }
+ break;
+ }
+ case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
+ {
+ GLint maxHeight = context->getCaps().maxFramebufferHeight;
+ if (param < 0 || param > maxHeight)
+ {
+ context->handleError(
+ Error(GL_INVALID_VALUE,
+ "Params less than 0 or greater than GL_MAX_FRAMEBUFFER_HEIGHT."));
+ return false;
+ }
+ break;
+ }
+ case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
+ {
+ GLint maxSamples = context->getCaps().maxFramebufferSamples;
+ if (param < 0 || param > maxSamples)
+ {
+ context->handleError(
+ Error(GL_INVALID_VALUE,
+ "Params less than 0 or greater than GL_MAX_FRAMEBUFFER_SAMPLES."));
+ return false;
+ }
+ break;
+ }
+ case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
+ {
+ break;
+ }
+ default:
+ {
+ context->handleError(Error(GL_INVALID_ENUM, "Invalid pname: 0x%X", pname));
+ return false;
+ }
+ }
+
+ const Framebuffer *framebuffer = context->getGLState().getTargetFramebuffer(target);
+ ASSERT(framebuffer);
+ if (framebuffer->id() == 0)
+ {
+ context->handleError(
+ Error(GL_INVALID_OPERATION, "Default framebuffer is bound to target."));
+ return false;
+ }
+ return true;
+}
+
+bool ValidationGetFramebufferParameteri(Context *context,
+ GLenum target,
+ GLenum pname,
+ GLint *params)
+{
+ if (context->getClientVersion() < ES_3_1)
+ {
+ context->handleError(Error(GL_INVALID_OPERATION, "Context does not support GLES3.1."));
+ return false;
+ }
+
+ if (!ValidFramebufferTarget(target))
+ {
+ context->handleError(Error(GL_INVALID_ENUM, "Invalid framebuffer target."));
+ return false;
+ }
+
+ switch (pname)
+ {
+ case GL_FRAMEBUFFER_DEFAULT_WIDTH:
+ case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
+ case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
+ case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
+ break;
+ default:
+ context->handleError(Error(GL_INVALID_ENUM, "Invalid pname: 0x%X", pname));
+ return false;
+ }
+
+ const Framebuffer *framebuffer = context->getGLState().getTargetFramebuffer(target);
+ ASSERT(framebuffer);
+
+ if (framebuffer->id() == 0)
+ {
+ context->handleError(
+ Error(GL_INVALID_OPERATION, "Default framebuffer is bound to target."));
+ return false;
+ }
+ return true;
+}
+
} // namespace gl