EmuGL: enable SurfaceTexture async mode
Pass the swap interval from eglSwapInterval to the native window so it can enable/disable SurfaceTexture's async mode. Fixes the deadlock in SurfaceTextureGLToGLTest.EglDestroySurfaceUnrefsBuffers. Change-Id: I19bf69247341f5617223722df63d6c7f8cf389c6
This commit is contained in:
@@ -180,6 +180,7 @@ struct egl_surface_t {
|
|||||||
|
|
||||||
virtual EGLBoolean connect() { return EGL_TRUE; }
|
virtual EGLBoolean connect() { return EGL_TRUE; }
|
||||||
virtual void disconnect() {}
|
virtual void disconnect() {}
|
||||||
|
virtual void setSwapInterval(int interval) = 0;
|
||||||
virtual EGLBoolean swapBuffers() { return EGL_TRUE; }
|
virtual EGLBoolean swapBuffers() { return EGL_TRUE; }
|
||||||
virtual EGLint getSwapBehavior() const;
|
virtual EGLint getSwapBehavior() const;
|
||||||
|
|
||||||
@@ -248,6 +249,7 @@ struct egl_window_surface_t : public egl_surface_t {
|
|||||||
|
|
||||||
virtual EGLBoolean connect();
|
virtual EGLBoolean connect();
|
||||||
virtual void disconnect();
|
virtual void disconnect();
|
||||||
|
virtual void setSwapInterval(int interval);
|
||||||
virtual EGLBoolean swapBuffers();
|
virtual EGLBoolean swapBuffers();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -327,6 +329,11 @@ void egl_window_surface_t::disconnect()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void egl_window_surface_t::setSwapInterval(int interval)
|
||||||
|
{
|
||||||
|
nativeWindow->setSwapInterval(nativeWindow, interval);
|
||||||
|
}
|
||||||
|
|
||||||
EGLBoolean egl_window_surface_t::swapBuffers()
|
EGLBoolean egl_window_surface_t::swapBuffers()
|
||||||
{
|
{
|
||||||
if (!buffer) {
|
if (!buffer) {
|
||||||
@@ -369,6 +376,7 @@ struct egl_pbuffer_surface_t : public egl_surface_t {
|
|||||||
virtual EGLBoolean rcDestroy();
|
virtual EGLBoolean rcDestroy();
|
||||||
|
|
||||||
virtual EGLBoolean connect();
|
virtual EGLBoolean connect();
|
||||||
|
virtual void setSwapInterval(int interval) {}
|
||||||
|
|
||||||
uint32_t getRcColorBuffer(){ return rcColorBuffer; }
|
uint32_t getRcColorBuffer(){ return rcColorBuffer; }
|
||||||
void setRcColorBuffer(uint32_t colorBuffer){ rcColorBuffer = colorBuffer; }
|
void setRcColorBuffer(uint32_t colorBuffer){ rcColorBuffer = colorBuffer; }
|
||||||
@@ -871,9 +879,20 @@ EGLBoolean eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
|
|||||||
EGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval)
|
EGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval)
|
||||||
{
|
{
|
||||||
VALIDATE_DISPLAY_INIT(dpy, EGL_FALSE);
|
VALIDATE_DISPLAY_INIT(dpy, EGL_FALSE);
|
||||||
|
|
||||||
DEFINE_AND_VALIDATE_HOST_CONNECTION(EGL_FALSE);
|
DEFINE_AND_VALIDATE_HOST_CONNECTION(EGL_FALSE);
|
||||||
|
|
||||||
|
EGLContext_t* ctx = getEGLThreadInfo()->currentContext;
|
||||||
|
if (!ctx) {
|
||||||
|
setErrorReturn(EGL_BAD_CONTEXT, EGL_FALSE);
|
||||||
|
}
|
||||||
|
if (!ctx->draw) {
|
||||||
|
setErrorReturn(EGL_BAD_SURFACE, EGL_FALSE);
|
||||||
|
}
|
||||||
|
egl_surface_t* draw(static_cast<egl_surface_t*>(ctx->draw));
|
||||||
|
draw->setSwapInterval(interval);
|
||||||
|
|
||||||
rcEnc->rcFBSetSwapInterval(rcEnc, interval); //TODO: implement on the host
|
rcEnc->rcFBSetSwapInterval(rcEnc, interval); //TODO: implement on the host
|
||||||
|
|
||||||
return EGL_TRUE;
|
return EGL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user