Commit 526a6f6b by Jamie Madill Committed by Commit Bot

Cache valid draw modes for draw calls.

This optimizes some of our dynamic switching. It uses packed enum maps. Bug: angleproject:2747 Change-Id: Ibd2f9306d066f2fd9eb64c99a25668b7ba5c009c Reviewed-on: https://chromium-review.googlesource.com/1171505 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarFrank Henigman <fjhenigman@chromium.org>
parent daab0014
......@@ -260,17 +260,17 @@ void LimitCap(CapT *cap, MaxT maximum)
}
constexpr angle::PackedEnumMap<gl::PrimitiveMode, GLsizei> kMinimumPrimitiveCounts = {{
/* Points */ 1,
/* Lines */ 2,
/* LineLoop */ 2,
/* LineStrip */ 2,
/* Triangles */ 3,
/* TriangleStrip */ 3,
/* TriangleFan */ 3,
/* LinesAdjacency */ 2,
/* LineStripAdjacency */ 2,
/* TrianglesAdjacency */ 3,
/* TriangleStripAdjacency */ 3,
1, /* Points */
2, /* Lines */
2, /* LineLoop */
2, /* LineStrip */
3, /* Triangles */
3, /* TriangleStrip */
3, /* TriangleFan */
2, /* LinesAdjacency */
2, /* LineStripAdjacency */
3, /* TrianglesAdjacency */
3, /* TriangleStripAdjacency */
}};
// Indices above are code-gen'd so make sure they don't change
// if any of these static asserts are hit, must update kMinimumPrimitiveCounts abouve
......@@ -7893,6 +7893,7 @@ void StateCache::onProgramExecutableChange(Context *context)
updateActiveAttribsMask(context);
updateVertexElementLimits(context);
updateBasicDrawStatesError();
updateValidDrawModes(context);
}
void StateCache::onVertexArrayFormatChange(Context *context)
......@@ -7967,4 +7968,47 @@ void StateCache::onBufferBindingChange(Context *context)
{
updateBasicDrawStatesError();
}
void StateCache::updateValidDrawModes(Context *context)
{
Program *program = context->getGLState().getProgram();
if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
{
mCachedValidDrawModes = {{
true, /* Points */
true, /* Lines */
true, /* LineLoop */
true, /* LineStrip */
true, /* Triangles */
true, /* TriangleStrip */
true, /* TriangleFan */
false, /* LinesAdjacency */
false, /* LineStripAdjacency */
false, /* TrianglesAdjacency */
false, /* TriangleStripAdjacency */
false, /* InvalidEnum */
}};
}
else
{
ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
mCachedValidDrawModes = {{
gsMode == PrimitiveMode::Points, /* Points */
gsMode == PrimitiveMode::Lines, /* Lines */
gsMode == PrimitiveMode::Lines, /* LineLoop */
gsMode == PrimitiveMode::Lines, /* LineStrip */
gsMode == PrimitiveMode::Triangles, /* Triangles */
gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
gsMode == PrimitiveMode::Triangles, /* TriangleFan */
gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
false, /* InvalidEnum */
}};
}
}
} // namespace gl
......@@ -137,6 +137,13 @@ class StateCache final : angle::NonCopyable
return getBasicDrawStatesErrorImpl(context);
}
// Places that can trigger updateValidDrawModes:
// 1. onProgramExecutableChange.
bool isValidDrawMode(PrimitiveMode primitiveMode) const
{
return mCachedValidDrawModes[primitiveMode];
}
// State change notifications.
void onVertexArrayBindingChange(Context *context);
void onProgramExecutableChange(Context *context);
......@@ -160,6 +167,7 @@ class StateCache final : angle::NonCopyable
void updateActiveAttribsMask(Context *context);
void updateVertexElementLimits(Context *context);
void updateBasicDrawStatesError();
void updateValidDrawModes(Context *context);
intptr_t getBasicDrawStatesErrorImpl(Context *context) const;
......@@ -172,6 +180,10 @@ class StateCache final : angle::NonCopyable
GLint64 mCachedNonInstancedVertexElementLimit;
GLint64 mCachedInstancedVertexElementLimit;
mutable intptr_t mCachedBasicDrawStatesError;
// Reserve an extra slot at the end of the map for invalid enum.
angle::PackedEnumMap<PrimitiveMode, bool, angle::EnumSize<PrimitiveMode>() + 1>
mCachedValidDrawModes;
};
class Context final : public egl::LabeledObject, angle::NonCopyable, public angle::ObserverInterface
......
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