Inline ValidateBindBuffer.

This method is only called in one place. Inlining reduces the need to
make a jump and push/pop variables from the stack.

It also adds a specialized error handler for validation errors. This
reduces the amount of code generated for errors. The prior method
generates a lot of code when dealing with string streams.

Improves performance of the binding performance test.

Bug: angleproject:2763
Change-Id: I52af7046b398072975bf5bda583efac9a9b9a8cb
Reviewed-on: https://chromium-review.googlesource.com/c/1270219
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Yuly Novikov <ynovikov@google.com>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index ca4643d..ee7ab9d 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -2628,6 +2628,11 @@
     mErrors.handleError(errorCode, message, file, function, line);
 }
 
+void Context::validationError(GLenum errorCode, const char *message)
+{
+    mErrors.validationError(errorCode, message);
+}
+
 // Get one of the recorded errors and clear its flag, if any.
 // [OpenGL ES 2.0.24] section 2.5 page 13.
 GLenum Context::getError()
@@ -7977,6 +7982,11 @@
     handleError(gl::Error(errorCode, errorCode, errorStream.str()));
 }
 
+void ErrorSet::validationError(GLenum errorCode, const char *message)
+{
+    handleError(gl::Error(errorCode, message));
+}
+
 bool ErrorSet::empty() const
 {
     return mErrors.empty();
diff --git a/src/libANGLE/Context.h b/src/libANGLE/Context.h
index b9ec3a3..140c3b7 100644
--- a/src/libANGLE/Context.h
+++ b/src/libANGLE/Context.h
@@ -81,6 +81,8 @@
                      const char *function,
                      unsigned int line);
 
+    void validationError(GLenum errorCode, const char *message);
+
   private:
     Context *mContext;
 
@@ -1576,6 +1578,8 @@
                      const char *function,
                      unsigned int line);
 
+    void validationError(GLenum errorCode, const char *message);
+
     GLenum getError();
     void markContextLost();
 
@@ -1655,7 +1659,7 @@
         return mState.mTextures->isHandleGenerated(texture);
     }
 
-    bool isBufferGenerated(GLuint buffer) const
+    ANGLE_INLINE bool isBufferGenerated(GLuint buffer) const
     {
         return mState.mBuffers->isHandleGenerated(buffer);
     }
diff --git a/src/libANGLE/validationES2.cpp b/src/libANGLE/validationES2.cpp
index 1573017..df5b6db 100644
--- a/src/libANGLE/validationES2.cpp
+++ b/src/libANGLE/validationES2.cpp
@@ -4512,36 +4512,18 @@
     return GetValidProgram(context, program) != nullptr;
 }
 
-bool ValidateBindBuffer(Context *context, BufferBinding target, GLuint buffer)
-{
-    if (!context->isValidBufferBinding(target))
-    {
-        ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidBufferTypes);
-        return false;
-    }
-
-    if (!context->getGLState().isBindGeneratesResourceEnabled() &&
-        !context->isBufferGenerated(buffer))
-    {
-        ANGLE_VALIDATION_ERR(context, InvalidOperation(), ObjectNotGenerated);
-        return false;
-    }
-
-    return true;
-}
-
 bool ValidateBindFramebuffer(Context *context, GLenum target, GLuint framebuffer)
 {
     if (!ValidFramebufferTarget(context, target))
     {
-        ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidFramebufferTarget);
+        context->validationError(GL_INVALID_ENUM, kErrorInvalidFramebufferTarget);
         return false;
     }
 
     if (!context->getGLState().isBindGeneratesResourceEnabled() &&
         !context->isFramebufferGenerated(framebuffer))
     {
-        ANGLE_VALIDATION_ERR(context, InvalidOperation(), ObjectNotGenerated);
+        context->validationError(GL_INVALID_OPERATION, kErrorObjectNotGenerated);
         return false;
     }
 
diff --git a/src/libANGLE/validationES2.h b/src/libANGLE/validationES2.h
index a0ea786..7ee5029 100644
--- a/src/libANGLE/validationES2.h
+++ b/src/libANGLE/validationES2.h
@@ -722,11 +722,34 @@
                              GLsizei height,
                              GLsizei depth);
 bool ValidateMaxShaderCompilerThreadsKHR(Context *context, GLuint count);
+}  // namespace gl
 
+#include "libANGLE/ErrorStrings.h"
+
+namespace gl
+{
 ANGLE_INLINE bool ValidateUniform2f(Context *context, GLint location, GLfloat x, GLfloat y)
 {
     return ValidateUniform(context, GL_FLOAT_VEC2, location, 1);
 }
+
+ANGLE_INLINE bool ValidateBindBuffer(Context *context, BufferBinding target, GLuint buffer)
+{
+    if (!context->isValidBufferBinding(target))
+    {
+        context->validationError(GL_INVALID_ENUM, kErrorInvalidBufferTypes);
+        return false;
+    }
+
+    if (!context->getGLState().isBindGeneratesResourceEnabled() &&
+        !context->isBufferGenerated(buffer))
+    {
+        context->validationError(GL_INVALID_OPERATION, kErrorObjectNotGenerated);
+        return false;
+    }
+
+    return true;
+}
 }  // namespace gl
 
 #endif  // LIBANGLE_VALIDATION_ES2_H_