Hash :
79aa846e
Author :
Date :
2022-08-17T13:40:33
Reland "Not recreate Framebuffer for eglMakeCurrent() call" This is a reland of commit bf9c815263455403e587a9d2b0fdb9fb8e964208 Original change's description: > Not recreate Framebuffer for eglMakeCurrent() call > > Right now, in eglMakeCurrent() call, ANGLE always release the > default framebuffer object associated to the current context, > and create a new default framebuffer object for the new current > context. It impacts chrome performance, since chrome call > eglMakeCurrent() a lot. With this CL, the default framebuffer > will be created with gl::Context. When the surface is changed > by eglMakeCurrent() call, ANGLE will detach the previous surface > from the associated framebuffer, and attach the new surface to > the next current context's default framebuffer. > > Bug: chromium:1336126 > Change-Id: Iaa747669250ae250245db383a716b4634df59ea4 > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3827751 > Commit-Queue: Peng Huang <penghuang@chromium.org> > Reviewed-by: Jamie Madill <jmadill@chromium.org> > Reviewed-by: Geoff Lang <geofflang@chromium.org> Bug: chromium:1336126 Change-Id: Iade19004a4335ac7bc6ca176a3c14d34afff8c9e Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3877405 Auto-Submit: Peng Huang <penghuang@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
//
// Copyright 2020 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// PBufferSurfaceEAGL.cpp: an implementation of egl::Surface for PBuffers for the EAGL backend,
// currently implemented using renderbuffers
#import "common/platform.h"
#if defined(ANGLE_ENABLE_EAGL)
# include "libANGLE/renderer/gl/eagl/PbufferSurfaceEAGL.h"
# include "common/debug.h"
# include "libANGLE/renderer/gl/FramebufferGL.h"
# include "libANGLE/renderer/gl/FunctionsGL.h"
# include "libANGLE/renderer/gl/RendererGL.h"
# include "libANGLE/renderer/gl/StateManagerGL.h"
namespace rx
{
PbufferSurfaceEAGL::PbufferSurfaceEAGL(const egl::SurfaceState &state,
RendererGL *renderer,
EGLint width,
EGLint height)
: SurfaceGL(state),
mWidth(width),
mHeight(height),
mFunctions(renderer->getFunctions()),
mStateManager(renderer->getStateManager()),
mColorRenderbuffer(0),
mDSRenderbuffer(0),
mFramebufferID(0)
{}
PbufferSurfaceEAGL::~PbufferSurfaceEAGL()
{
if (mFramebufferID != 0)
{
mStateManager->deleteFramebuffer(mFramebufferID);
mFramebufferID = 0;
}
if (mColorRenderbuffer != 0)
{
mStateManager->deleteRenderbuffer(mColorRenderbuffer);
mColorRenderbuffer = 0;
}
if (mDSRenderbuffer != 0)
{
mStateManager->deleteRenderbuffer(mDSRenderbuffer);
mDSRenderbuffer = 0;
}
}
egl::Error PbufferSurfaceEAGL::initialize(const egl::Display *display)
{
mFunctions->genRenderbuffers(1, &mColorRenderbuffer);
mStateManager->bindRenderbuffer(GL_RENDERBUFFER, mColorRenderbuffer);
mFunctions->renderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, mWidth, mHeight);
mFunctions->genRenderbuffers(1, &mDSRenderbuffer);
mStateManager->bindRenderbuffer(GL_RENDERBUFFER, mDSRenderbuffer);
mFunctions->renderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, mWidth, mHeight);
return egl::NoError();
}
egl::Error PbufferSurfaceEAGL::makeCurrent(const gl::Context *context)
{
return egl::NoError();
}
egl::Error PbufferSurfaceEAGL::swap(const gl::Context *context)
{
return egl::NoError();
}
egl::Error PbufferSurfaceEAGL::postSubBuffer(const gl::Context *context,
EGLint x,
EGLint y,
EGLint width,
EGLint height)
{
return egl::NoError();
}
egl::Error PbufferSurfaceEAGL::querySurfacePointerANGLE(EGLint attribute, void **value)
{
UNIMPLEMENTED();
return egl::NoError();
}
egl::Error PbufferSurfaceEAGL::bindTexImage(const gl::Context *context,
gl::Texture *texture,
EGLint buffer)
{
ERR() << "PbufferSurfaceEAGL::bindTexImage";
UNIMPLEMENTED();
return egl::NoError();
}
egl::Error PbufferSurfaceEAGL::releaseTexImage(const gl::Context *context, EGLint buffer)
{
UNIMPLEMENTED();
return egl::NoError();
}
void PbufferSurfaceEAGL::setSwapInterval(EGLint interval) {}
EGLint PbufferSurfaceEAGL::getWidth() const
{
return mWidth;
}
EGLint PbufferSurfaceEAGL::getHeight() const
{
return mHeight;
}
EGLint PbufferSurfaceEAGL::isPostSubBufferSupported() const
{
UNIMPLEMENTED();
return EGL_FALSE;
}
EGLint PbufferSurfaceEAGL::getSwapBehavior() const
{
return EGL_BUFFER_PRESERVED;
}
egl::Error PbufferSurfaceEAGL::attachToFramebuffer(const gl::Context *context,
gl::Framebuffer *framebuffer)
{
FramebufferGL *framebufferGL = GetImplAs<FramebufferGL>(framebuffer);
ASSERT(framebufferGL->getFramebufferID() == 0);
if (mFramebufferID == 0)
{
GLuint framebufferID = 0;
mFunctions->genFramebuffers(1, &framebufferID);
mStateManager->bindFramebuffer(GL_FRAMEBUFFER, framebufferID);
mFunctions->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
mColorRenderbuffer);
mFunctions->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
GL_RENDERBUFFER, mDSRenderbuffer);
}
framebufferGL->setFramebufferID(mFramebufferID);
return egl::NoError();
}
egl::Error PbufferSurfaceEAGL::detachFromFramebuffer(const gl::Context *context,
gl::Framebuffer *framebuffer)
{
FramebufferGL *framebufferGL = GetImplAs<FramebufferGL>(framebuffer);
ASSERT(framebufferGL->getFramebufferID() == mFramebufferID);
framebufferGL->setFramebufferID(0);
return egl::NoError();
}
} // namespace rx
#endif // defined(ANGLE_ENABLE_EAGL)