Commit 92049513 by Peng Huang Committed by Commit Bot

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: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent ffd80394
...@@ -650,7 +650,9 @@ angle::Result FramebufferGL::readPixels(const gl::Context *context, ...@@ -650,7 +650,9 @@ angle::Result FramebufferGL::readPixels(const gl::Context *context,
GL_INVALID_OPERATION); 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 && bool useOverlappingRowsWorkaround = features.packOverlappingRowsSeparatelyPackBuffer.enabled &&
packBuffer && packState.rowLength != 0 && packBuffer && packState.rowLength != 0 &&
......
...@@ -135,6 +135,8 @@ StateManagerGL::StateManagerGL(const FunctionsGL *functions, ...@@ -135,6 +135,8 @@ StateManagerGL::StateManagerGL(const FunctionsGL *functions,
mClearStencil(0), mClearStencil(0),
mFramebufferSRGBAvailable(extensions.sRGBWriteControl), mFramebufferSRGBAvailable(extensions.sRGBWriteControl),
mFramebufferSRGBEnabled(false), mFramebufferSRGBEnabled(false),
mHasSeparateFramebufferBindings(mFunctions->isAtLeastGL(gl::Version(3, 0)) ||
mFunctions->isAtLeastGLES(gl::Version(3, 0))),
mDitherEnabled(true), mDitherEnabled(true),
mTextureCubemapSeamlessEnabled(false), mTextureCubemapSeamlessEnabled(false),
mMultisamplingEnabled(true), mMultisamplingEnabled(true),
...@@ -286,13 +288,25 @@ void StateManagerGL::deleteFramebuffer(GLuint fbo) ...@@ -286,13 +288,25 @@ void StateManagerGL::deleteFramebuffer(GLuint fbo)
{ {
if (fbo != 0) 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( if (mFramebuffers[binding] == fbo)
static_cast<angle::FramebufferBinding>(binding)); {
bindFramebuffer(enumValue, 0); 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); mFunctions->deleteFramebuffers(1, &fbo);
...@@ -608,6 +622,7 @@ void StateManagerGL::bindFramebuffer(GLenum type, GLuint framebuffer) ...@@ -608,6 +622,7 @@ void StateManagerGL::bindFramebuffer(GLenum type, GLuint framebuffer)
break; break;
case GL_READ_FRAMEBUFFER: case GL_READ_FRAMEBUFFER:
ASSERT(mHasSeparateFramebufferBindings);
if (mFramebuffers[angle::FramebufferBindingRead] != framebuffer) if (mFramebuffers[angle::FramebufferBindingRead] != framebuffer)
{ {
mFramebuffers[angle::FramebufferBindingRead] = framebuffer; mFramebuffers[angle::FramebufferBindingRead] = framebuffer;
...@@ -618,6 +633,7 @@ void StateManagerGL::bindFramebuffer(GLenum type, GLuint framebuffer) ...@@ -618,6 +633,7 @@ void StateManagerGL::bindFramebuffer(GLenum type, GLuint framebuffer)
break; break;
case GL_DRAW_FRAMEBUFFER: case GL_DRAW_FRAMEBUFFER:
ASSERT(mHasSeparateFramebufferBindings);
if (mFramebuffers[angle::FramebufferBindingDraw] != framebuffer) if (mFramebuffers[angle::FramebufferBindingDraw] != framebuffer)
{ {
mFramebuffers[angle::FramebufferBindingDraw] = framebuffer; mFramebuffers[angle::FramebufferBindingDraw] = framebuffer;
...@@ -1901,7 +1917,9 @@ angle::Result StateManagerGL::syncState(const gl::Context *context, ...@@ -1901,7 +1917,9 @@ angle::Result StateManagerGL::syncState(const gl::Context *context,
continue; continue;
FramebufferGL *framebufferGL = GetImplAs<FramebufferGL>(framebuffer); FramebufferGL *framebufferGL = GetImplAs<FramebufferGL>(framebuffer);
bindFramebuffer(GL_READ_FRAMEBUFFER, framebufferGL->getFramebufferID()); bindFramebuffer(
mHasSeparateFramebufferBindings ? GL_READ_FRAMEBUFFER : GL_FRAMEBUFFER,
framebufferGL->getFramebufferID());
break; break;
} }
case gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING: case gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING:
...@@ -1913,7 +1931,9 @@ angle::Result StateManagerGL::syncState(const gl::Context *context, ...@@ -1913,7 +1931,9 @@ angle::Result StateManagerGL::syncState(const gl::Context *context,
continue; continue;
FramebufferGL *framebufferGL = GetImplAs<FramebufferGL>(framebuffer); 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(); const gl::Program *program = state.getProgram();
if (program) if (program)
......
...@@ -260,6 +260,8 @@ class StateManagerGL final : angle::NonCopyable ...@@ -260,6 +260,8 @@ class StateManagerGL final : angle::NonCopyable
} }
GLuint getBufferID(gl::BufferBinding binding) const { return mBuffers[binding]; } GLuint getBufferID(gl::BufferBinding binding) const { return mBuffers[binding]; }
bool getHasSeparateFramebufferBindings() const { return mHasSeparateFramebufferBindings; }
void validateState() const; void validateState() const;
void syncFromNativeContext(const gl::Extensions &extensions, ExternalContextState *state); void syncFromNativeContext(const gl::Extensions &extensions, ExternalContextState *state);
...@@ -449,6 +451,7 @@ class StateManagerGL final : angle::NonCopyable ...@@ -449,6 +451,7 @@ class StateManagerGL final : angle::NonCopyable
bool mFramebufferSRGBAvailable; bool mFramebufferSRGBAvailable;
bool mFramebufferSRGBEnabled; bool mFramebufferSRGBEnabled;
const bool mHasSeparateFramebufferBindings;
bool mDitherEnabled; bool mDitherEnabled;
bool mTextureCubemapSeamlessEnabled; bool mTextureCubemapSeamlessEnabled;
......
...@@ -797,7 +797,9 @@ angle::Result TextureGL::copySubImage(const gl::Context *context, ...@@ -797,7 +797,9 @@ angle::Result TextureGL::copySubImage(const gl::Context *context,
destOffset.y + clippedArea.y - sourceArea.y, destOffset.z); destOffset.y + clippedArea.y - sourceArea.y, destOffset.z);
stateManager->bindTexture(getType(), mTextureID); 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); const LevelInfoGL &levelInfo = getLevelInfo(target, level);
if (levelInfo.lumaWorkaround.enabled) 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