Bug 762263 - Add EGLSync - r=bjacob

This commit is contained in:
Jeff Gilbert 2012-06-12 14:39:43 -07:00
parent 102120e83e
commit f8c10a1c5b
5 changed files with 86 additions and 0 deletions

View File

@ -75,6 +75,7 @@ static const char *sExtensionNames[] = {
"GL_EXT_robustness",
"GL_ARB_sync",
"GL_OES_EGL_image",
"GL_OES_EGL_sync",
nsnull
};

View File

@ -1505,6 +1505,7 @@ public:
EXT_robustness,
ARB_sync,
OES_EGL_image,
OES_EGL_sync,
Extensions_Max
};

View File

@ -3252,4 +3252,18 @@ typedef void* GLeglImage;
#define LOCAL_EGL_READ 0x305A
#define LOCAL_EGL_DRAW 0x3059
#define LOCAL_EGL_CONTEXT_LOST 0x300E
// EGL_KHR_fence_sync
#define LOCAL_EGL_SYNC_FENCE 0x30F9
#define LOCAL_EGL_SYNC_TYPE 0x30F7
#define LOCAL_EGL_SYNC_STATUS 0x30F1
#define LOCAL_EGL_SYNC_CONDITION 0x30F8
#define LOCAL_EGL_SIGNALED 0x30F2
#define LOCAL_EGL_UNSIGNALED 0x30F3
#define LOCAL_EGL_SYNC_PRIOR_COMMANDS_COMPLETE 0x30F0
#define LOCAL_EGL_SYNC_FLUSH_COMMANDS_BIT 0x0001
#define LOCAL_EGL_FOREVER 0xFFFFFFFFFFFFFFFFull
#define LOCAL_EGL_TIMEOUT_EXPIRED 0x30F5
#define LOCAL_EGL_CONDITION_SATISFIED 0x30F6
#endif

View File

@ -20,6 +20,7 @@ static const char *sExtensionNames[] = {
"EGL_ANGLE_surface_d3d_texture_2d_share_handle",
"EGL_EXT_create_context_robustness",
"EGL_KHR_image",
"EGL_KHR_fence_sync",
nsnull
};
@ -243,6 +244,30 @@ GLLibraryEGL::EnsureInitialized()
}
}
if (IsExtensionSupported(KHR_fence_sync)) {
GLLibraryLoader::SymLoadStruct syncSymbols[] = {
{ (PRFuncPtr*) &mSymbols.fCreateSync, { "eglCreateSyncKHR", nsnull } },
{ (PRFuncPtr*) &mSymbols.fDestroySync, { "eglDestroySyncKHR", nsnull } },
{ (PRFuncPtr*) &mSymbols.fClientWaitSync, { "eglClientWaitSyncKHR", nsnull } },
{ (PRFuncPtr*) &mSymbols.fGetSyncAttrib, { "eglGetSyncAttribKHR", nsnull } },
{ nsnull, { nsnull } }
};
bool success = GLLibraryLoader::LoadSymbols(mEGLLibrary,
&syncSymbols[0],
lookupFunction);
if (!success) {
NS_ERROR("EGL supports KHR_fence_sync without exposing its functions!");
MarkExtensionUnsupported(KHR_fence_sync);
mSymbols.fCreateSync = nsnull;
mSymbols.fDestroySync = nsnull;
mSymbols.fClientWaitSync = nsnull;
mSymbols.fGetSyncAttrib = nsnull;
}
}
mInitialized = true;
reporter.SetSuccessful();
return true;

View File

@ -24,6 +24,8 @@ typedef void *EGLSurface;
typedef void *EGLClientBuffer;
typedef void *EGLCastToRelevantPtr;
typedef void *EGLImage;
typedef void *EGLSync;
typedef uint64_t EGLTime;
#if defined(XP_WIN)
@ -65,6 +67,7 @@ typedef void *EGLNativeWindowType;
#define EGL_NO_CONTEXT ((EGLContext)0)
#define EGL_NO_DISPLAY ((EGLDisplay)0)
#define EGL_NO_SURFACE ((EGLSurface)0)
#define EGL_NO_SYNC ((EGLSync)0)
#define EGL_DISPLAY() sEGLLibrary.Display()
@ -128,6 +131,7 @@ public:
ANGLE_surface_d3d_texture_2d_share_handle,
EXT_create_context_robustness,
KHR_image,
KHR_fence_sync,
Extensions_Max
};
@ -385,6 +389,38 @@ public:
return b;
}
EGLSync fCreateSync(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
{
BEFORE_GL_CALL;
EGLSync ret = mSymbols.fCreateSync(dpy, type, attrib_list);
AFTER_GL_CALL;
return ret;
}
EGLBoolean fDestroySync(EGLDisplay dpy, EGLSync sync)
{
BEFORE_GL_CALL;
EGLBoolean b = mSymbols.fDestroySync(dpy, sync);
AFTER_GL_CALL;
return b;
}
EGLint fClientWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout)
{
BEFORE_GL_CALL;
EGLint ret = mSymbols.fClientWaitSync(dpy, sync, flags, timeout);
AFTER_GL_CALL;
return ret;
}
EGLBoolean fGetSyncAttrib(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLint *value)
{
BEFORE_GL_CALL;
EGLBoolean b = mSymbols.fGetSyncAttrib(dpy, sync, attribute, value);
AFTER_GL_CALL;
return b;
}
EGLDisplay Display() {
return mEGLDisplay;
}
@ -488,6 +524,15 @@ public:
typedef EGLBoolean (GLAPIENTRY * pfnQuerySurfacePointerANGLE)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value);
pfnQuerySurfacePointerANGLE fQuerySurfacePointerANGLE;
typedef EGLSync (GLAPIENTRY * pfnCreateSync)(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
pfnCreateSync fCreateSync;
typedef EGLBoolean (GLAPIENTRY * pfnDestroySync)(EGLDisplay dpy, EGLSync sync);
pfnDestroySync fDestroySync;
typedef EGLint (GLAPIENTRY * pfnClientWaitSync)(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout);
pfnClientWaitSync fClientWaitSync;
typedef EGLBoolean (GLAPIENTRY * pfnGetSyncAttrib)(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLint *value);
pfnGetSyncAttrib fGetSyncAttrib;
} mSymbols;
private: