Use flat enum for PrimitiveMode.
The GLenum was already mostly packed. There were just a few missing
values because of the exclusion of things like GL_QUADS and GL_POLYGON
from GLES.
Also update the PackedEnumMap initialization to take an intializer.
The initializer is a list of key/values which is much more robust to
changes in the packed map.
Improves draw call speed slightly as there is no conversion needed any
more for the mode enum.
Bug: angleproject:2966
Change-Id: Icae658272c6234f29335f6a57a63cf341cf5b2a0
Reviewed-on: https://chromium-review.googlesource.com/c/1346529
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index 64a7308..4fd3a2d 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -47,6 +47,8 @@
#include "libANGLE/renderer/Format.h"
#include "libANGLE/validationES.h"
+namespace gl
+{
namespace
{
@@ -56,12 +58,12 @@
#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
template <typename T>
-std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
- GLsizei numPaths,
- const void *paths,
- GLuint pathBase)
+std::vector<Path *> GatherPaths(PathManager &resourceManager,
+ GLsizei numPaths,
+ const void *paths,
+ GLuint pathBase)
{
- std::vector<gl::Path *> ret;
+ std::vector<Path *> ret;
ret.reserve(numPaths);
const auto *nameArray = static_cast<const T *>(paths);
@@ -76,11 +78,11 @@
return ret;
}
-std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
- GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase)
+std::vector<Path *> GatherPaths(PathManager &resourceManager,
+ GLsizei numPaths,
+ GLenum pathNameType,
+ const void *paths,
+ GLuint pathBase)
{
switch (pathNameType)
{
@@ -104,14 +106,11 @@
}
UNREACHABLE();
- return std::vector<gl::Path *>();
+ return std::vector<Path *>();
}
template <typename T>
-angle::Result GetQueryObjectParameter(const gl::Context *context,
- gl::Query *query,
- GLenum pname,
- T *params)
+angle::Result GetQueryObjectParameter(const Context *context, Query *query, GLenum pname, T *params)
{
ASSERT(query != nullptr);
@@ -123,7 +122,7 @@
{
bool available;
ANGLE_TRY(query->isResultAvailable(context, &available));
- *params = gl::CastFromStateValue<T>(pname, static_cast<GLuint>(available));
+ *params = CastFromStateValue<T>(pname, static_cast<GLuint>(available));
return angle::Result::Continue();
}
default:
@@ -132,8 +131,8 @@
}
}
-ANGLE_INLINE void MarkTransformFeedbackBufferUsage(const gl::Context *context,
- gl::TransformFeedback *transformFeedback,
+ANGLE_INLINE void MarkTransformFeedbackBufferUsage(const Context *context,
+ TransformFeedback *transformFeedback,
GLsizei count,
GLsizei instanceCount)
{
@@ -154,9 +153,9 @@
return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
}
-gl::Version GetClientVersion(const egl::AttributeMap &attribs)
+Version GetClientVersion(const egl::AttributeMap &attribs)
{
- return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
+ return Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
}
GLenum GetResetStrategy(const egl::AttributeMap &attribs)
@@ -256,45 +255,31 @@
*cap = std::min(*cap, static_cast<CapT>(maximum));
}
-constexpr angle::PackedEnumMap<gl::PrimitiveMode, GLsizei> kMinimumPrimitiveCounts = {{
- 1, /* Points */
- 2, /* Lines */
- 2, /* LineLoop */
- 2, /* LineStrip */
- 3, /* Triangles */
- 3, /* TriangleStrip */
- 3, /* TriangleFan */
- 2, /* LinesAdjacency */
- 2, /* LineStripAdjacency */
- 3, /* TrianglesAdjacency */
- 3, /* TriangleStripAdjacency */
+constexpr angle::PackedEnumMap<PrimitiveMode, GLsizei> kMinimumPrimitiveCounts = {{
+ {PrimitiveMode::Points, 1},
+ {PrimitiveMode::Lines, 2},
+ {PrimitiveMode::LineLoop, 2},
+ {PrimitiveMode::LineStrip, 2},
+ {PrimitiveMode::Triangles, 3},
+ {PrimitiveMode::TriangleStrip, 3},
+ {PrimitiveMode::TriangleFan, 3},
+ {PrimitiveMode::LinesAdjacency, 2},
+ {PrimitiveMode::LineStripAdjacency, 2},
+ {PrimitiveMode::TrianglesAdjacency, 3},
+ {PrimitiveMode::TriangleStripAdjacency, 3},
}};
-// 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
-static_assert(static_cast<gl::PrimitiveMode>(0) == gl::PrimitiveMode::Points,
- "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
-static_assert(static_cast<gl::PrimitiveMode>(1) == gl::PrimitiveMode::Lines,
- "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
-static_assert(static_cast<gl::PrimitiveMode>(2) == gl::PrimitiveMode::LineLoop,
- "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
-static_assert(static_cast<gl::PrimitiveMode>(3) == gl::PrimitiveMode::LineStrip,
- "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
-static_assert(static_cast<gl::PrimitiveMode>(4) == gl::PrimitiveMode::Triangles,
- "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
-static_assert(static_cast<gl::PrimitiveMode>(5) == gl::PrimitiveMode::TriangleStrip,
- "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
-static_assert(static_cast<gl::PrimitiveMode>(6) == gl::PrimitiveMode::TriangleFan,
- "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
-static_assert(static_cast<gl::PrimitiveMode>(7) == gl::PrimitiveMode::LinesAdjacency,
- "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
-static_assert(static_cast<gl::PrimitiveMode>(8) == gl::PrimitiveMode::LineStripAdjacency,
- "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
-static_assert(static_cast<gl::PrimitiveMode>(9) == gl::PrimitiveMode::TrianglesAdjacency,
- "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
-static_assert(static_cast<gl::PrimitiveMode>(10) == gl::PrimitiveMode::TriangleStripAdjacency,
- "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
-static_assert(static_cast<gl::PrimitiveMode>(11) == gl::PrimitiveMode::EnumCount,
- "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
+
+// The rest default to false.
+constexpr angle::PackedEnumMap<PrimitiveMode, bool, angle::EnumSize<PrimitiveMode>() + 1>
+ kValidBasicDrawModes = {{
+ {PrimitiveMode::Points, true},
+ {PrimitiveMode::Lines, true},
+ {PrimitiveMode::LineLoop, true},
+ {PrimitiveMode::LineStrip, true},
+ {PrimitiveMode::Triangles, true},
+ {PrimitiveMode::TriangleStrip, true},
+ {PrimitiveMode::TriangleFan, true},
+ }};
enum SubjectIndexes : angle::SubjectIndex
{
@@ -311,9 +296,6 @@
};
} // anonymous namespace
-namespace gl
-{
-
Context::Context(rx::EGLImplFactory *implFactory,
const egl::Config *config,
const Context *shareContext,
@@ -8413,20 +8395,7 @@
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 */
- }};
+ mCachedValidDrawModes = kValidBasicDrawModes;
}
else
{
@@ -8435,18 +8404,17 @@
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 */
+ {PrimitiveMode::Points, gsMode == PrimitiveMode::Points},
+ {PrimitiveMode::Lines, gsMode == PrimitiveMode::Lines},
+ {PrimitiveMode::LineLoop, gsMode == PrimitiveMode::Lines},
+ {PrimitiveMode::LineStrip, gsMode == PrimitiveMode::Lines},
+ {PrimitiveMode::Triangles, gsMode == PrimitiveMode::Triangles},
+ {PrimitiveMode::TriangleStrip, gsMode == PrimitiveMode::Triangles},
+ {PrimitiveMode::TriangleFan, gsMode == PrimitiveMode::Triangles},
+ {PrimitiveMode::LinesAdjacency, gsMode == PrimitiveMode::LinesAdjacency},
+ {PrimitiveMode::LineStripAdjacency, gsMode == PrimitiveMode::LinesAdjacency},
+ {PrimitiveMode::TrianglesAdjacency, gsMode == PrimitiveMode::TrianglesAdjacency},
+ {PrimitiveMode::TriangleStripAdjacency, gsMode == PrimitiveMode::TrianglesAdjacency},
}};
}
}
@@ -8458,16 +8426,14 @@
bool isGLES31 = context->getClientVersion() >= Version(3, 1);
mCachedValidBindTextureTypes = {{
- true, /* _2D */
- isGLES3, /* _2DArray */
- isGLES31 || exts.textureMultisample, /* _2DMultisample */
- exts.textureStorageMultisample2DArray, /* _2DMultisampleArray */
- isGLES3, /* _3D */
- exts.eglImageExternal || exts.eglStreamConsumerExternal, /* External */
- exts.textureRectangle, /* Rectangle */
- true, /* CubeMap */
- false, /* InvalidEnum */
-
+ {TextureType::_2D, true},
+ {TextureType::_2DArray, isGLES3},
+ {TextureType::_2DMultisample, isGLES31 || exts.textureMultisample},
+ {TextureType::_2DMultisampleArray, exts.textureStorageMultisample2DArray},
+ {TextureType::_3D, isGLES3},
+ {TextureType::External, exts.eglImageExternal || exts.eglStreamConsumerExternal},
+ {TextureType::Rectangle, exts.textureRectangle},
+ {TextureType::CubeMap, true},
}};
}
} // namespace gl