#include "config.h"
#include "EGLHelper.h"
#if USE(EGL)
#include <opengl/GLPlatformContext.h>
#if PLATFORM(X11)
#include "X11Helper.h"
#endif
namespace WebCore {
#if PLATFORM(X11)
typedef X11Helper NativeWrapper;
typedef Display NativeSharedDisplay;
#else
typedef void NativeSharedDisplay;
#endif
static PFNEGLCREATEIMAGEKHRPROC eglCreateImageKHR = 0;
static PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHR = 0;
static PFNGLEGLIMAGETARGETTEXTURE2DOESPROC eglImageTargetTexture2DOES = 0;
struct EGLDisplayConnection {
EGLDisplayConnection(NativeSharedDisplay* display = 0)
{
if (display)
m_eglDisplay = eglGetDisplay(reinterpret_cast<EGLNativeDisplayType>(display));
else
m_eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (m_eglDisplay == EGL_NO_DISPLAY) {
LOG_ERROR("EGLDisplay Initialization failed.");
return;
}
EGLBoolean success;
success = eglInitialize(m_eglDisplay, 0, 0);
if (success != EGL_TRUE) {
LOG_ERROR("EGLInitialization failed.");
terminate();
return;
}
success = eglBindAPI(eglAPIVersion);
if (success != EGL_TRUE) {
LOG_ERROR("Failed to set EGL API(%d).", eglGetError());
terminate();
return;
}
}
~EGLDisplayConnection()
{
terminate();
}
EGLDisplay display() { return m_eglDisplay; }
private:
void terminate()
{
if (m_eglDisplay == EGL_NO_DISPLAY)
return;
eglTerminate(m_eglDisplay);
m_eglDisplay = EGL_NO_DISPLAY;
}
EGLDisplay m_eglDisplay;
};
PlatformDisplay EGLHelper::eglDisplay()
{
#if PLATFORM(X11)
static EGLDisplayConnection displayConnection(NativeWrapper::nativeDisplay());
#else
static EGLDisplayConnection displayConnection;
#endif
return displayConnection.display();
}
PlatformDisplay EGLHelper::currentDisplay()
{
EGLDisplay display = eglGetCurrentDisplay();
if (display == EGL_NO_DISPLAY)
display = EGLHelper::eglDisplay();
return display;
}
void EGLHelper::resolveEGLBindings()
{
static bool initialized = false;
if (initialized)
return;
initialized = true;
EGLDisplay display = currentDisplay();
if (display == EGL_NO_DISPLAY)
return;
if (GLPlatformContext::supportsEGLExtension(display, "EGL_KHR_image") && GLPlatformContext::supportsEGLExtension(display, "EGL_KHR_image_pixmap") && GLPlatformContext::supportsGLExtension("GL_OES_EGL_image")) {
eglCreateImageKHR = (PFNEGLCREATEIMAGEKHRPROC) eglGetProcAddress("eglCreateImageKHR");
eglDestroyImageKHR = (PFNEGLDESTROYIMAGEKHRPROC) eglGetProcAddress("eglDestroyImageKHR");
eglImageTargetTexture2DOES = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)eglGetProcAddress("glEGLImageTargetTexture2DOES");
}
}
void EGLHelper::createEGLImage(EGLImageKHR* image, GLenum target, const EGLClientBuffer clientBuffer, const EGLint attributes[])
{
EGLDisplay display = currentDisplay();
if (display == EGL_NO_DISPLAY)
return;
EGLImageKHR tempHandle = EGL_NO_IMAGE_KHR;
if (eglCreateImageKHR && eglImageTargetTexture2DOES && eglDestroyImageKHR)
tempHandle = eglCreateImageKHR(display, EGL_NO_CONTEXT, target, clientBuffer, attributes);
*image = tempHandle;
}
void EGLHelper::destroyEGLImage(const EGLImageKHR image)
{
EGLDisplay display = currentDisplay();
if (display == EGL_NO_DISPLAY)
return;
if (eglDestroyImageKHR)
eglDestroyImageKHR(display, image);
}
void EGLHelper::imageTargetTexture2DOES(const EGLImageKHR image)
{
eglImageTargetTexture2DOES(GL_TEXTURE_2D, static_cast<GLeglImageOES>(image));
}
}
#endif