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
return mIsDefault;
}
void FramebufferGL::maskOutInactiveOutputDrawBuffers(DrawBufferMask maxSet)
void FramebufferGL::maskOutInactiveOutputDrawBuffers(GLenum binding, DrawBufferMask maxSet)
{
auto targetAppliedDrawBuffers = mState.getEnabledDrawBuffers() & maxSet;
if (mAppliedEnabledDrawBuffers != targetAppliedDrawBuffers)
......@@ -727,7 +727,7 @@ void FramebufferGL::maskOutInactiveOutputDrawBuffers(DrawBufferMask maxSet)
drawBuffers[i] = targetAppliedDrawBuffers[i] ? stateDrawBuffers[i] : GL_NONE;
}
mStateManager->bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
mStateManager->bindFramebuffer(binding, mFramebufferID);
mFunctions->drawBuffers(drawBufferCount, drawBuffers);
}
}
......
......@@ -95,7 +95,7 @@ class FramebufferGL : public FramebufferImpl
GLuint getFramebufferID() const;
bool isDefault() const;
void maskOutInactiveOutputDrawBuffers(gl::DrawBufferMask maxSet);
void maskOutInactiveOutputDrawBuffers(GLenum binding, gl::DrawBufferMask maxSet);
private:
void syncClearState(const gl::Context *context, GLbitfield mask);
......
......@@ -590,25 +590,44 @@ void StateManagerGL::setPixelPackBuffer(const gl::Buffer *pixelBuffer)
void StateManagerGL::bindFramebuffer(GLenum type, GLuint framebuffer)
{
if (type == GL_FRAMEBUFFER)
switch (type)
{
if (mFramebuffers[angle::FramebufferBindingRead] != framebuffer ||
mFramebuffers[angle::FramebufferBindingDraw] != framebuffer)
{
mFramebuffers[angle::FramebufferBindingRead] = framebuffer;
mFramebuffers[angle::FramebufferBindingDraw] = framebuffer;
mFunctions->bindFramebuffer(GL_FRAMEBUFFER, framebuffer);
}
}
else
{
angle::FramebufferBinding binding = angle::EnumToFramebufferBinding(type);
case GL_FRAMEBUFFER:
if (mFramebuffers[angle::FramebufferBindingRead] != framebuffer ||
mFramebuffers[angle::FramebufferBindingDraw] != framebuffer)
{
mFramebuffers[angle::FramebufferBindingRead] = framebuffer;
mFramebuffers[angle::FramebufferBindingDraw] = framebuffer;
mFunctions->bindFramebuffer(GL_FRAMEBUFFER, framebuffer);
if (mFramebuffers[binding] != framebuffer)
{
mFramebuffers[binding] = framebuffer;
mFunctions->bindFramebuffer(type, framebuffer);
}
mLocalDirtyBits.set(gl::State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
mLocalDirtyBits.set(gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
}
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)
setGenericShaderState(context);
gl::Framebuffer *framebuffer = glState.getDrawFramebuffer();
FramebufferGL *framebufferGL = GetImplAs<FramebufferGL>(framebuffer);
bindFramebuffer(GL_DRAW_FRAMEBUFFER, framebufferGL->getFramebufferID());
if (context->getExtensions().webglCompatibility)
{
FramebufferGL *framebufferGL = GetImplAs<FramebufferGL>(glState.getDrawFramebuffer());
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();
}
......@@ -1912,14 +1932,20 @@ void StateManagerGL::syncState(const gl::Context *context, const gl::State::Dirt
// TODO(jmadill): implement this
break;
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;
}
case gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING:
{
// TODO(jmadill): implement this
updateMultiviewBaseViewLayerIndexUniform(
state.getProgram(),
state.getDrawFramebuffer()->getImplementation()->getState());
gl::Framebuffer *framebuffer = state.getDrawFramebuffer();
FramebufferGL *framebufferGL = GetImplAs<FramebufferGL>(framebuffer);
bindFramebuffer(GL_DRAW_FRAMEBUFFER, framebufferGL->getFramebufferID());
const gl::Program *program = state.getProgram();
updateMultiviewBaseViewLayerIndexUniform(program, framebufferGL->getState());
break;
}
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