Commit 5815e125 by Nicolas Capens Committed by Nicolas Capens

Move draw call early-outs until after validation.

Drawing without a current program is not an error and we can early-out, but not until after other validation which could generate an error has completed. Validation happening on a valid program happens afterwards though. Likewise, providing insufficient vertices for even one primitive results in drawing nothing, but validation still needs to happen. Change-Id: I5385ffe352fc38343caa41eb99f5549472da3b4f Reviewed-on: https://swiftshader-review.googlesource.com/14489Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com>
parent 48280a4e
...@@ -3481,21 +3481,13 @@ void Context::clearStencilBuffer(const GLint value) ...@@ -3481,21 +3481,13 @@ void Context::clearStencilBuffer(const GLint value)
void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount) void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
{ {
if(!mState.currentProgram)
{
return;
}
sw::DrawType primitiveType; sw::DrawType primitiveType;
int primitiveCount; int primitiveCount;
int verticesPerPrimitive; int verticesPerPrimitive;
if(!es2sw::ConvertPrimitiveType(mode, count, GL_NONE, primitiveType, primitiveCount, verticesPerPrimitive)) if(!es2sw::ConvertPrimitiveType(mode, count, GL_NONE, primitiveType, primitiveCount, verticesPerPrimitive))
return error(GL_INVALID_ENUM);
if(primitiveCount <= 0)
{ {
return; return error(GL_INVALID_ENUM);
} }
if(!applyRenderTarget()) if(!applyRenderTarget())
...@@ -3515,6 +3507,11 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instan ...@@ -3515,6 +3507,11 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instan
return error(err); return error(err);
} }
if(!mState.currentProgram)
{
return;
}
applyShaders(); applyShaders();
applyTextures(); applyTextures();
...@@ -3523,6 +3520,11 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instan ...@@ -3523,6 +3520,11 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instan
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(primitiveCount <= 0)
{
return;
}
TransformFeedback* transformFeedback = getTransformFeedback(); TransformFeedback* transformFeedback = getTransformFeedback();
if(!cullSkipsDraw(mode) || (transformFeedback->isActive() && !transformFeedback->isPaused())) if(!cullSkipsDraw(mode) || (transformFeedback->isActive() && !transformFeedback->isPaused()))
{ {
...@@ -3537,11 +3539,6 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instan ...@@ -3537,11 +3539,6 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instan
void Context::drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLsizei instanceCount) void Context::drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLsizei instanceCount)
{ {
if(!mState.currentProgram)
{
return;
}
if(!indices && !getCurrentVertexArray()->getElementArrayBuffer()) if(!indices && !getCurrentVertexArray()->getElementArrayBuffer())
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -3570,11 +3567,8 @@ void Context::drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count, ...@@ -3570,11 +3567,8 @@ void Context::drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count,
int verticesPerPrimitive; int verticesPerPrimitive;
if(!es2sw::ConvertPrimitiveType(internalMode, count, type, primitiveType, primitiveCount, verticesPerPrimitive)) if(!es2sw::ConvertPrimitiveType(internalMode, count, type, primitiveType, primitiveCount, verticesPerPrimitive))
return error(GL_INVALID_ENUM);
if(primitiveCount <= 0)
{ {
return; return error(GL_INVALID_ENUM);
} }
if(!applyRenderTarget()) if(!applyRenderTarget())
...@@ -3602,6 +3596,11 @@ void Context::drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count, ...@@ -3602,6 +3596,11 @@ void Context::drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count,
return error(err); return error(err);
} }
if(!mState.currentProgram)
{
return;
}
applyShaders(); applyShaders();
applyTextures(); applyTextures();
...@@ -3610,6 +3609,11 @@ void Context::drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count, ...@@ -3610,6 +3609,11 @@ void Context::drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count,
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(primitiveCount <= 0)
{
return;
}
TransformFeedback* transformFeedback = getTransformFeedback(); TransformFeedback* transformFeedback = getTransformFeedback();
if(!cullSkipsDraw(internalMode) || (transformFeedback->isActive() && !transformFeedback->isPaused())) if(!cullSkipsDraw(internalMode) || (transformFeedback->isActive() && !transformFeedback->isPaused()))
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment