Commit 7649300e by Nicolas Capens

Implementation of EGL_KHR_fence_sync.

Bug 21662268 Change-Id: Iefdc18303c42967ccc25fd6580851e05520dc2b9 Reviewed-on: https://swiftshader-review.googlesource.com/4071Tested-by: 's avatarNicolas Capens <capn@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 1d01aa37
...@@ -19,6 +19,7 @@ public: ...@@ -19,6 +19,7 @@ public:
virtual EGLenum validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel) = 0; virtual EGLenum validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel) = 0;
virtual Image *createSharedImage(EGLenum target, GLuint name, GLuint textureLevel) = 0; virtual Image *createSharedImage(EGLenum target, GLuint name, GLuint textureLevel) = 0;
virtual int getClientVersion() const = 0; virtual int getClientVersion() const = 0;
virtual void finish() = 0;
protected: protected:
virtual ~Context() {}; virtual ~Context() {};
......
...@@ -39,8 +39,12 @@ global: ...@@ -39,8 +39,12 @@ global:
eglCreateImageKHR; eglCreateImageKHR;
eglDestroyImageKHR; eglDestroyImageKHR;
eglGetPlatformDisplayEXT; eglGetPlatformDisplayEXT;
eglCreatePlatformWindowSurfaceEXT; eglCreatePlatformWindowSurfaceEXT;
eglCreatePlatformPixmapSurfaceEXT; eglCreatePlatformPixmapSurfaceEXT;
eglCreateSyncKHR;
eglDestroySyncKHR;
eglClientWaitSyncKHR;
eglGetSyncAttribKHR;
libEGL_swiftshader; libEGL_swiftshader;
......
...@@ -177,6 +177,7 @@ const char *QueryString(EGLDisplay dpy, EGLint name) ...@@ -177,6 +177,7 @@ const char *QueryString(EGLDisplay dpy, EGLint name)
return success("EGL_KHR_gl_texture_2D_image " return success("EGL_KHR_gl_texture_2D_image "
"EGL_KHR_gl_texture_cubemap_image " "EGL_KHR_gl_texture_cubemap_image "
"EGL_KHR_gl_renderbuffer_image " "EGL_KHR_gl_renderbuffer_image "
"EGL_KHR_fence_sync "
"EGL_KHR_image_base " "EGL_KHR_image_base "
"EGL_ANDROID_framebuffer_target " "EGL_ANDROID_framebuffer_target "
"EGL_ANDROID_recordable"); "EGL_ANDROID_recordable");
...@@ -428,12 +429,12 @@ EGLBoolean BindAPI(EGLenum api) ...@@ -428,12 +429,12 @@ EGLBoolean BindAPI(EGLenum api)
switch(api) switch(api)
{ {
case EGL_OPENGL_API: case EGL_OPENGL_API:
case EGL_OPENVG_API: case EGL_OPENVG_API:
return error(EGL_BAD_PARAMETER, EGL_FALSE); // Not supported by this implementation return error(EGL_BAD_PARAMETER, EGL_FALSE); // Not supported by this implementation
case EGL_OPENGL_ES_API: case EGL_OPENGL_ES_API:
break; break;
default: default:
return error(EGL_BAD_PARAMETER, EGL_FALSE); return error(EGL_BAD_PARAMETER, EGL_FALSE);
} }
...@@ -960,6 +961,131 @@ EGLSurface CreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void ...@@ -960,6 +961,131 @@ EGLSurface CreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void
return CreatePixmapSurface(dpy, config, (EGLNativePixmapType)native_pixmap, attrib_list); return CreatePixmapSurface(dpy, config, (EGLNativePixmapType)native_pixmap, attrib_list);
} }
class FenceSync
{
public:
explicit FenceSync(Context *context) : context(context)
{
status = EGL_UNSIGNALED_KHR;
context->addRef();
}
~FenceSync()
{
context->release();
context = nullptr;
}
void wait() const { return context->finish(); }
void signal() { status = EGL_SIGNALED_KHR; }
bool isSignaled() const { return status == EGL_SIGNALED_KHR; }
private:
EGLint status;
Context *context;
};
EGLSyncKHR CreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
{
TRACE("(EGLDisplay dpy = %p, EGLunum type = %x, EGLint *attrib_list=%p)", dpy, type, attrib_list);
egl::Display *display = static_cast<egl::Display*>(dpy);
if(!validateDisplay(display))
{
return error(EGL_BAD_DISPLAY, EGL_NO_SYNC_KHR);
}
if(type != EGL_SYNC_FENCE_KHR)
{
return error(EGL_BAD_ATTRIBUTE, EGL_NO_SYNC_KHR);
}
if(attrib_list && attrib_list[0] != EGL_NONE)
{
return error(EGL_BAD_ATTRIBUTE, EGL_NO_SYNC_KHR);
}
egl::Context *context = static_cast<egl::Context*>(egl::getCurrentContext());
if(!validateContext(display, context))
{
return error(EGL_BAD_MATCH, EGL_NO_SYNC_KHR);
}
return new FenceSync(context);
}
EGLBoolean DestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
{
TRACE("(EGLDisplay dpy = %p, EGLSyncKHR sync = %p)", dpy, sync);
egl::Display *display = static_cast<egl::Display*>(dpy);
FenceSync *eglSync = static_cast<FenceSync*>(sync);
if(!validateDisplay(display))
{
return error(EGL_BAD_DISPLAY, EGL_FALSE);
}
delete eglSync;
return EGL_TRUE;
}
EGLint ClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
{
TRACE("(EGLDisplay dpy = %p, EGLSyncKHR sync = %p, EGLint flags = %x, EGLTimeKHR value = %llx)", dpy, sync, flags, timeout);
egl::Display *display = static_cast<egl::Display*>(dpy);
FenceSync *eglSync = static_cast<FenceSync*>(sync);
if(!validateDisplay(display))
{
return error(EGL_BAD_DISPLAY, EGL_FALSE);
}
(void)flags;
(void)timeout;
if(!eglSync->isSignaled())
{
eglSync->wait();
eglSync->signal();
}
return EGL_CONDITION_SATISFIED_KHR;
}
EGLBoolean GetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value)
{
TRACE("(EGLDisplay dpy = %p, EGLSyncKHR sync = %p, EGLint attribute = %x, EGLint *value = %p)", dpy, sync, attribute, value);
egl::Display *display = static_cast<egl::Display*>(dpy);
if(!validateDisplay(display))
{
return error(EGL_BAD_DISPLAY, EGL_FALSE);
}
FenceSync *eglSync = static_cast<FenceSync*>(sync);
switch(attribute)
{
case EGL_SYNC_TYPE_KHR:
*value = EGL_SYNC_FENCE_KHR;
return EGL_TRUE;
case EGL_SYNC_STATUS_KHR:
*value = eglSync->isSignaled() ? EGL_SIGNALED_KHR : EGL_UNSIGNALED_KHR;
return EGL_TRUE;
case EGL_SYNC_CONDITION_KHR:
*value = EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR;
return EGL_TRUE;
default:
return error(EGL_BAD_ATTRIBUTE, EGL_FALSE);
}
}
__eglMustCastToProperFunctionPointerType GetProcAddress(const char *procname) __eglMustCastToProperFunctionPointerType GetProcAddress(const char *procname)
{ {
TRACE("(const char *procname = \"%s\")", procname); TRACE("(const char *procname = \"%s\")", procname);
...@@ -979,6 +1105,10 @@ __eglMustCastToProperFunctionPointerType GetProcAddress(const char *procname) ...@@ -979,6 +1105,10 @@ __eglMustCastToProperFunctionPointerType GetProcAddress(const char *procname)
EXTENSION(eglGetPlatformDisplayEXT), EXTENSION(eglGetPlatformDisplayEXT),
EXTENSION(eglCreatePlatformWindowSurfaceEXT), EXTENSION(eglCreatePlatformWindowSurfaceEXT),
EXTENSION(eglCreatePlatformPixmapSurfaceEXT), EXTENSION(eglCreatePlatformPixmapSurfaceEXT),
EXTENSION(eglCreateSyncKHR),
EXTENSION(eglDestroySyncKHR),
EXTENSION(eglClientWaitSyncKHR),
EXTENSION(eglGetSyncAttribKHR),
#undef EXTENSION #undef EXTENSION
}; };
......
...@@ -41,5 +41,9 @@ EXPORTS ...@@ -41,5 +41,9 @@ EXPORTS
eglGetPlatformDisplayEXT eglGetPlatformDisplayEXT
eglCreatePlatformWindowSurfaceEXT eglCreatePlatformWindowSurfaceEXT
eglCreatePlatformPixmapSurfaceEXT eglCreatePlatformPixmapSurfaceEXT
eglCreateSyncKHR
eglDestroySyncKHR
eglClientWaitSyncKHR
eglGetSyncAttribKHR
libEGL_swiftshader libEGL_swiftshader
\ No newline at end of file
...@@ -47,6 +47,10 @@ public: ...@@ -47,6 +47,10 @@ public:
EGLImageKHR (*eglCreateImageKHR)(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list); EGLImageKHR (*eglCreateImageKHR)(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
EGLBoolean (*eglDestroyImageKHR)(EGLDisplay dpy, EGLImageKHR image); EGLBoolean (*eglDestroyImageKHR)(EGLDisplay dpy, EGLImageKHR image);
__eglMustCastToProperFunctionPointerType (*eglGetProcAddress)(const char*); __eglMustCastToProperFunctionPointerType (*eglGetProcAddress)(const char*);
EGLSyncKHR (*eglCreateSyncKHR)(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
EGLBoolean (*eglDestroySyncKHR)(EGLDisplay dpy, EGLSyncKHR sync);
EGLint (*eglClientWaitSyncKHR)(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
EGLBoolean (*eglGetSyncAttribKHR)(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
// Functions that don't change the error code, for use by client APIs // Functions that don't change the error code, for use by client APIs
egl::Context *(*clientGetCurrentContext)(); egl::Context *(*clientGetCurrentContext)();
......
...@@ -359,6 +359,10 @@ EGLBoolean DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image); ...@@ -359,6 +359,10 @@ EGLBoolean DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image);
EGLDisplay GetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list); EGLDisplay GetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list);
EGLSurface CreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list); EGLSurface CreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list);
EGLSurface CreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list); EGLSurface CreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list);
EGLSyncKHR CreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
EGLBoolean DestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync);
EGLint ClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
EGLBoolean GetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
__eglMustCastToProperFunctionPointerType GetProcAddress(const char *procname); __eglMustCastToProperFunctionPointerType GetProcAddress(const char *procname);
} }
...@@ -554,6 +558,26 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, ...@@ -554,6 +558,26 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurfaceEXT(EGLDisplay dpy,
return egl::CreatePlatformPixmapSurfaceEXT(dpy, config, native_pixmap, attrib_list); return egl::CreatePlatformPixmapSurfaceEXT(dpy, config, native_pixmap, attrib_list);
} }
EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
{
return egl::CreateSyncKHR(dpy, type, attrib_list);
}
EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
{
return egl::DestroySyncKHR(dpy, sync);
}
EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
{
return egl::ClientWaitSyncKHR(dpy, sync, flags, timeout);
}
EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value)
{
return egl::GetSyncAttribKHR(dpy, sync, attribute, value);
}
EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(const char *procname) EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(const char *procname)
{ {
return egl::GetProcAddress(procname); return egl::GetProcAddress(procname);
...@@ -598,6 +622,10 @@ LibEGLexports::LibEGLexports() ...@@ -598,6 +622,10 @@ LibEGLexports::LibEGLexports()
this->eglCreateImageKHR = egl::CreateImageKHR; this->eglCreateImageKHR = egl::CreateImageKHR;
this->eglDestroyImageKHR = egl::DestroyImageKHR; this->eglDestroyImageKHR = egl::DestroyImageKHR;
this->eglGetProcAddress = egl::GetProcAddress; this->eglGetProcAddress = egl::GetProcAddress;
this->eglCreateSyncKHR = egl::CreateSyncKHR;
this->eglDestroySyncKHR = egl::DestroySyncKHR;
this->eglClientWaitSyncKHR = egl::ClientWaitSyncKHR;
this->eglGetSyncAttribKHR = egl::GetSyncAttribKHR;
this->clientGetCurrentContext = egl::getCurrentContext; this->clientGetCurrentContext = egl::getCurrentContext;
this->clientGetCurrentDisplay = egl::getCurrentDisplay; this->clientGetCurrentDisplay = egl::getCurrentDisplay;
......
...@@ -294,6 +294,7 @@ public: ...@@ -294,6 +294,7 @@ public:
virtual void makeCurrent(egl::Surface *surface); virtual void makeCurrent(egl::Surface *surface);
virtual int getClientVersion() const; virtual int getClientVersion() const;
virtual void finish();
void markAllStateDirty(); void markAllStateDirty();
...@@ -486,7 +487,6 @@ public: ...@@ -486,7 +487,6 @@ public:
void drawArrays(GLenum mode, GLint first, GLsizei count); void drawArrays(GLenum mode, GLint first, GLsizei count);
void drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices); void drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices);
void drawTexture(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height); void drawTexture(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height);
void finish();
void flush(); void flush();
void recordInvalidEnum(); void recordInvalidEnum();
......
...@@ -205,6 +205,10 @@ global: ...@@ -205,6 +205,10 @@ global:
glDrawTexxvOES; glDrawTexxvOES;
glDrawTexfOES; glDrawTexfOES;
glDrawTexfvOES; glDrawTexfvOES;
eglCreateSyncKHR;
eglDestroySyncKHR;
eglClientWaitSyncKHR;
eglGetSyncAttribKHR;
libGLES_CM_swiftshader; libGLES_CM_swiftshader;
......
...@@ -2273,6 +2273,7 @@ const GLubyte* GetString(GLenum name) ...@@ -2273,6 +2273,7 @@ const GLubyte* GetString(GLenum name)
"GL_OES_depth_texture " "GL_OES_depth_texture "
"GL_OES_EGL_image " "GL_OES_EGL_image "
"GL_OES_EGL_image_external " "GL_OES_EGL_image_external "
"GL_OES_EGL_sync "
"GL_OES_element_index_uint " "GL_OES_element_index_uint "
"GL_OES_framebuffer_object " "GL_OES_framebuffer_object "
"GL_OES_packed_depth_stencil " "GL_OES_packed_depth_stencil "
......
...@@ -204,7 +204,11 @@ EXPORTS ...@@ -204,7 +204,11 @@ EXPORTS
glDrawTexxvOES glDrawTexxvOES
glDrawTexfOES glDrawTexfOES
glDrawTexfvOES glDrawTexfvOES
eglCreateSyncKHR
eglDestroySyncKHR
eglClientWaitSyncKHR
eglGetSyncAttribKHR
libGLES_CM_swiftshader libGLES_CM_swiftshader
Register Register
\ No newline at end of file
...@@ -521,6 +521,26 @@ EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(co ...@@ -521,6 +521,26 @@ EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(co
return libEGL->eglGetProcAddress(procname); return libEGL->eglGetProcAddress(procname);
} }
EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
{
return libEGL->eglCreateSyncKHR(dpy, type, attrib_list);
}
EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
{
return libEGL->eglDestroySyncKHR(dpy, sync);
}
EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
{
return libEGL->eglClientWaitSyncKHR(dpy, sync, flags, timeout);
}
EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value)
{
return libEGL->eglGetSyncAttribKHR(dpy, sync, attribute, value);
}
GL_API void GL_APIENTRY glActiveTexture(GLenum texture) GL_API void GL_APIENTRY glActiveTexture(GLenum texture)
{ {
return es1::ActiveTexture(texture); return es1::ActiveTexture(texture);
...@@ -1593,4 +1613,4 @@ extern "C" GL_API LibGLES_CMexports *libGLES_CM_swiftshader() ...@@ -1593,4 +1613,4 @@ extern "C" GL_API LibGLES_CMexports *libGLES_CM_swiftshader()
return &libGLES_CM; return &libGLES_CM;
} }
LibEGL libEGL; LibEGL libEGL;
\ No newline at end of file
...@@ -4485,6 +4485,7 @@ const GLubyte* Context::getExtensions(GLuint index, GLuint* numExt) const ...@@ -4485,6 +4485,7 @@ const GLubyte* Context::getExtensions(GLuint index, GLuint* numExt) const
(const GLubyte*)"GL_OES_depth_texture_cube_map", (const GLubyte*)"GL_OES_depth_texture_cube_map",
(const GLubyte*)"GL_OES_EGL_image", (const GLubyte*)"GL_OES_EGL_image",
(const GLubyte*)"GL_OES_EGL_image_external", (const GLubyte*)"GL_OES_EGL_image_external",
(const GLubyte*)"GL_OES_EGL_sync",
(const GLubyte*)"GL_OES_element_index_uint", (const GLubyte*)"GL_OES_element_index_uint",
(const GLubyte*)"GL_OES_packed_depth_stencil", (const GLubyte*)"GL_OES_packed_depth_stencil",
(const GLubyte*)"GL_OES_rgb8_rgba8", (const GLubyte*)"GL_OES_rgb8_rgba8",
......
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