Commit c64d993d by Jamie Madill

StateManagerGL: Use an array instead of map for FBOs.

The std::map became a significant bottleneck for draw calls. BUG=angleproject:959 Change-Id: I28176d1474fe5cff05018f89878ea8b2a3e3f9f1 Reviewed-on: https://chromium-review.googlesource.com/288702Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent e8c8de2d
......@@ -309,4 +309,50 @@ inline const DestT *GetImplAs(const SrcT *src)
#include "angletypes.inl"
namespace angle
{
// Zero-based for better array indexing
enum FramebufferBinding
{
FramebufferBindingRead = 0,
FramebufferBindingDraw,
FramebufferBindingSingletonMax,
FramebufferBindingBoth = FramebufferBindingSingletonMax,
FramebufferBindingMax,
FramebufferBindingUnknown = FramebufferBindingMax,
};
inline FramebufferBinding EnumToFramebufferBinding(GLenum enumValue)
{
switch (enumValue)
{
case GL_READ_FRAMEBUFFER:
return FramebufferBindingRead;
case GL_DRAW_FRAMEBUFFER:
return FramebufferBindingDraw;
case GL_FRAMEBUFFER:
return FramebufferBindingBoth;
default:
UNREACHABLE();
return FramebufferBindingUnknown;
}
}
inline GLenum FramebufferBindingToEnum(FramebufferBinding binding)
{
switch (binding)
{
case FramebufferBindingRead:
return GL_READ_FRAMEBUFFER;
case FramebufferBindingDraw:
return GL_DRAW_FRAMEBUFFER;
case FramebufferBindingBoth:
return GL_FRAMEBUFFER;
default:
UNREACHABLE();
return GL_NONE;
}
}
}
#endif // LIBANGLE_ANGLETYPES_H_
......@@ -19,7 +19,6 @@
namespace rx
{
StateManagerGL::StateManagerGL(const FunctionsGL *functions, const gl::Caps &rendererCaps)
: mFunctions(functions),
mProgram(0),
......@@ -38,7 +37,7 @@ StateManagerGL::StateManagerGL(const FunctionsGL *functions, const gl::Caps &ren
mPackRowLength(0),
mPackSkipRows(0),
mPackSkipPixels(0),
mFramebuffers(),
mFramebuffers(angle::FramebufferBindingSingletonMax, 0),
mRenderbuffer(0),
mScissorTestEnabled(false),
mScissor(0, 0, 0, 0),
......@@ -98,9 +97,6 @@ StateManagerGL::StateManagerGL(const FunctionsGL *functions, const gl::Caps &ren
mTextures[GL_TEXTURE_2D_ARRAY].resize(rendererCaps.maxCombinedTextureImageUnits);
mTextures[GL_TEXTURE_3D].resize(rendererCaps.maxCombinedTextureImageUnits);
mFramebuffers[GL_READ_FRAMEBUFFER] = 0;
mFramebuffers[GL_DRAW_FRAMEBUFFER] = 0;
// Initialize point sprite state for desktop GL
if (mFunctions->standard == STANDARD_GL_DESKTOP)
{
......@@ -182,13 +178,14 @@ void StateManagerGL::deleteFramebuffer(GLuint fbo)
{
if (fbo != 0)
{
for (auto fboTypeIter : mFramebuffers)
for (size_t binding = 0; binding < mFramebuffers.size(); ++binding)
{
if (fboTypeIter.second == fbo)
if (mFramebuffers[binding] == fbo)
{
bindFramebuffer(fboTypeIter.first, 0);
GLenum enumValue = angle::FramebufferBindingToEnum(
static_cast<angle::FramebufferBinding>(binding));
bindFramebuffer(enumValue, 0);
}
mFunctions->deleteFramebuffers(1, &fbo);
}
}
......@@ -324,19 +321,21 @@ void StateManagerGL::bindFramebuffer(GLenum type, GLuint framebuffer)
{
if (type == GL_FRAMEBUFFER)
{
if (mFramebuffers[GL_READ_FRAMEBUFFER] != framebuffer ||
mFramebuffers[GL_DRAW_FRAMEBUFFER] != framebuffer)
if (mFramebuffers[angle::FramebufferBindingRead] != framebuffer ||
mFramebuffers[angle::FramebufferBindingDraw] != framebuffer)
{
mFramebuffers[GL_READ_FRAMEBUFFER] = framebuffer;
mFramebuffers[GL_DRAW_FRAMEBUFFER] = framebuffer;
mFramebuffers[angle::FramebufferBindingRead] = framebuffer;
mFramebuffers[angle::FramebufferBindingDraw] = framebuffer;
mFunctions->bindFramebuffer(GL_FRAMEBUFFER, framebuffer);
}
}
else
{
if (mFramebuffers[type] != framebuffer)
angle::FramebufferBinding binding = angle::EnumToFramebufferBinding(type);
if (mFramebuffers[binding] != framebuffer)
{
mFramebuffers[type] = framebuffer;
mFramebuffers[binding] = framebuffer;
mFunctions->bindFramebuffer(type, framebuffer);
}
}
......
......@@ -127,7 +127,8 @@ class StateManagerGL : angle::NonCopyable
GLint mPackSkipRows;
GLint mPackSkipPixels;
std::map<GLenum, GLuint> mFramebuffers;
// TODO(jmadill): Convert to std::array when available
std::vector<GLenum> mFramebuffers;
GLuint mRenderbuffer;
bool mScissorTestEnabled;
......
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