openvg/openvgrefimplementation/sfopenvg/sfopenvg/extensions/eglsync.cpp
branchEGL_MERGE
changeset 216 b87045f2f5d7
child 217 205d3af68142
equal deleted inserted replaced
212:a8e55d78eb52 216:b87045f2f5d7
       
     1 // Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // EGL sync implementation
       
    15 
       
    16 #include "eglapi.h"
       
    17 #include <e32std.h>
       
    18 #include <e32base.h>
       
    19 #include <e32cmn.h>
       
    20 #include <eglext.h>
       
    21 #include "egltypes.h"
       
    22 
       
    23 #include "eglsync.h"
       
    24 
       
    25 
       
    26 
       
    27 const EGLint CEglSync::KSupportedFlags = EGL_SYNC_FLUSH_COMMANDS_BIT_KHR;
       
    28 
       
    29 // ToDo get rid of these macros
       
    30 //#define EGL_SET_ERROR(e)                    { Instance().SetError(e); }
       
    31 //#define EGL_SET_ERROR(e)					{setEglError(e);}  
       
    32 #define EGL_SET_ERROR(e)
       
    33 #define TEST_AND_RET(c, r, t)               { if (!(c)) { EGL_TRACE(t); return (r); } }
       
    34 #define TEST_CLEANUP_RET(c, r, clnp, t)     { if (!(c)) { clnp; EGL_TRACE(t); return (r); } }
       
    35 #define CHECK_AND_RET(c, e, r, t)           { if (!(c)) { EGL_SET_ERROR(e); EGL_TRACE(t); return (r); } }
       
    36 #define CHECK_CLEANUP_RET(c, e, r, clnp, t) { if (!(c)) { EGL_SET_ERROR(e); clnp; EGL_TRACE(t); return (r); } }
       
    37 #define RESET_EGL_ERROR()                   { EGL_SET_ERROR(EGL_SUCCESS); }
       
    38 
       
    39 // ToDo use EGL Panics & panic messages
       
    40 void SyncPanic(TInt aPanic)
       
    41     {
       
    42     _LIT(KPanic, "EGL SYNC");
       
    43     User::Panic(KPanic, aPanic);
       
    44     }
       
    45 
       
    46 
       
    47 
       
    48 CEglSync* CEglSync::Create(RFastLock& aFrontLock, EGLSyncKHR aSync, EGLDisplay aDisplay, EGLenum aType)
       
    49     {
       
    50     CEglSync* sync= new CEglSync(aFrontLock, aSync, aDisplay, aType);
       
    51     TEST_AND_RET(sync != NULL, sync, "CEglSync::Create couldn't create the object");
       
    52     if (KErrNone == sync->Initialize())
       
    53         {
       
    54         EGL_TRACE("CEglSync::Create OK aDisplay=%d aSync=%d aSyncType=0x%x", aDisplay, aSync, aType);
       
    55         return sync;
       
    56         }
       
    57     else
       
    58         {
       
    59         EGL_TRACE("CEglSync::Create FAILED aDisplay=%d aSync=%d aSyncType=0x%x", aDisplay, aSync, aType);
       
    60         delete sync;
       
    61         return NULL;
       
    62         }
       
    63     }
       
    64 
       
    65 TInt CEglSync::Initialize()
       
    66     {
       
    67     TInt err = KErrNone;
       
    68     err = iSyncMutex.CreateLocal();
       
    69     TEST_AND_RET(err == KErrNone, err, "CEglSync::Initialize failed to create mutex");
       
    70     err = iSyncCondVar.CreateLocal();
       
    71     TEST_AND_RET(err == KErrNone, err, "CEglSync::Initialize failed to create cond var");
       
    72     return err;
       
    73     }
       
    74 
       
    75 
       
    76 CEglSync::CEglSync(RFastLock& aFrontLock, EGLSyncKHR aSync, EGLDisplay aDisplay, EGLenum aType):
       
    77 iEglSync(aSync),
       
    78 iDisplay(aDisplay),
       
    79 iSyncType(aType),
       
    80 iSyncState(EGL_UNSIGNALED_KHR),
       
    81 iDestroyed(EGL_FALSE),
       
    82 iWaiters(0),
       
    83 iFrontLock(aFrontLock)
       
    84     {
       
    85 
       
    86     }
       
    87 
       
    88 CEglSync::~CEglSync()
       
    89     {
       
    90     iSyncMutex.Close();
       
    91     iSyncCondVar.Close();
       
    92     EGL_TRACE("CEglSync::~CEglSync iDisplay=%d iEglSync=%d", iDisplay, iEglSync);
       
    93     }
       
    94 
       
    95 EGLBoolean CEglSync::DestroySyncReady()
       
    96     {
       
    97     EGL_TRACE("CEglSync::DestroySync iDisplay=%d iEglSync=%d iWaiters=%d", iDisplay, iEglSync, iWaiters);
       
    98     iSyncMutex.Wait();
       
    99     if (iWaiters == 0)
       
   100         {
       
   101         EGL_TRACE("CEglSync::DestroySync READY TO DESTROY iDisplay=%d iEglSync=%d iWaiters=%d", iDisplay, iEglSync, iWaiters);
       
   102         iDestroyed = EGL_TRUE;
       
   103         return EGL_TRUE;
       
   104         }
       
   105     else if (!iDestroyed)
       
   106         {
       
   107         EGL_TRACE("CEglSync::DestroySync BROADCAST iDisplay=%d iEglSync=%d iWaiters=%d", iDisplay, iEglSync, iWaiters);
       
   108         iSyncCondVar.Broadcast();
       
   109         }
       
   110     iDestroyed = EGL_TRUE;
       
   111     iSyncMutex.Signal();
       
   112     return EGL_FALSE;
       
   113     }
       
   114 
       
   115 
       
   116 EGLint CEglSync::SignalSync(EGLenum aMode)
       
   117     {
       
   118     EGL_TRACE("CEglSync::SignalSync aMode=%d", aMode);
       
   119 
       
   120     iSyncMutex.Wait();
       
   121     if (aMode != iSyncState)
       
   122         {
       
   123         iSyncState = aMode;
       
   124         if (aMode == EGL_SIGNALED_KHR)
       
   125             {
       
   126             iSyncCondVar.Broadcast();
       
   127             }
       
   128         }
       
   129 
       
   130     iSyncMutex.Signal();
       
   131     return EGL_SUCCESS;
       
   132     }
       
   133 
       
   134 EGLint CEglSync::ClientWaitSync(EGLint aFlags, EGLTimeKHR aTimeout)
       
   135     {
       
   136     EGL_TRACE("CEglSync::ClientWaitSync aFlags=%d aTimeout=%d", aFlags, aTimeout);
       
   137 
       
   138     CHECK_CLEANUP_RET(!(aFlags & (~KSupportedFlags)),
       
   139                   EGL_BAD_PARAMETER,
       
   140                   EGL_FALSE,
       
   141                   iFrontLock.Signal();,
       
   142                   "CEglSync::ClientWaitSync bad flags parameter");
       
   143 
       
   144     iSyncMutex.Wait();
       
   145     iFrontLock.Signal();
       
   146 
       
   147     CHECK_CLEANUP_RET(!iDestroyed ,
       
   148                       EGL_BAD_PARAMETER,
       
   149                       EGL_FALSE,
       
   150                       iSyncMutex.Signal();,
       
   151                       "CEglSync::ClientWaitSync sync already destroyed");
       
   152 
       
   153     EGLint ret = (EGLint) EGL_FALSE;
       
   154     if (iSyncState == EGL_UNSIGNALED_KHR)
       
   155         {
       
   156         if (aTimeout && (aFlags & EGL_SYNC_FLUSH_COMMANDS_BIT_KHR) && (eglGetCurrentContext() != EGL_NO_CONTEXT))
       
   157             {
       
   158             switch(eglQueryAPI())
       
   159                 {
       
   160                 case EGL_OPENGL_ES_API:
       
   161                     //ToDo: make sure these cases are covered
       
   162                     //glFlush();
       
   163                     break;
       
   164                 case EGL_OPENVG_API:
       
   165                     //ToDo: make sure these cases are covered
       
   166                     //vgFlush();
       
   167                     break;
       
   168                 default:
       
   169                 	SyncPanic(__LINE__);
       
   170                 }
       
   171             }
       
   172 
       
   173         switch (aTimeout)
       
   174             {
       
   175             case 0:
       
   176                 ret = EGL_TIMEOUT_EXPIRED_KHR;
       
   177                 break;
       
   178 
       
   179             case EGL_FOREVER_KHR:
       
   180                 {
       
   181                 EGLint res = KErrNone;
       
   182                 ++iWaiters;
       
   183                 EGL_TRACE("CEglSync::ClientWaitSync iSyncCondVar.Wait");
       
   184                 res = iSyncCondVar.Wait(iSyncMutex);
       
   185                 --iWaiters;
       
   186                 if (res == KErrNone)
       
   187                     {
       
   188                     ret = EGL_CONDITION_SATISFIED_KHR;
       
   189                     }
       
   190                 else
       
   191                     {
       
   192                     ret = EGL_FALSE;
       
   193                     }
       
   194                 break;
       
   195                 }
       
   196 
       
   197             default:
       
   198                 {
       
   199                     /*
       
   200                      * Since the supported range of timeout at function RCondVar::TimedWait(mutex, timeout)
       
   201                      * is 0 to KMaxTInt, looping mechanism below is used to support 64bit timeout.
       
   202                      */
       
   203                     EGLint res = KErrTimedOut;
       
   204                     EGL_TRACE("CEglSync::ClientWaitSync iSyncCondVar.TimedWait");
       
   205                     for(TInt64 timeoutMicroseconds = aTimeout/1000; (res == KErrTimedOut) && (timeoutMicroseconds > 0); timeoutMicroseconds -= KMaxTInt)
       
   206                         {
       
   207                         ++iWaiters;
       
   208                         res = iSyncCondVar.TimedWait(iSyncMutex, (timeoutMicroseconds > KMaxTInt) ? KMaxTInt:timeoutMicroseconds);
       
   209                         --iWaiters;
       
   210                         }
       
   211                     switch (res)
       
   212                         {
       
   213                         case KErrNone:
       
   214                             ret = EGL_CONDITION_SATISFIED_KHR;
       
   215                             break;
       
   216                         case KErrTimedOut:
       
   217                             ret = EGL_TIMEOUT_EXPIRED_KHR;
       
   218                             break;
       
   219                         default:
       
   220                             ret = EGL_FALSE;
       
   221                             break;
       
   222                         }
       
   223                     break;
       
   224                 }
       
   225             }
       
   226         }
       
   227     else
       
   228         {
       
   229             ret = EGL_CONDITION_SATISFIED_KHR;
       
   230             EGL_TRACE("CEglSync::ClientWaitSync sync in signalled state");
       
   231         }
       
   232     if (iDestroyed && (iWaiters == 0))
       
   233         {
       
   234         EGL_TRACE("CEglSync::ClientWaitSync sync autodestroyed");
       
   235         delete this;
       
   236         }
       
   237     else
       
   238         {
       
   239         EGL_TRACE("CEglSync::ClientWaitSync release sync mutex");
       
   240         iSyncMutex.Signal();
       
   241         }
       
   242     EGL_TRACE("CEglSync::ClientWaitSync sync exit ret=0x%x", ret);
       
   243     return ret;
       
   244     }
       
   245 
       
   246 EGLBoolean CEglSync::GetSyncAttrib(EGLint aAttribute, EGLint *aValue)
       
   247     {
       
   248     EGL_TRACE("CEglSync::GetSyncAttrib aAttribute=0x%x aValue", aValue);
       
   249 
       
   250     CHECK_AND_RET(aValue,
       
   251                   EGL_BAD_PARAMETER,
       
   252                   EGL_FALSE,
       
   253                   "CEglSync::GetSyncAttrib undefined parameter aValue is NUL");
       
   254 
       
   255     CHECK_AND_RET((aAttribute == EGL_SYNC_TYPE_KHR) || (aAttribute == EGL_SYNC_STATUS_KHR),
       
   256                   EGL_BAD_ATTRIBUTE,
       
   257                   EGL_FALSE,
       
   258                   "CEglSync::GetSyncAttrib unnexpected attribute parameter");
       
   259 
       
   260 
       
   261     iSyncMutex.Wait();
       
   262     EGLBoolean ret = EGL_FALSE;
       
   263     switch(aAttribute)
       
   264         {
       
   265         case EGL_SYNC_TYPE_KHR:
       
   266             {
       
   267             *aValue = iSyncType;
       
   268             ret = EGL_TRUE;
       
   269             break;
       
   270             }
       
   271         case EGL_SYNC_STATUS_KHR:
       
   272             {
       
   273             *aValue = iSyncState;
       
   274             ret = EGL_TRUE;
       
   275             break;
       
   276             }
       
   277         default:
       
   278             {
       
   279             EGL_SET_ERROR(EGL_BAD_ATTRIBUTE);
       
   280             }
       
   281         }
       
   282     iSyncMutex.Signal();
       
   283     return ret;
       
   284     }
       
   285 
       
   286 
       
   287 CEglSyncExtension* CEglSyncExtension::Create(OpenVGRI::EGL& aEglInstance)
       
   288     {
       
   289     EGL_TRACE("CEglSyncExtension::Create");
       
   290     CEglSyncExtension* eglSyncExt= new CEglSyncExtension(aEglInstance);
       
   291     if (eglSyncExt && eglSyncExt->Construct())
       
   292         {
       
   293         return eglSyncExt;
       
   294         }
       
   295 
       
   296     delete eglSyncExt;
       
   297     return NULL;
       
   298     }
       
   299 
       
   300 EGLBoolean CEglSyncExtension::Construct()
       
   301     {
       
   302     if  (iEglSyncMapLock.CreateLocal() == KErrNone)
       
   303         {
       
   304         EGL_TRACE("CEglSyncExtension::Construct OK");
       
   305         return EGL_TRUE;
       
   306         }
       
   307 
       
   308     EGL_TRACE("CEglSyncExtension::Construct FAILED");
       
   309     return EGL_FALSE;
       
   310     }
       
   311 
       
   312 CEglSyncExtension::CEglSyncExtension(OpenVGRI::EGL& aEglInstance):
       
   313 iEglSyncMap(),
       
   314 iEglSyncId(0)/*,
       
   315 iEglInstance(aEglInstance)*/
       
   316     {
       
   317 
       
   318     }
       
   319 
       
   320 CEglSyncExtension::~CEglSyncExtension()
       
   321     {
       
   322     if (iEglSyncMapLock.Handle())
       
   323         {
       
   324         iEglSyncMapLock.Wait();
       
   325         }
       
   326 
       
   327     EglDestroySync(EGL_NO_DISPLAY);
       
   328 
       
   329     iEglSyncMap.Close();
       
   330     iEglSyncMapLock.Close();
       
   331     }
       
   332 
       
   333 EXPORT_C TInt CEglSyncExtension::EglSyncDisplayCreate(EGLDisplay aDisplay)
       
   334     {
       
   335         return KErrNone;
       
   336     }
       
   337 
       
   338 void CEglSyncExtension::EglDestroySync(EGLDisplay aDisplay)
       
   339 	{
       
   340 	EGL_TRACE("CEglSyncExtension::EglDestroySync");
       
   341 	REglSyncHashMap::TIter iter(iEglSyncMap);
       
   342 
       
   343 	while (iter.NextKey())
       
   344 		{
       
   345 		CEglSync* const* syncpp = NULL;
       
   346 		syncpp = iter.CurrentValue();
       
   347 		if (syncpp && *syncpp && ((aDisplay == EGL_NO_DISPLAY) || (*syncpp)->Display() == aDisplay))
       
   348 			{
       
   349 			const EGLint* key = iter.CurrentKey();
       
   350 			EGLPANIC_ASSERT(key, EEglPanicTemp);
       
   351 			if (aDisplay != EGL_NO_DISPLAY)
       
   352 				{
       
   353 				// we expect that the map is to be closed after removing the elements
       
   354 				// therefore we can skip to remove the syncs from map
       
   355 				if (KErrNone != iEglSyncMap.Remove(*key))
       
   356 					{
       
   357 					SyncPanic(__LINE__);
       
   358 					}
       
   359 				}
       
   360 			if ((*syncpp)->DestroySyncReady())
       
   361 				{
       
   362 				delete *syncpp;
       
   363 				}
       
   364 			}
       
   365 		}
       
   366 	}
       
   367 
       
   368 void CEglSyncExtension::EglSyncDisplayDestroy(EGLDisplay aDisplay)
       
   369     {
       
   370     iEglSyncMapLock.Wait();
       
   371     EglDestroySync(aDisplay);
       
   372     iEglSyncMapLock.Signal();
       
   373     }
       
   374 
       
   375 EGLSyncKHR CEglSyncExtension::EglCreateSyncKHR(EGLDisplay aDisplay, EGLenum aType, const EGLint* aAttribList)
       
   376     {
       
   377     EGL_TRACE("CEglSyncExtension::EglCreateSyncKHR aDisplay=%d, aType=%d", aDisplay, aType);
       
   378     RESET_EGL_ERROR();
       
   379 
       
   380     CHECK_AND_RET(aType == EGL_SYNC_REUSABLE_KHR,
       
   381                   EGL_BAD_ATTRIBUTE,
       
   382                   EGL_NO_SYNC_KHR,
       
   383                   "CEglSyncExtension::EglCreateSyncKHR unsupported sync type");
       
   384 
       
   385     CHECK_AND_RET((aAttribList == NULL) || (*aAttribList == EGL_NONE),
       
   386                   EGL_BAD_ATTRIBUTE,
       
   387                   EGL_NO_SYNC_KHR,
       
   388                   "CEglSyncExtension::EglCreateSyncKHR invalid attribute list");
       
   389 
       
   390     EGLint lockErr = FindAndLockDisplay(aDisplay);
       
   391 
       
   392     CHECK_AND_RET(lockErr == EGL_SUCCESS,
       
   393                       lockErr,
       
   394                       EGL_NO_SYNC_KHR,
       
   395                       "CEglSyncExtension::EglCreateSyncKHR couldn't find and lock display");
       
   396 
       
   397 
       
   398 
       
   399     iEglSyncMapLock.Wait();
       
   400     ReleaseDisplayLock(aDisplay);
       
   401 
       
   402     EGLSyncKHR dispRet = CreateSync(aDisplay, aType);
       
   403 
       
   404     iEglSyncMapLock.Signal();
       
   405 
       
   406     EGL_TRACE("CEglSyncExtension::EglCreateSyncKHR EXIT aDisplay=%d, sync=%d", aDisplay, dispRet);
       
   407     return dispRet;
       
   408     }
       
   409 
       
   410 EGLBoolean CEglSyncExtension::EglDestroySyncKHR(EGLDisplay aDisplay, EGLSyncKHR aSync)
       
   411     {
       
   412     EGL_TRACE("CEglSyncExtension::EglDestroySyncKHR aDisplay=%d, aSync=%d", aDisplay, aSync);
       
   413 
       
   414     RESET_EGL_ERROR();
       
   415 
       
   416     EGLint lockErr = FindAndLockDisplay(aDisplay);
       
   417 
       
   418     CHECK_AND_RET(lockErr == EGL_SUCCESS,
       
   419                       lockErr,
       
   420                       EGL_FALSE,
       
   421                       "CEglSyncExtension::EglDestroySyncKHR couldn't find and lock display");
       
   422 
       
   423 
       
   424     iEglSyncMapLock.Wait();
       
   425     ReleaseDisplayLock(aDisplay);
       
   426 
       
   427     CEglSync** sync = iEglSyncMap.Find((EGLint)aSync);
       
   428     CHECK_CLEANUP_RET(sync && (*sync) && ((*sync)->Display() == aDisplay),
       
   429                       EGL_BAD_PARAMETER,
       
   430                       EGL_FALSE,
       
   431                       iEglSyncMapLock.Signal(),
       
   432                       "CEglSyncDisplayMap::EglDestroySyncKHR cannot find the sync");
       
   433 
       
   434     if (KErrNone != iEglSyncMap.Remove((EGLint)aSync))
       
   435         {
       
   436 		SyncPanic(__LINE__);
       
   437         }
       
   438 
       
   439     if ((*sync)->DestroySyncReady())
       
   440         {
       
   441         delete *sync;
       
   442         }
       
   443 
       
   444     iEglSyncMapLock.Signal();
       
   445 
       
   446 
       
   447     EGL_TRACE("CEglSyncExtension::EglDestroySyncKHR EXIT aDisplay=%d, aSync=%d ret=%s", aDisplay, aSync, "EGL_TRUE");
       
   448     return EGL_TRUE;
       
   449     }
       
   450 
       
   451 EGLBoolean CEglSyncExtension::EglSignalSyncKHR(EGLDisplay aDisplay, EGLSyncKHR aSync, EGLenum aMode)
       
   452     {
       
   453     EGL_TRACE("CEglSyncExtension::EglSignalSyncKHR aDisplay=%d, aSync=%d aMode=%d", aDisplay, aSync, aMode);
       
   454     EGLBoolean ret = EGL_FALSE;
       
   455 
       
   456     RESET_EGL_ERROR();
       
   457 
       
   458     CHECK_AND_RET((aMode == EGL_SIGNALED_KHR) || (aMode == EGL_UNSIGNALED_KHR),
       
   459                    EGL_BAD_PARAMETER,
       
   460                    ret,
       
   461                    "CEglSyncExtension::EglSignalSyncKHR unsupported sync mode");
       
   462 
       
   463     EGLint lockErr = FindAndLockDisplay(aDisplay);
       
   464 
       
   465     CHECK_AND_RET(lockErr == EGL_SUCCESS,
       
   466                       lockErr,
       
   467                       EGL_FALSE,
       
   468                       "CEglSyncExtension::EglSignalSyncKHR couldn't find and lock display");
       
   469 
       
   470 
       
   471     iEglSyncMapLock.Wait();
       
   472     ReleaseDisplayLock(aDisplay);
       
   473 
       
   474     CEglSync** sync= iEglSyncMap.Find((EGLint)aSync);
       
   475 
       
   476     CHECK_CLEANUP_RET(sync && (*sync) && ((*sync)->Display()==aDisplay),
       
   477                       EGL_BAD_PARAMETER,
       
   478                       EGL_FALSE,
       
   479                       iEglSyncMapLock.Signal(),
       
   480                       "CEglSyncExtension::EglSignalSyncKHR cannot find the lock");
       
   481 
       
   482     TEST_CLEANUP_RET((*sync)->Display() == EGL_SYNC_REUSABLE_KHR,
       
   483                      EGL_BAD_MATCH,
       
   484                      iEglSyncMapLock.Signal(),
       
   485                      "CEglSyncExtension::EglSignalSyncKHR bad sync type");
       
   486 
       
   487     EGLint signalRet = (*sync)->SignalSync(aMode);
       
   488 
       
   489     if (signalRet != EGL_SUCCESS)
       
   490         {
       
   491         EGL_SET_ERROR(ret);
       
   492         EGL_TRACE("CEglSyncExtension::EglSignalSyncKHR failed (%d)", ret);
       
   493         ret = EGL_FALSE;
       
   494         }
       
   495     else
       
   496         {
       
   497         ret = EGL_TRUE;
       
   498         }
       
   499 
       
   500     iEglSyncMapLock.Signal();
       
   501 
       
   502     EGL_TRACE("CEglSyncExtension::EglSignalSyncKHR EXIT aDisplay=%d, aSync=%d ret=%s", aDisplay, aSync, ret ? "EGL_TRUE":"EGL_FALSE");
       
   503     return ret;
       
   504     }
       
   505 
       
   506 EGLint CEglSyncExtension::Egl_Private_SignalSyncNOK(EGLDisplay aDisplay, EGLSyncKHR aSync, EGLenum aMode)
       
   507     {
       
   508     EGL_TRACE("CEglSyncExtension::EglPrivateSignalSyncKHR aDisplay=%d, aSync=%d aMode=%d", aDisplay, aSync, aMode);
       
   509 
       
   510     TEST_AND_RET((aMode == EGL_SIGNALED_KHR) || (aMode == EGL_UNSIGNALED_KHR),
       
   511                  EGL_BAD_PARAMETER,
       
   512                  "CEglSyncExtension::EglPrivateSignalSyncKHR unsupported sync mode");
       
   513 
       
   514     EGLint lockErr = FindAndLockDisplay(aDisplay);
       
   515 
       
   516     TEST_AND_RET(lockErr == EGL_SUCCESS,
       
   517                      lockErr,
       
   518                      "CEglSyncExtension::EglPrivateSignalSyncKHR couldn't find and lock display");
       
   519 
       
   520 
       
   521 
       
   522     iEglSyncMapLock.Wait();
       
   523     ReleaseDisplayLock(aDisplay);
       
   524 
       
   525     CEglSync** sync= iEglSyncMap.Find((EGLint)aSync);
       
   526 
       
   527     TEST_CLEANUP_RET(sync && (*sync) && ((*sync)->Display()==aDisplay),
       
   528                      EGL_BAD_PARAMETER,
       
   529                      iEglSyncMapLock.Signal(),
       
   530                      "CEglSyncExtension::EglPrivateSignalSyncKHR cannot find the lock");
       
   531 
       
   532     EGLint ret = (*sync)->SignalSync(aMode);
       
   533 
       
   534     if (ret != EGL_SUCCESS)
       
   535         {
       
   536         EGL_TRACE("CEglSyncExtension::EglPrivateSignalSyncKHR failed (%d)", ret);
       
   537         }
       
   538 
       
   539     iEglSyncMapLock.Signal();
       
   540 
       
   541     EGL_TRACE("CEglSyncExtension::EglPrivateSignalSyncKHR EXIT aDisplay=%d, aSync=%d ret=%d", aDisplay, aSync, ret);
       
   542     return ret;
       
   543     }
       
   544 
       
   545 EGLint CEglSyncExtension::EglClientWaitSyncKHR(EGLDisplay aDisplay, EGLSyncKHR aSync, EGLint aFlags, EGLTimeKHR aTimeout)
       
   546     {
       
   547     EGL_TRACE("CEglSyncExtension::EglClientWaitSyncKHR aDisplay=%d, aSync=%d aFlags=0x%x, aTimeout=%ld", aDisplay, aSync, aFlags, aTimeout);
       
   548 
       
   549     RESET_EGL_ERROR();
       
   550 
       
   551     EGLint lockErr = FindAndLockDisplay(aDisplay);
       
   552 
       
   553     CHECK_AND_RET(lockErr == EGL_SUCCESS,
       
   554                       lockErr,
       
   555                       EGL_FALSE,
       
   556                       "CEglSyncExtension::EglClientWaitSyncKHR couldn't find and lock display");
       
   557 
       
   558     
       
   559 
       
   560     iEglSyncMapLock.Wait();
       
   561     ReleaseDisplayLock(aDisplay);
       
   562 
       
   563     CEglSync** sync= iEglSyncMap.Find((EGLint)aSync);
       
   564 
       
   565     CHECK_CLEANUP_RET(sync && (*sync) && ((*sync)->Display()==aDisplay),
       
   566                       EGL_BAD_PARAMETER,
       
   567                       EGL_FALSE,
       
   568                       iEglSyncMapLock.Signal(),
       
   569                       "CEglSyncExtension::EglClientWaitSyncKHR cannot find the sync");
       
   570 
       
   571     EGLint ret = (*sync)->ClientWaitSync(aFlags, aTimeout);
       
   572 
       
   573 
       
   574     EGL_TRACE("CEglSyncExtension::EglClientWaitSyncKHR EXIT aDisplay=%d, aSync=%d ret=%d", aDisplay, aSync, ret);
       
   575     return ret;
       
   576     }
       
   577 
       
   578 EGLBoolean CEglSyncExtension::EglGetSyncAttribKHR(EGLDisplay aDisplay,
       
   579                                                   EGLSyncKHR aSync,
       
   580                                                   EGLint aAttribute,
       
   581                                                   EGLint* aValue)
       
   582     {
       
   583     EGL_TRACE("CEglSyncExtension::EglGetSyncAttribKHR aDisplay=%d, aSync=%d aAttribute=0x%x, aValue=0x%x", aDisplay,
       
   584                                                                                                            aSync,
       
   585                                                                                                            aAttribute,
       
   586                                                                                                            aValue);
       
   587     RESET_EGL_ERROR();
       
   588 
       
   589     EGLint lockErr = FindAndLockDisplay(aDisplay);
       
   590 
       
   591     CHECK_AND_RET(lockErr == EGL_SUCCESS,
       
   592                       lockErr,
       
   593                       EGL_FALSE,
       
   594                       "CEglSyncExtension::EglGetSyncAttribKHR couldn't find and lock display");
       
   595 
       
   596 
       
   597     iEglSyncMapLock.Wait();
       
   598     ReleaseDisplayLock(aDisplay);
       
   599 
       
   600     CEglSync** sync= iEglSyncMap.Find((EGLint)aSync);
       
   601 
       
   602     CHECK_CLEANUP_RET(sync && (*sync) && ((*sync)->Display()==aDisplay),
       
   603                       EGL_BAD_PARAMETER,
       
   604                       EGL_FALSE,
       
   605                       iEglSyncMapLock.Signal(),
       
   606                       "CEglSyncExtension::EglGetSyncAttribKHR cannot find the lock");
       
   607 
       
   608 
       
   609     EGLint ret = (*sync)->GetSyncAttrib(aAttribute, aValue);
       
   610 
       
   611     iEglSyncMapLock.Signal();
       
   612 
       
   613 
       
   614 
       
   615     EGL_TRACE("CEglSyncExtension::EglGetSyncAttribKHR EXIT aDisplay=%d, aSync=%d ret=%s", aDisplay, aSync, ret ? "EGL_TRUE":"EGL_FALSE");
       
   616     return ret;
       
   617     }
       
   618 
       
   619 EGLint CEglSyncExtension::FindAndLockDisplay(EGLDisplay aDisplay)
       
   620     {
       
   621     return OpenVGRI::getEGL()->FindAndLockDisplay(aDisplay);
       
   622     }
       
   623 
       
   624 void CEglSyncExtension::ReleaseDisplayLock(EGLDisplay aDisplay)
       
   625     {
       
   626 	OpenVGRI::getEGL()->ReleaseDisplayLock(aDisplay);
       
   627     }
       
   628 
       
   629 EGLSyncKHR CEglSyncExtension::CreateSync(EGLDisplay aDisplay, EGLenum aType)
       
   630     {
       
   631     CEglSync* sync = CEglSync::Create(iEglSyncMapLock,
       
   632                                       (EGLSyncKHR)(++iEglSyncId),
       
   633                                       aDisplay,
       
   634                                       aType);
       
   635 
       
   636     CHECK_AND_RET(sync != NULL,
       
   637                   EGL_BAD_ALLOC,
       
   638                   EGL_NO_SYNC_KHR,
       
   639                   "CEglSyncDisplayMap::CreateSync failed to create sync");
       
   640 
       
   641     TInt err = KErrNone;
       
   642     err = iEglSyncMap.Insert(iEglSyncId, sync);
       
   643 
       
   644     CHECK_CLEANUP_RET(err == KErrNone,
       
   645                       EGL_BAD_ALLOC,
       
   646                       EGL_NO_SYNC_KHR,
       
   647                       delete sync,
       
   648                       "CEglSyncDisplayMap::CreateSync insert failed");
       
   649 
       
   650     return (EGLSyncKHR)iEglSyncId;
       
   651     }
       
   652 
       
   653 EGLSyncKHR CEglSyncExtension::eglCreateSyncKHR(EGLDisplay aDisplay, EGLenum aType, const EGLint* aAttribList)
       
   654     {
       
   655     CEglSyncExtension* eglSyncInstance = (CEglSyncExtension*)OpenVGRI::getEGL()->EGLSyncExtension();
       
   656     CHECK_AND_RET(eglSyncInstance,
       
   657                   EGL_NOT_INITIALIZED,
       
   658                   EGL_NO_SYNC_KHR,
       
   659                   "CEglSyncExtension::eglCreateSyncKHR extension instance not created");
       
   660 
       
   661     return eglSyncInstance->EglCreateSyncKHR(aDisplay, aType, aAttribList);
       
   662     }
       
   663 
       
   664 EGLBoolean CEglSyncExtension::eglDestroySyncKHR(EGLDisplay aDisplay, EGLSyncKHR aSync)
       
   665     {
       
   666     CEglSyncExtension* eglSyncInstance = (CEglSyncExtension*)OpenVGRI::getEGL()->EGLSyncExtension();
       
   667     CHECK_AND_RET(eglSyncInstance,
       
   668                   EGL_NOT_INITIALIZED,
       
   669                   EGL_FALSE,
       
   670                  "CEglSyncExtension::eglDestroySyncKHR extension instance not created");
       
   671 
       
   672     return eglSyncInstance->EglDestroySyncKHR(aDisplay, aSync);
       
   673     }
       
   674 
       
   675 EGLint CEglSyncExtension::eglClientWaitSyncKHR(EGLDisplay aDisplay, EGLSyncKHR aSync, EGLint aFlags, EGLTimeKHR aTimeout)
       
   676     {
       
   677     CEglSyncExtension* eglSyncInstance = (CEglSyncExtension*)OpenVGRI::getEGL()->EGLSyncExtension();
       
   678     CHECK_AND_RET(eglSyncInstance,
       
   679                   EGL_NOT_INITIALIZED,
       
   680                   EGL_FALSE,
       
   681                  "CEglSyncExtension::eglGetSyncAttribKHR extension instance not created");
       
   682 
       
   683     return eglSyncInstance->EglClientWaitSyncKHR(aDisplay, aSync, aFlags, aTimeout);
       
   684     }
       
   685 
       
   686 EGLBoolean CEglSyncExtension::eglSignalSyncKHR(EGLDisplay aDisplay, EGLSyncKHR aSync, EGLenum aMode)
       
   687     {
       
   688     CEglSyncExtension* eglSyncInstance = (CEglSyncExtension*)OpenVGRI::getEGL()->EGLSyncExtension();
       
   689     CHECK_AND_RET(eglSyncInstance,
       
   690                   EGL_NOT_INITIALIZED,
       
   691                   EGL_FALSE,
       
   692                  "CEglSyncExtension::eglSignalSyncKHR extension instance not created");
       
   693 
       
   694     return eglSyncInstance->EglSignalSyncKHR(aDisplay, aSync, aMode);
       
   695     }
       
   696 
       
   697 
       
   698 EGLBoolean CEglSyncExtension::eglGetSyncAttribKHR(EGLDisplay aDisplay, EGLSyncKHR aSync, EGLint aAttribute, EGLint* aValue)
       
   699     {
       
   700     CEglSyncExtension* eglSyncInstance = (CEglSyncExtension*)OpenVGRI::getEGL()->EGLSyncExtension();
       
   701     CHECK_AND_RET(eglSyncInstance,
       
   702                   EGL_NOT_INITIALIZED,
       
   703                   EGL_FALSE,
       
   704                  "CEglSyncExtension::eglGetSyncAttribKHR extension instance not created");
       
   705 
       
   706     return eglSyncInstance->EglGetSyncAttribKHR(aDisplay, aSync, aAttribute, aValue);
       
   707     }
       
   708 
       
   709 EGLint CEglSyncExtension::egl_Private_SignalSyncNOK(EGLDisplay aDisplay, EGLSyncKHR aSync, EGLenum aMode)
       
   710     {
       
   711     CEglSyncExtension* eglSyncInstance = (CEglSyncExtension*)OpenVGRI::getEGL()->EGLSyncExtension();
       
   712     CHECK_AND_RET(eglSyncInstance,
       
   713                   EGL_NOT_INITIALIZED,
       
   714                   EGL_NOT_INITIALIZED,
       
   715                   "CEglSyncExtension::egl_Private_SignalSyncNOK extension instance not created");
       
   716 
       
   717     return eglSyncInstance->Egl_Private_SignalSyncNOK(aDisplay, aSync, aMode);
       
   718     }