Merge 1. Pull in cpp files in the performance enhanced Khronos RI OVG files which are newly added. I've ignored platform-specific cpp files for linux, macosx, and null operating systems because this local solution has its own platform glue (i.e. facility to target Bitmaps but no full windowing support). I've ignored sfEGLInterface.cpp because this is used as a bridge to go from EGL to Nokia's Platsim which offers an EGL service. That's not relevant to this implementation because this is ARM side code, not Intel side. I just left a comment to sfEGLInterface.cpp in case we need to pick up this later on. The current code compiles on winscw. Prior to this fix, the code works on winscw, and can launch the SVG tiger (tiger.exe). That takes about 20 seconds to render. I hope to always be able to show this icon on each commit, and the plan is for the render time to reduce with this series of submissions. On this commit, the tiger renders ok in 20 seconds.
// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
// Reference EGL implementation to support EGL sync objects and OpenWF extensions
#include "eglprivate.h"
#include <e32debug.h>
// Helper macros
//
#define GET_THREAD_SESSION(s,r) CEglThreadSession* s = CEglThreadSession::Static(); \
if (!s) \
{ \
return r; \
}
#define PANIC_NOT_SUPPORTED RDebug::Printf("EGL Panic %s %s:%d\n",__func__,__FILE__,__LINE__);User::Panic(KEglPanicCategory, EEglPanicNotSupported); \
return 0;
// EGL API entrypoints
//
EXPORT_C EGLDisplay eglGetDisplay(NativeDisplayType display_id)
{
GET_THREAD_SESSION(session, EGL_NO_DISPLAY)
return session->EglGetDisplay(display_id);
}
EXPORT_C EGLBoolean eglInitialize(EGLDisplay dpy, EGLint* major, EGLint* minor)
{
GET_THREAD_SESSION(session, EGL_FALSE)
return session->EglInitialize(dpy, major, minor);
}
EXPORT_C EGLBoolean eglTerminate(EGLDisplay dpy)
{
GET_THREAD_SESSION(session, EGL_FALSE)
return session->EglTerminate(dpy);
}
EXPORT_C EGLBoolean eglReleaseThread(void)
{
// do not call CEglThreadSession::Static() here as it may create thread state if it does not exist
//
CEglThreadSession* session = reinterpret_cast<CEglThreadSession*>(Dll::Tls());
if (session)
{
delete session;
Dll::FreeTls();
}
return EGL_TRUE;
}
EXPORT_C EGLint eglGetError(void)
{
// EGL spec section 3.11: GetError will create thread state object,
// it is recommended not to call this API immediately after calling ReleaseThread
// for that reason.
// If session creation fails, we returns BAD_ALLOC
//
GET_THREAD_SESSION(session, EGL_BAD_ALLOC)
return session->EglGetError();
}
EXPORT_C const char* eglQueryString(EGLDisplay dpy, EGLint name)
{
GET_THREAD_SESSION(session, NULL)
return session->EglQueryString(dpy, name);
}
EXPORT_C TFuncPtrEglProc eglGetProcAddress (const char *procname)
{
GET_THREAD_SESSION(session, NULL)
return session->EglGetProcAddress(procname);
}
// Unsupported EGL APIs
//
EXPORT_C EGLBoolean eglGetConfigs(EGLDisplay /*dpy*/, EGLConfig */*configs*/,
EGLint /*config_size*/, EGLint */*num_config*/)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLBoolean eglChooseConfig(EGLDisplay /*dpy*/, const EGLint */*attrib_list*/,
EGLConfig */*configs*/, EGLint /*config_size*/,
EGLint */*num_config*/)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLBoolean eglGetConfigAttrib(EGLDisplay /*dpy*/, EGLConfig /*config*/,
EGLint /*attribute*/, EGLint */*value*/)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLSurface eglCreateWindowSurface(EGLDisplay /*dpy*/, EGLConfig /*config*/,
EGLNativeWindowType /*win*/,
const EGLint */*attrib_list*/)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLSurface eglCreatePbufferSurface(EGLDisplay /*dpy*/, EGLConfig /*config*/,
const EGLint */*attrib_list*/)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLSurface eglCreatePixmapSurface(EGLDisplay /*dpy*/, EGLConfig /*config*/,
EGLNativePixmapType /*pixmap*/,
const EGLint */*attrib_list*/)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLBoolean eglDestroySurface(EGLDisplay /*dpy*/, EGLSurface /*surface*/)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLBoolean eglQuerySurface(EGLDisplay /*dpy*/, EGLSurface /*surface*/,
EGLint /*attribute*/, EGLint */*value*/)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLBoolean eglBindAPI(EGLenum /*api*/)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLenum eglQueryAPI(void)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLBoolean eglWaitClient(void)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLSurface eglCreatePbufferFromClientBuffer(
EGLDisplay /*dpy*/, EGLenum /*buftype*/, EGLClientBuffer /*buffer*/,
EGLConfig /*config*/, const EGLint */*attrib_list*/)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLBoolean eglSurfaceAttrib(EGLDisplay /*dpy*/, EGLSurface /*surface*/,
EGLint /*attribute*/, EGLint /*value*/)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLBoolean eglBindTexImage(EGLDisplay /*dpy*/, EGLSurface /*surface*/, EGLint /*buffer*/)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLBoolean eglReleaseTexImage(EGLDisplay /*dpy*/, EGLSurface /*surface*/, EGLint /*buffer*/)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLBoolean eglSwapInterval(EGLDisplay /*dpy*/, EGLint /*interval*/)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLContext eglCreateContext(EGLDisplay /*dpy*/, EGLConfig /*config*/,
EGLContext /*share_context*/,
const EGLint */*attrib_list*/)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLBoolean eglDestroyContext(EGLDisplay /*dpy*/, EGLContext /*ctx*/)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLBoolean eglMakeCurrent(EGLDisplay /*dpy*/, EGLSurface /*draw*/,
EGLSurface /*read*/, EGLContext /*ctx*/)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLContext eglGetCurrentContext(void)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLSurface eglGetCurrentSurface(EGLint /*readdraw*/)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLDisplay eglGetCurrentDisplay(void)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLBoolean eglQueryContext(EGLDisplay /*dpy*/, EGLContext /*ctx*/,
EGLint /*attribute*/, EGLint */*value*/)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLBoolean eglWaitGL(void)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLBoolean eglWaitNative(EGLint /*engine*/)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLBoolean eglSwapBuffers(EGLDisplay /*dpy*/, EGLSurface /*surface*/)
{
PANIC_NOT_SUPPORTED
}
EXPORT_C EGLBoolean eglCopyBuffers(EGLDisplay /*dpy*/, EGLSurface /*surface*/,
EGLNativePixmapType /*target*/)
{
PANIC_NOT_SUPPORTED
}
// EGL_KHR_reusable_sync APIs
//
EGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
{
GET_THREAD_SESSION(session, EGL_NO_SYNC_KHR)
return session->EglCreateSyncKhr(dpy, type, attrib_list);
}
EGLBoolean eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
{
GET_THREAD_SESSION(session, EGL_FALSE)
return session->EglDestroySyncKhr(dpy, sync);
}
EGLint eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
{
GET_THREAD_SESSION(session, EGL_FALSE)
return session->EglClientWaitSyncKhr(dpy, sync, flags, timeout);
}
EGLBoolean eglSignalSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode)
{
GET_THREAD_SESSION(session, EGL_FALSE)
return session->EglSignalSyncKhr(dpy, sync, mode);
}
EGLBoolean eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value)
{
GET_THREAD_SESSION(session, EGL_FALSE)
return session->EglGetSyncAttribKhr(dpy, sync, attribute, value);
}
// Private extensions
//
EGLint egl_Private_SignalSyncNOK(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode)
{
GET_THREAD_SESSION(session, EGL_BAD_ALLOC)
return session->EglSignalSyncInternal(dpy, sync, mode);
}
// Debug APIs
//
#ifdef _DEBUG
#define GET_THREAD_SESSION_ASSERT(s) CEglThreadSession* s = CEglThreadSession::Static(); \
__ASSERT_DEBUG(s, User::Panic(KEglPanicCategory, EEglPanicInvalidSession));
void egliDebugHeapMarkStart()
{
GET_THREAD_SESSION_ASSERT(session)
session->EglHeapMarkStart();
}
EGLint egliDebugHeapMarkEnd(EGLint count)
{
GET_THREAD_SESSION_ASSERT(session)
return session->EglHeapMarkEnd(count);
}
void egliDebugSetBurstAllocFail(EGLenum type, EGLint rate, EGLint burst)
{
GET_THREAD_SESSION_ASSERT(session)
session->EglHeapSetBurstAllocFail(type, rate, burst);
}
#endif //_DEBUG