Commit ae6ba9f8 by Jamie Madill Committed by Commit Bot

Optimize check for active not paused XFB.

Local testing showed an improved score of about 2% in the most sensitive CPU overhead benchmark. Likely because of improved caching from fewer indirections. Bug: angleproject:2966 Change-Id: I5d9a4b4bcf624ab0b430bb696c4227e589cdb7a6 Reviewed-on: https://chromium-review.googlesource.com/c/1359518 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org>
parent 1e853266
...@@ -132,12 +132,12 @@ angle::Result GetQueryObjectParameter(const Context *context, Query *query, GLen ...@@ -132,12 +132,12 @@ angle::Result GetQueryObjectParameter(const Context *context, Query *query, GLen
} }
ANGLE_INLINE void MarkTransformFeedbackBufferUsage(const Context *context, ANGLE_INLINE void MarkTransformFeedbackBufferUsage(const Context *context,
TransformFeedback *transformFeedback,
GLsizei count, GLsizei count,
GLsizei instanceCount) GLsizei instanceCount)
{ {
if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused()) if (context->getStateCache().isTransformFeedbackActiveUnpaused())
{ {
TransformFeedback *transformFeedback = context->getGLState().getCurrentTransformFeedback();
transformFeedback->onVerticesDrawn(context, count, instanceCount); transformFeedback->onVerticesDrawn(context, count, instanceCount);
} }
} }
...@@ -2221,7 +2221,7 @@ void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count) ...@@ -2221,7 +2221,7 @@ void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
ANGLE_CONTEXT_TRY(prepareForDraw(mode)); ANGLE_CONTEXT_TRY(prepareForDraw(mode));
ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count)); ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1); MarkTransformFeedbackBufferUsage(this, count, 1);
} }
void Context::drawArraysInstanced(PrimitiveMode mode, void Context::drawArraysInstanced(PrimitiveMode mode,
...@@ -2238,8 +2238,7 @@ void Context::drawArraysInstanced(PrimitiveMode mode, ...@@ -2238,8 +2238,7 @@ void Context::drawArraysInstanced(PrimitiveMode mode,
ANGLE_CONTEXT_TRY(prepareForDraw(mode)); ANGLE_CONTEXT_TRY(prepareForDraw(mode));
ANGLE_CONTEXT_TRY( ANGLE_CONTEXT_TRY(
mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount)); mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, MarkTransformFeedbackBufferUsage(this, count, instanceCount);
instanceCount);
} }
void Context::drawElements(PrimitiveMode mode, void Context::drawElements(PrimitiveMode mode,
...@@ -5406,8 +5405,7 @@ void Context::multiDrawArrays(PrimitiveMode mode, ...@@ -5406,8 +5405,7 @@ void Context::multiDrawArrays(PrimitiveMode mode,
programObject->setDrawIDUniform(drawID); programObject->setDrawIDUniform(drawID);
ANGLE_CONTEXT_TRY( ANGLE_CONTEXT_TRY(
mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID])); mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), MarkTransformFeedbackBufferUsage(this, counts[drawID], 1);
counts[drawID], 1);
} }
} }
else else
...@@ -5420,8 +5418,7 @@ void Context::multiDrawArrays(PrimitiveMode mode, ...@@ -5420,8 +5418,7 @@ void Context::multiDrawArrays(PrimitiveMode mode,
} }
ANGLE_CONTEXT_TRY( ANGLE_CONTEXT_TRY(
mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID])); mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), MarkTransformFeedbackBufferUsage(this, counts[drawID], 1);
counts[drawID], 1);
} }
} }
} }
...@@ -5446,8 +5443,7 @@ void Context::multiDrawArraysInstanced(PrimitiveMode mode, ...@@ -5446,8 +5443,7 @@ void Context::multiDrawArraysInstanced(PrimitiveMode mode,
programObject->setDrawIDUniform(drawID); programObject->setDrawIDUniform(drawID);
ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced( ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID])); this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), MarkTransformFeedbackBufferUsage(this, counts[drawID], instanceCounts[drawID]);
counts[drawID], instanceCounts[drawID]);
} }
} }
else else
...@@ -5460,8 +5456,7 @@ void Context::multiDrawArraysInstanced(PrimitiveMode mode, ...@@ -5460,8 +5456,7 @@ void Context::multiDrawArraysInstanced(PrimitiveMode mode,
} }
ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced( ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID])); this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), MarkTransformFeedbackBufferUsage(this, counts[drawID], instanceCounts[drawID]);
counts[drawID], instanceCounts[drawID]);
} }
} }
} }
...@@ -8192,7 +8187,8 @@ StateCache::StateCache() ...@@ -8192,7 +8187,8 @@ StateCache::StateCache()
mCachedNonInstancedVertexElementLimit(0), mCachedNonInstancedVertexElementLimit(0),
mCachedInstancedVertexElementLimit(0), mCachedInstancedVertexElementLimit(0),
mCachedBasicDrawStatesError(kInvalidPointer), mCachedBasicDrawStatesError(kInvalidPointer),
mCachedBasicDrawElementsError(kInvalidPointer) mCachedBasicDrawElementsError(kInvalidPointer),
mCachedTransformFeedbackActiveUnpaused(false)
{} {}
StateCache::~StateCache() = default; StateCache::~StateCache() = default;
...@@ -8375,6 +8371,7 @@ void StateCache::onQueryChange(Context *context) ...@@ -8375,6 +8371,7 @@ void StateCache::onQueryChange(Context *context)
void StateCache::onActiveTransformFeedbackChange(Context *context) void StateCache::onActiveTransformFeedbackChange(Context *context)
{ {
updateTransformFeedbackActiveUnpaused(context);
updateBasicDrawStatesError(); updateBasicDrawStatesError();
updateBasicDrawElementsError(); updateBasicDrawElementsError();
updateValidDrawModes(context); updateValidDrawModes(context);
...@@ -8415,10 +8412,10 @@ void StateCache::updateValidDrawModes(Context *context) ...@@ -8415,10 +8412,10 @@ void StateCache::updateValidDrawModes(Context *context)
const State &state = context->getGLState(); const State &state = context->getGLState();
Program *program = state.getProgram(); Program *program = state.getProgram();
TransformFeedback *curTransformFeedback = state.getCurrentTransformFeedback(); if (mCachedTransformFeedbackActiveUnpaused)
if (curTransformFeedback && curTransformFeedback->isActive() &&
!curTransformFeedback->isPaused())
{ {
TransformFeedback *curTransformFeedback = state.getCurrentTransformFeedback();
// ES Spec 3.0 validation text: // ES Spec 3.0 validation text:
// When transform feedback is active and not paused, all geometric primitives generated must // When transform feedback is active and not paused, all geometric primitives generated must
// match the value of primitiveMode passed to BeginTransformFeedback. The error // match the value of primitiveMode passed to BeginTransformFeedback. The error
...@@ -8495,4 +8492,10 @@ void StateCache::updateValidDrawElementsTypes(Context *context) ...@@ -8495,4 +8492,10 @@ void StateCache::updateValidDrawElementsTypes(Context *context)
{DrawElementsType::UnsignedInt, supportsUint}, {DrawElementsType::UnsignedInt, supportsUint},
}}; }};
} }
void StateCache::updateTransformFeedbackActiveUnpaused(Context *context)
{
TransformFeedback *xfb = context->getGLState().getCurrentTransformFeedback();
mCachedTransformFeedbackActiveUnpaused = xfb && xfb->isActive() && !xfb->isPaused();
}
} // namespace gl } // namespace gl
...@@ -171,12 +171,19 @@ class StateCache final : angle::NonCopyable ...@@ -171,12 +171,19 @@ class StateCache final : angle::NonCopyable
return mCachedValidBindTextureTypes[type]; return mCachedValidBindTextureTypes[type];
} }
// Cannot chance except on Context/Extension init. // Cannot change except on Context/Extension init.
bool isValidDrawElementsType(DrawElementsType type) const bool isValidDrawElementsType(DrawElementsType type) const
{ {
return mCachedValidDrawElementsTypes[type]; return mCachedValidDrawElementsTypes[type];
} }
// Places that can trigger updateTransformFeedbackActiveUnpaused:
// 1. onActiveTransformFeedbackChange.
bool isTransformFeedbackActiveUnpaused() const
{
return mCachedTransformFeedbackActiveUnpaused;
}
// State change notifications. // State change notifications.
void onVertexArrayBindingChange(Context *context); void onVertexArrayBindingChange(Context *context);
void onProgramExecutableChange(Context *context); void onProgramExecutableChange(Context *context);
...@@ -204,6 +211,7 @@ class StateCache final : angle::NonCopyable ...@@ -204,6 +211,7 @@ class StateCache final : angle::NonCopyable
void updateValidDrawElementsTypes(Context *context); void updateValidDrawElementsTypes(Context *context);
void updateBasicDrawStatesError(); void updateBasicDrawStatesError();
void updateBasicDrawElementsError(); void updateBasicDrawElementsError();
void updateTransformFeedbackActiveUnpaused(Context *context);
void setValidDrawModes(bool pointsOK, bool linesOK, bool trisOK, bool lineAdjOK, bool triAdjOK); void setValidDrawModes(bool pointsOK, bool linesOK, bool trisOK, bool lineAdjOK, bool triAdjOK);
...@@ -220,6 +228,7 @@ class StateCache final : angle::NonCopyable ...@@ -220,6 +228,7 @@ class StateCache final : angle::NonCopyable
GLint64 mCachedInstancedVertexElementLimit; GLint64 mCachedInstancedVertexElementLimit;
mutable intptr_t mCachedBasicDrawStatesError; mutable intptr_t mCachedBasicDrawStatesError;
mutable intptr_t mCachedBasicDrawElementsError; mutable intptr_t mCachedBasicDrawElementsError;
bool mCachedTransformFeedbackActiveUnpaused;
// Reserve an extra slot at the end of these maps for invalid enum. // Reserve an extra slot at the end of these maps for invalid enum.
angle::PackedEnumMap<PrimitiveMode, bool, angle::EnumSize<PrimitiveMode>() + 1> angle::PackedEnumMap<PrimitiveMode, bool, angle::EnumSize<PrimitiveMode>() + 1>
......
...@@ -2856,11 +2856,10 @@ bool ValidateDrawArraysCommon(Context *context, ...@@ -2856,11 +2856,10 @@ bool ValidateDrawArraysCommon(Context *context,
return false; return false;
} }
const State &state = context->getGLState(); if (context->getStateCache().isTransformFeedbackActiveUnpaused())
TransformFeedback *curTransformFeedback = state.getCurrentTransformFeedback();
if (curTransformFeedback && curTransformFeedback->isActive() &&
!curTransformFeedback->isPaused())
{ {
const State &state = context->getGLState();
TransformFeedback *curTransformFeedback = state.getCurrentTransformFeedback();
if (!curTransformFeedback->checkBufferSpaceForDraw(count, primcount)) if (!curTransformFeedback->checkBufferSpaceForDraw(count, primcount))
{ {
context->validationError(GL_INVALID_OPERATION, kTransformFeedbackBufferTooSmall); context->validationError(GL_INVALID_OPERATION, kTransformFeedbackBufferTooSmall);
...@@ -2943,9 +2942,7 @@ const char *ValidateDrawElementsStates(Context *context) ...@@ -2943,9 +2942,7 @@ const char *ValidateDrawElementsStates(Context *context)
{ {
const State &state = context->getGLState(); const State &state = context->getGLState();
TransformFeedback *curTransformFeedback = state.getCurrentTransformFeedback(); if (context->getStateCache().isTransformFeedbackActiveUnpaused())
if (curTransformFeedback && curTransformFeedback->isActive() &&
!curTransformFeedback->isPaused())
{ {
// EXT_geometry_shader allows transform feedback to work with all draw commands. // EXT_geometry_shader allows transform feedback to work with all draw commands.
// [EXT_geometry_shader] Section 12.1, "Transform Feedback" // [EXT_geometry_shader] Section 12.1, "Transform Feedback"
......
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