More micro-optimization for draw call validation.
Mostly inlining checks on the hot draw call path.
Slight increase in draw call validation performance. (Up to 13%)
Bug: angleproject:2747
Change-Id: I34c4d7f412c3bca5e559e9bfb5689c0618bb7536
Reviewed-on: https://chromium-review.googlesource.com/1171506
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Yuly Novikov <ynovikov@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/validationES.cpp b/src/libANGLE/validationES.cpp
index 5b4ccad..fe8accb 100644
--- a/src/libANGLE/validationES.cpp
+++ b/src/libANGLE/validationES.cpp
@@ -79,17 +79,11 @@
return !checkedA.IsValid();
}
-bool ValidateDrawAttribs(Context *context, GLint primcount, GLint maxVertex)
+bool ValidateDrawAttribsImpl(Context *context, GLint primcount, GLint maxVertex)
{
// If we're drawing zero vertices, we have enough data.
ASSERT(primcount > 0);
- if (maxVertex <= context->getStateCache().getNonInstancedVertexElementLimit() &&
- (primcount - 1) <= context->getStateCache().getInstancedVertexElementLimit())
- {
- return true;
- }
-
// An overflow can happen when adding the offset. Check against a special constant.
if (context->getStateCache().getNonInstancedVertexElementLimit() ==
VertexAttribute::kIntegerOverflow ||
@@ -106,6 +100,19 @@
return false;
}
+ANGLE_INLINE bool ValidateDrawAttribs(Context *context, GLint primcount, GLint maxVertex)
+{
+ if (maxVertex <= context->getStateCache().getNonInstancedVertexElementLimit() &&
+ (primcount - 1) <= context->getStateCache().getInstancedVertexElementLimit())
+ {
+ return true;
+ }
+ else
+ {
+ return ValidateDrawAttribsImpl(context, primcount, maxVertex);
+ }
+}
+
bool ValidReadPixelsTypeEnum(Context *context, GLenum type)
{
switch (type)
@@ -2752,7 +2759,7 @@
return nullptr;
}
-bool ValidateDrawBase(Context *context, PrimitiveMode mode, GLsizei count)
+bool ValidateDrawMode(Context *context, PrimitiveMode mode)
{
const Extensions &extensions = context->getExtensions();
@@ -2782,31 +2789,11 @@
return false;
}
- if (count < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeCount);
- return false;
- }
-
- const State &state = context->getGLState();
-
- intptr_t drawStatesError = context->getStateCache().getBasicDrawStatesError(context);
- if (drawStatesError)
- {
- const char *errorMessage = reinterpret_cast<const char *>(drawStatesError);
-
- // All errors from ValidateDrawStates should return INVALID_OPERATION except Framebuffer
- // Incomplete.
- GLenum errorCode =
- (errorMessage == kErrorDrawFramebufferIncomplete ? GL_INVALID_FRAMEBUFFER_OPERATION
- : GL_INVALID_OPERATION);
- context->handleError(Error(errorCode, errorMessage));
- return false;
- }
-
// If we are running GLES1, there is no current program.
if (context->getClientVersion() >= Version(2, 0))
{
+ const State &state = context->getGLState();
+
Program *program = state.getProgram();
ASSERT(program);
@@ -2826,6 +2813,36 @@
return true;
}
+bool ValidateDrawBase(Context *context, PrimitiveMode mode, GLsizei count)
+{
+ if (!context->getStateCache().isValidDrawMode(mode))
+ {
+ return ValidateDrawMode(context, mode);
+ }
+
+ if (count < 0)
+ {
+ ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeCount);
+ return false;
+ }
+
+ intptr_t drawStatesError = context->getStateCache().getBasicDrawStatesError(context);
+ if (drawStatesError)
+ {
+ const char *errorMessage = reinterpret_cast<const char *>(drawStatesError);
+
+ // All errors from ValidateDrawStates should return INVALID_OPERATION except Framebuffer
+ // Incomplete.
+ GLenum errorCode =
+ (errorMessage == kErrorDrawFramebufferIncomplete ? GL_INVALID_FRAMEBUFFER_OPERATION
+ : GL_INVALID_OPERATION);
+ context->handleError(Error(errorCode, errorMessage));
+ return false;
+ }
+
+ return true;
+}
+
bool ValidateDrawArraysCommon(Context *context,
PrimitiveMode mode,
GLint first,
@@ -2838,6 +2855,12 @@
return false;
}
+ if (count < 0)
+ {
+ ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeCount);
+ return false;
+ }
+
const State &state = context->getGLState();
TransformFeedback *curTransformFeedback = state.getCurrentTransformFeedback();
if (curTransformFeedback && curTransformFeedback->isActive() &&
@@ -2857,8 +2880,22 @@
}
}
- if (!ValidateDrawBase(context, mode, count))
+ if (!context->getStateCache().isValidDrawMode(mode))
{
+ return ValidateDrawMode(context, mode);
+ }
+
+ intptr_t drawStatesError = context->getStateCache().getBasicDrawStatesError(context);
+ if (drawStatesError)
+ {
+ const char *errorMessage = reinterpret_cast<const char *>(drawStatesError);
+
+ // All errors from ValidateDrawStates should return INVALID_OPERATION except Framebuffer
+ // Incomplete.
+ GLenum errorCode =
+ (errorMessage == kErrorDrawFramebufferIncomplete ? GL_INVALID_FRAMEBUFFER_OPERATION
+ : GL_INVALID_OPERATION);
+ context->handleError(Error(errorCode, errorMessage));
return false;
}