Commit 2b7fdb62 by Peng Huang Committed by Commit Bot

Reland "Fix bindFramebuffer problem with GLES2 devices"

This is a reland of 92049513 Original change's description: > Fix bindFramebuffer problem with GLES2 devices > > GLES2 and OpengGL 2 don't support GL_{DRAW,READ}_FRAMEBUFFER. > Always uses GL_FRAMEBUFFER for them. > > Bug: chromium:1167731 > Change-Id: Iab75a27b4c47d0bdaa2ec18a9019fd2d2535b04d > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2737062 > Commit-Queue: Peng Huang <penghuang@chromium.org> > Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> > Reviewed-by: Geoff Lang <geofflang@chromium.org> Bug: chromium:1167731 Change-Id: I530a47fa3367ca98dbde24e3084515d5562ac8b0 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2743664Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Peng Huang <penghuang@chromium.org>
parent 7ee24229
......@@ -650,7 +650,9 @@ angle::Result FramebufferGL::readPixels(const gl::Context *context,
GL_INVALID_OPERATION);
}
stateManager->bindFramebuffer(GL_READ_FRAMEBUFFER, mFramebufferID);
GLenum framebufferTarget =
stateManager->getHasSeparateFramebufferBindings() ? GL_READ_FRAMEBUFFER : GL_FRAMEBUFFER;
stateManager->bindFramebuffer(framebufferTarget, mFramebufferID);
bool useOverlappingRowsWorkaround = features.packOverlappingRowsSeparatelyPackBuffer.enabled &&
packBuffer && packState.rowLength != 0 &&
......
......@@ -135,6 +135,8 @@ StateManagerGL::StateManagerGL(const FunctionsGL *functions,
mClearStencil(0),
mFramebufferSRGBAvailable(extensions.sRGBWriteControl),
mFramebufferSRGBEnabled(false),
mHasSeparateFramebufferBindings(mFunctions->isAtLeastGL(gl::Version(3, 0)) ||
mFunctions->isAtLeastGLES(gl::Version(3, 0))),
mDitherEnabled(true),
mTextureCubemapSeamlessEnabled(false),
mMultisamplingEnabled(true),
......@@ -286,13 +288,25 @@ void StateManagerGL::deleteFramebuffer(GLuint fbo)
{
if (fbo != 0)
{
for (size_t binding = 0; binding < mFramebuffers.size(); ++binding)
if (mHasSeparateFramebufferBindings)
{
if (mFramebuffers[binding] == fbo)
for (size_t binding = 0; binding < mFramebuffers.size(); ++binding)
{
GLenum enumValue = angle::FramebufferBindingToEnum(
static_cast<angle::FramebufferBinding>(binding));
bindFramebuffer(enumValue, 0);
if (mFramebuffers[binding] == fbo)
{
GLenum enumValue = angle::FramebufferBindingToEnum(
static_cast<angle::FramebufferBinding>(binding));
bindFramebuffer(enumValue, 0);
}
}
}
else
{
ASSERT(mFramebuffers[angle::FramebufferBindingRead] ==
mFramebuffers[angle::FramebufferBindingDraw]);
if (mFramebuffers[angle::FramebufferBindingRead] == fbo)
{
bindFramebuffer(GL_FRAMEBUFFER, 0);
}
}
mFunctions->deleteFramebuffers(1, &fbo);
......@@ -608,6 +622,7 @@ void StateManagerGL::bindFramebuffer(GLenum type, GLuint framebuffer)
break;
case GL_READ_FRAMEBUFFER:
ASSERT(mHasSeparateFramebufferBindings);
if (mFramebuffers[angle::FramebufferBindingRead] != framebuffer)
{
mFramebuffers[angle::FramebufferBindingRead] = framebuffer;
......@@ -618,6 +633,7 @@ void StateManagerGL::bindFramebuffer(GLenum type, GLuint framebuffer)
break;
case GL_DRAW_FRAMEBUFFER:
ASSERT(mHasSeparateFramebufferBindings);
if (mFramebuffers[angle::FramebufferBindingDraw] != framebuffer)
{
mFramebuffers[angle::FramebufferBindingDraw] = framebuffer;
......@@ -1901,7 +1917,9 @@ angle::Result StateManagerGL::syncState(const gl::Context *context,
continue;
FramebufferGL *framebufferGL = GetImplAs<FramebufferGL>(framebuffer);
bindFramebuffer(GL_READ_FRAMEBUFFER, framebufferGL->getFramebufferID());
bindFramebuffer(
mHasSeparateFramebufferBindings ? GL_READ_FRAMEBUFFER : GL_FRAMEBUFFER,
framebufferGL->getFramebufferID());
break;
}
case gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING:
......@@ -1913,7 +1931,9 @@ angle::Result StateManagerGL::syncState(const gl::Context *context,
continue;
FramebufferGL *framebufferGL = GetImplAs<FramebufferGL>(framebuffer);
bindFramebuffer(GL_DRAW_FRAMEBUFFER, framebufferGL->getFramebufferID());
bindFramebuffer(
mHasSeparateFramebufferBindings ? GL_DRAW_FRAMEBUFFER : GL_FRAMEBUFFER,
framebufferGL->getFramebufferID());
const gl::Program *program = state.getProgram();
if (program)
......
......@@ -260,6 +260,8 @@ class StateManagerGL final : angle::NonCopyable
}
GLuint getBufferID(gl::BufferBinding binding) const { return mBuffers[binding]; }
bool getHasSeparateFramebufferBindings() const { return mHasSeparateFramebufferBindings; }
void validateState() const;
void syncFromNativeContext(const gl::Extensions &extensions, ExternalContextState *state);
......@@ -449,6 +451,7 @@ class StateManagerGL final : angle::NonCopyable
bool mFramebufferSRGBAvailable;
bool mFramebufferSRGBEnabled;
const bool mHasSeparateFramebufferBindings;
bool mDitherEnabled;
bool mTextureCubemapSeamlessEnabled;
......
......@@ -797,7 +797,9 @@ angle::Result TextureGL::copySubImage(const gl::Context *context,
destOffset.y + clippedArea.y - sourceArea.y, destOffset.z);
stateManager->bindTexture(getType(), mTextureID);
stateManager->bindFramebuffer(GL_READ_FRAMEBUFFER, sourceFramebufferGL->getFramebufferID());
GLenum framebufferTarget =
stateManager->getHasSeparateFramebufferBindings() ? GL_READ_FRAMEBUFFER : GL_FRAMEBUFFER;
stateManager->bindFramebuffer(framebufferTarget, sourceFramebufferGL->getFramebufferID());
const LevelInfoGL &levelInfo = getLevelInfo(target, level);
if (levelInfo.lumaWorkaround.enabled)
......
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