Commit bb6e6643 by Geoff Lang Committed by Commit Bot

Implement EGL_surfaceless_context for Android/ChromeOS and optimize eglMakeCurrent

BUG=angleproject:1651 Change-Id: I13c1a669d83098e22c0d7fb003d13beacc20c4ae Reviewed-on: https://chromium-review.googlesource.com/623947Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarYuly Novikov <ynovikov@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org>
parent bb2bbfbb
...@@ -105,6 +105,9 @@ void DisplayEGL::generateExtensions(egl::DisplayExtensions *outExtensions) const ...@@ -105,6 +105,9 @@ void DisplayEGL::generateExtensions(egl::DisplayExtensions *outExtensions) const
// Contexts are virtualized so textures can be shared globally // Contexts are virtualized so textures can be shared globally
outExtensions->displayTextureShareGroup = true; outExtensions->displayTextureShareGroup = true;
// Surfaceless contexts are emulated even if there is no native support.
outExtensions->surfacelessContext = true;
} }
void DisplayEGL::generateCaps(egl::Caps *outCaps) const void DisplayEGL::generateCaps(egl::Caps *outCaps) const
......
...@@ -15,9 +15,8 @@ PbufferSurfaceEGL::PbufferSurfaceEGL(const egl::SurfaceState &state, ...@@ -15,9 +15,8 @@ PbufferSurfaceEGL::PbufferSurfaceEGL(const egl::SurfaceState &state,
const FunctionsEGL *egl, const FunctionsEGL *egl,
EGLConfig config, EGLConfig config,
const std::vector<EGLint> &attribList, const std::vector<EGLint> &attribList,
EGLContext context,
RendererGL *renderer) RendererGL *renderer)
: SurfaceEGL(state, egl, config, attribList, context, renderer) : SurfaceEGL(state, egl, config, attribList, renderer)
{ {
} }
......
...@@ -24,7 +24,6 @@ class PbufferSurfaceEGL : public SurfaceEGL ...@@ -24,7 +24,6 @@ class PbufferSurfaceEGL : public SurfaceEGL
const FunctionsEGL *egl, const FunctionsEGL *egl,
EGLConfig config, EGLConfig config,
const std::vector<EGLint> &attribList, const std::vector<EGLint> &attribList,
EGLContext context,
RendererGL *renderer); RendererGL *renderer);
~PbufferSurfaceEGL() override; ~PbufferSurfaceEGL() override;
......
...@@ -17,14 +17,12 @@ SurfaceEGL::SurfaceEGL(const egl::SurfaceState &state, ...@@ -17,14 +17,12 @@ SurfaceEGL::SurfaceEGL(const egl::SurfaceState &state,
const FunctionsEGL *egl, const FunctionsEGL *egl,
EGLConfig config, EGLConfig config,
const std::vector<EGLint> &attribList, const std::vector<EGLint> &attribList,
EGLContext context,
RendererGL *renderer) RendererGL *renderer)
: SurfaceGL(state, renderer), : SurfaceGL(state, renderer),
mEGL(egl), mEGL(egl),
mConfig(config), mConfig(config),
mAttribList(attribList), mAttribList(attribList),
mSurface(EGL_NO_SURFACE), mSurface(EGL_NO_SURFACE)
mContext(context)
{ {
} }
...@@ -39,11 +37,7 @@ SurfaceEGL::~SurfaceEGL() ...@@ -39,11 +37,7 @@ SurfaceEGL::~SurfaceEGL()
egl::Error SurfaceEGL::makeCurrent() egl::Error SurfaceEGL::makeCurrent()
{ {
EGLBoolean success = mEGL->makeCurrent(mSurface, mContext); // Handling of makeCurrent is done in DisplayEGL
if (success == EGL_FALSE)
{
return egl::Error(mEGL->getError(), "eglMakeCurrent failed");
}
return egl::NoError(); return egl::NoError();
} }
...@@ -133,4 +127,9 @@ EGLint SurfaceEGL::getSwapBehavior() const ...@@ -133,4 +127,9 @@ EGLint SurfaceEGL::getSwapBehavior() const
return value; return value;
} }
EGLSurface SurfaceEGL::getSurface() const
{
return mSurface;
}
} // namespace rx } // namespace rx
...@@ -24,7 +24,6 @@ class SurfaceEGL : public SurfaceGL ...@@ -24,7 +24,6 @@ class SurfaceEGL : public SurfaceGL
const FunctionsEGL *egl, const FunctionsEGL *egl,
EGLConfig config, EGLConfig config,
const std::vector<EGLint> &attribList, const std::vector<EGLint> &attribList,
EGLContext context,
RendererGL *renderer); RendererGL *renderer);
~SurfaceEGL() override; ~SurfaceEGL() override;
...@@ -44,14 +43,13 @@ class SurfaceEGL : public SurfaceGL ...@@ -44,14 +43,13 @@ class SurfaceEGL : public SurfaceGL
EGLint isPostSubBufferSupported() const override; EGLint isPostSubBufferSupported() const override;
EGLint getSwapBehavior() const override; EGLint getSwapBehavior() const override;
EGLSurface getSurface() const;
protected: protected:
const FunctionsEGL *mEGL; const FunctionsEGL *mEGL;
EGLConfig mConfig; EGLConfig mConfig;
std::vector<EGLint> mAttribList; std::vector<EGLint> mAttribList;
EGLSurface mSurface; EGLSurface mSurface;
private:
EGLContext mContext;
}; };
} // namespace rx } // namespace rx
......
...@@ -16,9 +16,8 @@ WindowSurfaceEGL::WindowSurfaceEGL(const egl::SurfaceState &state, ...@@ -16,9 +16,8 @@ WindowSurfaceEGL::WindowSurfaceEGL(const egl::SurfaceState &state,
EGLConfig config, EGLConfig config,
EGLNativeWindowType window, EGLNativeWindowType window,
const std::vector<EGLint> &attribList, const std::vector<EGLint> &attribList,
EGLContext context,
RendererGL *renderer) RendererGL *renderer)
: SurfaceEGL(state, egl, config, attribList, context, renderer), mWindow(window) : SurfaceEGL(state, egl, config, attribList, renderer), mWindow(window)
{ {
} }
......
...@@ -22,7 +22,6 @@ class WindowSurfaceEGL : public SurfaceEGL ...@@ -22,7 +22,6 @@ class WindowSurfaceEGL : public SurfaceEGL
EGLConfig config, EGLConfig config,
EGLNativeWindowType window, EGLNativeWindowType window,
const std::vector<EGLint> &attribList, const std::vector<EGLint> &attribList,
EGLContext context,
RendererGL *renderer); RendererGL *renderer);
~WindowSurfaceEGL() override; ~WindowSurfaceEGL() override;
......
...@@ -33,7 +33,7 @@ namespace rx ...@@ -33,7 +33,7 @@ namespace rx
{ {
DisplayAndroid::DisplayAndroid(const egl::DisplayState &state) DisplayAndroid::DisplayAndroid(const egl::DisplayState &state)
: DisplayEGL(state), mDummyPbuffer(EGL_NO_SURFACE) : DisplayEGL(state), mDummyPbuffer(EGL_NO_SURFACE), mCurrentSurface(EGL_NO_SURFACE)
{ {
} }
...@@ -114,6 +114,7 @@ egl::Error DisplayAndroid::initialize(egl::Display *display) ...@@ -114,6 +114,7 @@ egl::Error DisplayAndroid::initialize(egl::Display *display)
return egl::EglNotInitialized() return egl::EglNotInitialized()
<< "eglMakeCurrent failed with " << egl::Error(mEGL->getError()); << "eglMakeCurrent failed with " << egl::Error(mEGL->getError());
} }
mCurrentSurface = mDummyPbuffer;
mFunctionsGL = mEGL->makeFunctionsGL(); mFunctionsGL = mEGL->makeFunctionsGL();
mFunctionsGL->initialize(); mFunctionsGL->initialize();
...@@ -130,6 +131,7 @@ void DisplayAndroid::terminate() ...@@ -130,6 +131,7 @@ void DisplayAndroid::terminate()
{ {
ERR() << "eglMakeCurrent error " << egl::Error(mEGL->getError()); ERR() << "eglMakeCurrent error " << egl::Error(mEGL->getError());
} }
mCurrentSurface = EGL_NO_SURFACE;
if (mDummyPbuffer != EGL_NO_SURFACE) if (mDummyPbuffer != EGL_NO_SURFACE)
{ {
...@@ -173,8 +175,7 @@ SurfaceImpl *DisplayAndroid::createWindowSurface(const egl::SurfaceState &state, ...@@ -173,8 +175,7 @@ SurfaceImpl *DisplayAndroid::createWindowSurface(const egl::SurfaceState &state,
success = mEGL->chooseConfig(configAttribList, &config, 1, &numConfig); success = mEGL->chooseConfig(configAttribList, &config, 1, &numConfig);
ASSERT(success && numConfig == 1); ASSERT(success && numConfig == 1);
return new WindowSurfaceEGL(state, mEGL, config, window, attribs.toIntVector(), mContext, return new WindowSurfaceEGL(state, mEGL, config, window, attribs.toIntVector(), getRenderer());
getRenderer());
} }
SurfaceImpl *DisplayAndroid::createPbufferSurface(const egl::SurfaceState &state, SurfaceImpl *DisplayAndroid::createPbufferSurface(const egl::SurfaceState &state,
...@@ -188,8 +189,7 @@ SurfaceImpl *DisplayAndroid::createPbufferSurface(const egl::SurfaceState &state ...@@ -188,8 +189,7 @@ SurfaceImpl *DisplayAndroid::createPbufferSurface(const egl::SurfaceState &state
success = mEGL->chooseConfig(configAttribList, &config, 1, &numConfig); success = mEGL->chooseConfig(configAttribList, &config, 1, &numConfig);
ASSERT(success && numConfig == 1); ASSERT(success && numConfig == 1);
return new PbufferSurfaceEGL(state, mEGL, config, attribs.toIntVector(), mContext, return new PbufferSurfaceEGL(state, mEGL, config, attribs.toIntVector(), getRenderer());
getRenderer());
} }
SurfaceImpl *DisplayAndroid::createPbufferFromClientBuffer(const egl::SurfaceState &state, SurfaceImpl *DisplayAndroid::createPbufferFromClientBuffer(const egl::SurfaceState &state,
...@@ -394,5 +394,32 @@ egl::Error DisplayAndroid::waitNative(const gl::Context *context, EGLint engine) ...@@ -394,5 +394,32 @@ egl::Error DisplayAndroid::waitNative(const gl::Context *context, EGLint engine)
UNIMPLEMENTED(); UNIMPLEMENTED();
return egl::NoError(); return egl::NoError();
} }
egl::Error DisplayAndroid::makeCurrent(egl::Surface *drawSurface,
egl::Surface *readSurface,
gl::Context *context)
{
if (drawSurface)
{
SurfaceEGL *drawSurfaceEGL = GetImplAs<SurfaceEGL>(drawSurface);
EGLSurface surface = drawSurfaceEGL->getSurface();
if (surface != mCurrentSurface)
{
if (mEGL->makeCurrent(surface, mContext) == EGL_FALSE)
{
return egl::Error(mEGL->getError(), "eglMakeCurrent failed");
}
mCurrentSurface = surface;
}
}
return DisplayGL::makeCurrent(drawSurface, readSurface, context);
}
egl::Error DisplayAndroid::makeCurrentSurfaceless(gl::Context *context)
{
// Nothing to do because EGL always uses the same context and the previous surface can be left
// current.
return egl::NoError();
}
} // namespace rx } // namespace rx
...@@ -56,7 +56,13 @@ class DisplayAndroid : public DisplayEGL ...@@ -56,7 +56,13 @@ class DisplayAndroid : public DisplayEGL
egl::Error waitClient(const gl::Context *context) const override; egl::Error waitClient(const gl::Context *context) const override;
egl::Error waitNative(const gl::Context *context, EGLint engine) const override; egl::Error waitNative(const gl::Context *context, EGLint engine) const override;
egl::Error makeCurrent(egl::Surface *drawSurface,
egl::Surface *readSurface,
gl::Context *context) override;
private: private:
egl::Error makeCurrentSurfaceless(gl::Context *context) override;
template <typename T> template <typename T>
void getConfigAttrib(EGLConfig config, EGLint attribute, T *value) const; void getConfigAttrib(EGLConfig config, EGLint attribute, T *value) const;
...@@ -70,6 +76,7 @@ class DisplayAndroid : public DisplayEGL ...@@ -70,6 +76,7 @@ class DisplayAndroid : public DisplayEGL
std::vector<EGLint> mConfigAttribList; std::vector<EGLint> mConfigAttribList;
std::map<EGLint, EGLint> mConfigIds; std::map<EGLint, EGLint> mConfigIds;
EGLSurface mDummyPbuffer; EGLSurface mDummyPbuffer;
EGLSurface mCurrentSurface;
}; };
} // namespace rx } // namespace rx
......
...@@ -955,4 +955,10 @@ void DisplayOzone::setSwapInterval(EGLSurface drawable, SwapControlData *data) ...@@ -955,4 +955,10 @@ void DisplayOzone::setSwapInterval(EGLSurface drawable, SwapControlData *data)
ASSERT(data != nullptr); ASSERT(data != nullptr);
} }
egl::Error DisplayOzone::makeCurrentSurfaceless(gl::Context *context)
{
// Nothing to do, handled in the GL layers
return egl::NoError();
}
} // namespace rx } // namespace rx
...@@ -145,6 +145,8 @@ class DisplayOzone final : public DisplayEGL ...@@ -145,6 +145,8 @@ class DisplayOzone final : public DisplayEGL
void setSwapInterval(EGLSurface drawable, SwapControlData *data); void setSwapInterval(EGLSurface drawable, SwapControlData *data);
private: private:
egl::Error makeCurrentSurfaceless(gl::Context *context) override;
GLuint makeShader(GLuint type, const char *src); GLuint makeShader(GLuint type, const char *src);
void drawBuffer(Buffer *buffer); void drawBuffer(Buffer *buffer);
void drawWithBlit(Buffer *buffer); void drawWithBlit(Buffer *buffer);
......
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