Move more draw call validation to the API.
The GL expects us to reject invalid draw calls before we start
doing any work, so we can prevent internal unnecessary state
changes.
BUG=angle:571
Change-Id: Ic71218b3c2d5dc310280d3738bb1387753a10e03
Reviewed-on: https://chromium-review.googlesource.com/203770
Tested-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Shannon Woods <shannonwoods@chromium.org>
diff --git a/src/libGLESv2/validationES.cpp b/src/libGLESv2/validationES.cpp
index dba2231..ef516d5 100644
--- a/src/libGLESv2/validationES.cpp
+++ b/src/libGLESv2/validationES.cpp
@@ -19,6 +19,7 @@
#include "libGLESv2/Query.h"
#include "libGLESv2/ProgramBinary.h"
#include "libGLESv2/TransformFeedback.h"
+#include "libGLESv2/VertexArray.h"
#include "common/mathutil.h"
#include "common/utilities.h"
@@ -1314,6 +1315,17 @@
return gl::error(GL_INVALID_OPERATION, false);
}
+ if (!context->getCurrentProgram())
+ {
+ return gl::error(GL_INVALID_OPERATION, false);
+ }
+
+ gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
+ if (!programBinary->validateSamplers(NULL))
+ {
+ return gl::error(GL_INVALID_OPERATION, false);
+ }
+
// No-op if zero count
return (count > 0);
}
@@ -1390,6 +1402,12 @@
return gl::error(GL_INVALID_OPERATION, false);
}
+ gl::VertexArray *vao = context->getCurrentVertexArray();
+ if (!indices && !vao->getElementArrayBuffer())
+ {
+ return gl::error(GL_INVALID_OPERATION, false);
+ }
+
if (!ValidateDrawBase(context, count))
{
return false;