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) ...@@ -309,4 +309,50 @@ inline const DestT *GetImplAs(const SrcT *src)
#include "angletypes.inl" #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_ #endif // LIBANGLE_ANGLETYPES_H_
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
namespace rx namespace rx
{ {
StateManagerGL::StateManagerGL(const FunctionsGL *functions, const gl::Caps &rendererCaps) StateManagerGL::StateManagerGL(const FunctionsGL *functions, const gl::Caps &rendererCaps)
: mFunctions(functions), : mFunctions(functions),
mProgram(0), mProgram(0),
...@@ -38,7 +37,7 @@ StateManagerGL::StateManagerGL(const FunctionsGL *functions, const gl::Caps &ren ...@@ -38,7 +37,7 @@ StateManagerGL::StateManagerGL(const FunctionsGL *functions, const gl::Caps &ren
mPackRowLength(0), mPackRowLength(0),
mPackSkipRows(0), mPackSkipRows(0),
mPackSkipPixels(0), mPackSkipPixels(0),
mFramebuffers(), mFramebuffers(angle::FramebufferBindingSingletonMax, 0),
mRenderbuffer(0), mRenderbuffer(0),
mScissorTestEnabled(false), mScissorTestEnabled(false),
mScissor(0, 0, 0, 0), mScissor(0, 0, 0, 0),
...@@ -98,9 +97,6 @@ StateManagerGL::StateManagerGL(const FunctionsGL *functions, const gl::Caps &ren ...@@ -98,9 +97,6 @@ StateManagerGL::StateManagerGL(const FunctionsGL *functions, const gl::Caps &ren
mTextures[GL_TEXTURE_2D_ARRAY].resize(rendererCaps.maxCombinedTextureImageUnits); mTextures[GL_TEXTURE_2D_ARRAY].resize(rendererCaps.maxCombinedTextureImageUnits);
mTextures[GL_TEXTURE_3D].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 // Initialize point sprite state for desktop GL
if (mFunctions->standard == STANDARD_GL_DESKTOP) if (mFunctions->standard == STANDARD_GL_DESKTOP)
{ {
...@@ -182,13 +178,14 @@ void StateManagerGL::deleteFramebuffer(GLuint fbo) ...@@ -182,13 +178,14 @@ void StateManagerGL::deleteFramebuffer(GLuint fbo)
{ {
if (fbo != 0) 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); mFunctions->deleteFramebuffers(1, &fbo);
} }
} }
...@@ -324,19 +321,21 @@ void StateManagerGL::bindFramebuffer(GLenum type, GLuint framebuffer) ...@@ -324,19 +321,21 @@ void StateManagerGL::bindFramebuffer(GLenum type, GLuint framebuffer)
{ {
if (type == GL_FRAMEBUFFER) if (type == GL_FRAMEBUFFER)
{ {
if (mFramebuffers[GL_READ_FRAMEBUFFER] != framebuffer || if (mFramebuffers[angle::FramebufferBindingRead] != framebuffer ||
mFramebuffers[GL_DRAW_FRAMEBUFFER] != framebuffer) mFramebuffers[angle::FramebufferBindingDraw] != framebuffer)
{ {
mFramebuffers[GL_READ_FRAMEBUFFER] = framebuffer; mFramebuffers[angle::FramebufferBindingRead] = framebuffer;
mFramebuffers[GL_DRAW_FRAMEBUFFER] = framebuffer; mFramebuffers[angle::FramebufferBindingDraw] = framebuffer;
mFunctions->bindFramebuffer(GL_FRAMEBUFFER, framebuffer); mFunctions->bindFramebuffer(GL_FRAMEBUFFER, framebuffer);
} }
} }
else 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); mFunctions->bindFramebuffer(type, framebuffer);
} }
} }
......
...@@ -127,7 +127,8 @@ class StateManagerGL : angle::NonCopyable ...@@ -127,7 +127,8 @@ class StateManagerGL : angle::NonCopyable
GLint mPackSkipRows; GLint mPackSkipRows;
GLint mPackSkipPixels; GLint mPackSkipPixels;
std::map<GLenum, GLuint> mFramebuffers; // TODO(jmadill): Convert to std::array when available
std::vector<GLenum> mFramebuffers;
GLuint mRenderbuffer; GLuint mRenderbuffer;
bool mScissorTestEnabled; 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