Commit 809b13ed by Geoff Lang Committed by Commit Bot

StateManagerGL: Use dirty bits for framebuffer bindings.

BUG=angleproject:2188 Change-Id: Icbe78f645b693a5b2ef555feffda0f618209e867 Reviewed-on: https://chromium-review.googlesource.com/757092 Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarLuc Ferron <lucferron@chromium.org>
parent f4d693c0
...@@ -710,7 +710,7 @@ bool FramebufferGL::isDefault() const ...@@ -710,7 +710,7 @@ bool FramebufferGL::isDefault() const
return mIsDefault; return mIsDefault;
} }
void FramebufferGL::maskOutInactiveOutputDrawBuffers(DrawBufferMask maxSet) void FramebufferGL::maskOutInactiveOutputDrawBuffers(GLenum binding, DrawBufferMask maxSet)
{ {
auto targetAppliedDrawBuffers = mState.getEnabledDrawBuffers() & maxSet; auto targetAppliedDrawBuffers = mState.getEnabledDrawBuffers() & maxSet;
if (mAppliedEnabledDrawBuffers != targetAppliedDrawBuffers) if (mAppliedEnabledDrawBuffers != targetAppliedDrawBuffers)
...@@ -727,7 +727,7 @@ void FramebufferGL::maskOutInactiveOutputDrawBuffers(DrawBufferMask maxSet) ...@@ -727,7 +727,7 @@ void FramebufferGL::maskOutInactiveOutputDrawBuffers(DrawBufferMask maxSet)
drawBuffers[i] = targetAppliedDrawBuffers[i] ? stateDrawBuffers[i] : GL_NONE; drawBuffers[i] = targetAppliedDrawBuffers[i] ? stateDrawBuffers[i] : GL_NONE;
} }
mStateManager->bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID); mStateManager->bindFramebuffer(binding, mFramebufferID);
mFunctions->drawBuffers(drawBufferCount, drawBuffers); mFunctions->drawBuffers(drawBufferCount, drawBuffers);
} }
} }
......
...@@ -95,7 +95,7 @@ class FramebufferGL : public FramebufferImpl ...@@ -95,7 +95,7 @@ class FramebufferGL : public FramebufferImpl
GLuint getFramebufferID() const; GLuint getFramebufferID() const;
bool isDefault() const; bool isDefault() const;
void maskOutInactiveOutputDrawBuffers(gl::DrawBufferMask maxSet); void maskOutInactiveOutputDrawBuffers(GLenum binding, gl::DrawBufferMask maxSet);
private: private:
void syncClearState(const gl::Context *context, GLbitfield mask); void syncClearState(const gl::Context *context, GLbitfield mask);
......
...@@ -590,25 +590,44 @@ void StateManagerGL::setPixelPackBuffer(const gl::Buffer *pixelBuffer) ...@@ -590,25 +590,44 @@ void StateManagerGL::setPixelPackBuffer(const gl::Buffer *pixelBuffer)
void StateManagerGL::bindFramebuffer(GLenum type, GLuint framebuffer) void StateManagerGL::bindFramebuffer(GLenum type, GLuint framebuffer)
{ {
if (type == GL_FRAMEBUFFER) switch (type)
{ {
if (mFramebuffers[angle::FramebufferBindingRead] != framebuffer || case GL_FRAMEBUFFER:
mFramebuffers[angle::FramebufferBindingDraw] != framebuffer) if (mFramebuffers[angle::FramebufferBindingRead] != framebuffer ||
{ mFramebuffers[angle::FramebufferBindingDraw] != framebuffer)
mFramebuffers[angle::FramebufferBindingRead] = framebuffer; {
mFramebuffers[angle::FramebufferBindingDraw] = framebuffer; mFramebuffers[angle::FramebufferBindingRead] = framebuffer;
mFunctions->bindFramebuffer(GL_FRAMEBUFFER, framebuffer); mFramebuffers[angle::FramebufferBindingDraw] = framebuffer;
} mFunctions->bindFramebuffer(GL_FRAMEBUFFER, framebuffer);
}
else
{
angle::FramebufferBinding binding = angle::EnumToFramebufferBinding(type);
if (mFramebuffers[binding] != framebuffer) mLocalDirtyBits.set(gl::State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
{ mLocalDirtyBits.set(gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
mFramebuffers[binding] = framebuffer; }
mFunctions->bindFramebuffer(type, framebuffer); break;
}
case GL_READ_FRAMEBUFFER:
if (mFramebuffers[angle::FramebufferBindingRead] != framebuffer)
{
mFramebuffers[angle::FramebufferBindingRead] = framebuffer;
mFunctions->bindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);
mLocalDirtyBits.set(gl::State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
}
break;
case GL_DRAW_FRAMEBUFFER:
if (mFramebuffers[angle::FramebufferBindingDraw] != framebuffer)
{
mFramebuffers[angle::FramebufferBindingDraw] = framebuffer;
mFunctions->bindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer);
mLocalDirtyBits.set(gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
}
break;
default:
UNREACHABLE();
break;
} }
} }
...@@ -1024,16 +1043,17 @@ gl::Error StateManagerGL::setGenericDrawState(const gl::Context *context) ...@@ -1024,16 +1043,17 @@ gl::Error StateManagerGL::setGenericDrawState(const gl::Context *context)
setGenericShaderState(context); setGenericShaderState(context);
gl::Framebuffer *framebuffer = glState.getDrawFramebuffer();
FramebufferGL *framebufferGL = GetImplAs<FramebufferGL>(framebuffer);
bindFramebuffer(GL_DRAW_FRAMEBUFFER, framebufferGL->getFramebufferID());
if (context->getExtensions().webglCompatibility) if (context->getExtensions().webglCompatibility)
{ {
FramebufferGL *framebufferGL = GetImplAs<FramebufferGL>(glState.getDrawFramebuffer());
auto activeOutputs = glState.getProgram()->getState().getActiveOutputVariables(); auto activeOutputs = glState.getProgram()->getState().getActiveOutputVariables();
framebufferGL->maskOutInactiveOutputDrawBuffers(activeOutputs); framebufferGL->maskOutInactiveOutputDrawBuffers(GL_DRAW_FRAMEBUFFER, activeOutputs);
} }
ASSERT(
mFramebuffers[angle::FramebufferBindingDraw] ==
GetImplAs<FramebufferGL>(context->getGLState().getDrawFramebuffer())->getFramebufferID());
return gl::NoError(); return gl::NoError();
} }
...@@ -1912,14 +1932,20 @@ void StateManagerGL::syncState(const gl::Context *context, const gl::State::Dirt ...@@ -1912,14 +1932,20 @@ void StateManagerGL::syncState(const gl::Context *context, const gl::State::Dirt
// TODO(jmadill): implement this // TODO(jmadill): implement this
break; break;
case gl::State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING: case gl::State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING:
// TODO(jmadill): implement this {
gl::Framebuffer *framebuffer = state.getReadFramebuffer();
FramebufferGL *framebufferGL = GetImplAs<FramebufferGL>(framebuffer);
bindFramebuffer(GL_READ_FRAMEBUFFER, framebufferGL->getFramebufferID());
break; break;
}
case gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING: case gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING:
{ {
// TODO(jmadill): implement this gl::Framebuffer *framebuffer = state.getDrawFramebuffer();
updateMultiviewBaseViewLayerIndexUniform( FramebufferGL *framebufferGL = GetImplAs<FramebufferGL>(framebuffer);
state.getProgram(), bindFramebuffer(GL_DRAW_FRAMEBUFFER, framebufferGL->getFramebufferID());
state.getDrawFramebuffer()->getImplementation()->getState());
const gl::Program *program = state.getProgram();
updateMultiviewBaseViewLayerIndexUniform(program, framebufferGL->getState());
break; break;
} }
case gl::State::DIRTY_BIT_RENDERBUFFER_BINDING: case gl::State::DIRTY_BIT_RENDERBUFFER_BINDING:
......
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