guestrendering/guestopenvg/src/vgstate.cpp
branchbug235_bringup_0
changeset 14 acbd4400e82b
child 24 a3f46bb01be2
equal deleted inserted replaced
13:220791dae4c4 14:acbd4400e82b
       
     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 // Client-side state information for Symbian DLL
       
    15 
       
    16 #include "vgstate.h"
       
    17 #include "remotefunctioncall.h"
       
    18 #include "openvgrfc.h"
       
    19 
       
    20 
       
    21 
       
    22 // VG Client-side state is Writeable Static Data in the DLL, (holds state information for the process)
       
    23 // Constructor/Destructor called on process load/unload to perform initialiser/release of static resources
       
    24 XOpenVgState OpenVgState;
       
    25 
       
    26 
       
    27 
       
    28 _LIT(KVgPanicCategory, "Guest VG");
       
    29 
       
    30 void VgPanic(TVgPanic aPanicCode, char* aPanicName, char* aCondition, char* aFile, TInt aLine)
       
    31 	{
       
    32 	if (aPanicName && aCondition && aFile)
       
    33 		{ // normal for Debug builds
       
    34 		RDebug::Printf("Guest Open VG DLL Panic %s for failed Assert (%s),\n\tat %s:%d", aPanicName, aCondition, aFile, aLine);
       
    35 		}
       
    36 	else if (aPanicName && aFile)
       
    37 		{ // Debug builds Assert Always
       
    38 		RDebug::Printf("Guest Open VG DLL Panic %s at %s:%d", aPanicName, aFile, aLine);
       
    39 		}
       
    40 	else
       
    41 		{ // normal for Release builds
       
    42 		RDebug::Printf("Guest Open VG DLL Panic %d (line %d)", aPanicCode, aLine);
       
    43 		}
       
    44 
       
    45 	User::Panic(KVgPanicCategory, aPanicCode);
       
    46 	}
       
    47 
       
    48 
       
    49 
       
    50 /////////////////////////////////////////////////////////////////////////////////////////////
       
    51 // TCheck - parameter checking utility functions
       
    52 /////////////////////////////////////////////////////////////////////////////////////////////
       
    53 
       
    54 
       
    55 /*
       
    56  aWidth & aHeight parameters must be >0, also ax, ay, aX + aWidth and aY + aHeight must all
       
    57  be within image size, otherwise a VG_ILLEGAL_ARGUMENT_ERROR is flagged.
       
    58  */
       
    59 TBool TCheck::ChkAreaIsWithinImage(MVgContext& aVgContext, CVgImageBase* aImageInfo, VGint aX, VGint aY, VGint aWidth, VGint aHeight)
       
    60 	{
       
    61 	VGPANIC_ASSERT_DEBUG(aImageInfo, EVgPanicTemp);
       
    62 	if ( (aX >= 0) && (aY >= 0) && (aWidth > 0) && (aHeight > 0) )
       
    63 		{
       
    64 		VGint maxX = aWidth + aX;
       
    65 		VGint maxY = aHeight + aY;
       
    66 		if ( (maxX > 0) && (maxY > 0) && (aImageInfo->Width() >= maxX) && (aImageInfo->Height() >= maxY) )
       
    67 			{
       
    68 			return ETrue;
       
    69 			}
       
    70 		}
       
    71 	OPENVG_TRACE("TCheck::ChkAreaIsWithinImage setting VG_ILLEGAL_ARGUMENT_ERROR");
       
    72 	aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
       
    73 	return EFalse;
       
    74 	}
       
    75 
       
    76 
       
    77 VGint TCheck::ImageFormatByteDepth(VGImageFormat aImageFormat)
       
    78 	{
       
    79 	switch (aImageFormat)
       
    80 		{
       
    81 		case VG_sRGBX_8888:
       
    82 		case VG_sRGBA_8888:
       
    83 		case VG_sRGBA_8888_PRE:
       
    84 		case VG_lRGBX_8888:
       
    85 		case VG_lRGBA_8888:
       
    86 		case VG_lRGBA_8888_PRE:
       
    87 		case VG_sXRGB_8888:
       
    88 		case VG_sARGB_8888:
       
    89 		case VG_sARGB_8888_PRE:
       
    90 		case VG_lXRGB_8888:
       
    91 		case VG_lARGB_8888:
       
    92 		case VG_lARGB_8888_PRE:
       
    93 		case VG_sBGRX_8888:
       
    94 		case VG_sBGRA_8888:
       
    95 		case VG_sBGRA_8888_PRE:
       
    96 		case VG_lBGRX_8888:
       
    97 		case VG_lBGRA_8888:
       
    98 		case VG_lBGRA_8888_PRE:
       
    99 		case VG_sXBGR_8888:
       
   100 		case VG_sABGR_8888:
       
   101 		case VG_sABGR_8888_PRE:
       
   102 		case VG_lXBGR_8888:
       
   103 		case VG_lABGR_8888:
       
   104 		case VG_lABGR_8888_PRE:
       
   105 			return 4;
       
   106 		case VG_sRGB_565:
       
   107 		case VG_sRGBA_5551:
       
   108 		case VG_sRGBA_4444:
       
   109 		case VG_sARGB_1555:
       
   110 		case VG_sARGB_4444:
       
   111 		case VG_sBGR_565:
       
   112 		case VG_sBGRA_5551:
       
   113 		case VG_sBGRA_4444:
       
   114 		case VG_sABGR_1555:
       
   115 		case VG_sABGR_4444:
       
   116 			return 2;
       
   117 		case VG_sL_8:
       
   118 		case VG_lL_8:
       
   119 		case VG_A_8:
       
   120 		case VG_A_4:
       
   121 		case VG_A_1:
       
   122 		case VG_BW_1:
       
   123 			return 1;
       
   124 		case VG_IMAGE_FORMAT_INVALID:
       
   125 		default:
       
   126 			return 0;
       
   127 		}
       
   128 	}
       
   129 
       
   130 
       
   131 // Checks aCount & aValues for SetParameteriv & SetParameterfv
       
   132 TBool TCheck::ChkParamCountAndValuesPtr(MVgContext& aVgContext, VGint aCount, const void* aValues)
       
   133 	{
       
   134 	VGErrorCode error = VG_NO_ERROR;
       
   135 	if (aValues == NULL)
       
   136 		{
       
   137 		if (aCount != 0)
       
   138 			{
       
   139 			error = VG_ILLEGAL_ARGUMENT_ERROR;
       
   140 			}
       
   141 		}
       
   142 	// we should check count for not being too large for serialization, but
       
   143 	// there is no limit in spec for VG_SCISSOR_RECTS and VG_STROKE_DASH_PATTERN
       
   144 	else if ( (3ul & (unsigned)aValues) || (aCount < 0) || (aCount > 100000) )
       
   145 		{
       
   146 		error = VG_ILLEGAL_ARGUMENT_ERROR;
       
   147 		}
       
   148 
       
   149 	if (error != VG_NO_ERROR)
       
   150 		{
       
   151 		OPENVG_TRACE("TCheck::ChkParamCountAndValuesPtr setting error=0x%x", error);
       
   152 		aVgContext.SetVgError(error);
       
   153 		return EFalse;
       
   154 		}
       
   155 	return ETrue;
       
   156 	}
       
   157 
       
   158 
       
   159 /////////////////////////////////////////////////////////////////////////////////////////////
       
   160 // XOpenVgState
       
   161 /////////////////////////////////////////////////////////////////////////////////////////////
       
   162 
       
   163 // Singleton object is in WSD memory, so this Constructor is called when the DLL is loaded
       
   164 XOpenVgState::XOpenVgState() :
       
   165 		iEglManagementApi(NULL), iKVgMaxKernelSize(0), iKVgMaxSeparableKernelSize(0)
       
   166 	{
       
   167 	OPENVG_TRACE("XOpenVgState::XOpenVgState 1. start Process=0x%lx, Thread=0x%lx", RProcess().Id().Id(), RThread().Id().Id());
       
   168 
       
   169 	TInt createErr1 = iStateLock.CreateLocal(EOwnerProcess);
       
   170 	OPENVG_TRACE("XOpenVgState::XOpenVgState 2. iStateLock.CreateLocal error=%d, Handle=0x%x", createErr1, iStateLock.Handle());
       
   171 
       
   172 	TInt createErr2 = iMapLock.CreateLocal(EOwnerProcess);
       
   173 	OPENVG_TRACE("XOpenVgState::XOpenVgState 2. iMapLock.CreateLocal error=%d, Handle=0x%x", createErr2, iMapLock.Handle());
       
   174 	// cannot continue if there is an error, so Panic
       
   175 	VGPANIC_ASSERT( (createErr1 == KErrNone) && (createErr2 == KErrNone), EVgPanicTemp);
       
   176 
       
   177 	CVgHandleBase::InitStatics();
       
   178 
       
   179 	// publish MVgApiforEgl vtable
       
   180 	CVghwUtils::SetVgApiForEgl(this);
       
   181 	}
       
   182 
       
   183 
       
   184 // Desstructor is called when the DLL is unloaded
       
   185 XOpenVgState::~XOpenVgState()
       
   186 	{
       
   187 	OPENVG_TRACE("XOpenVgState::~XOpenVgState 1. iStateLock handle=0x%x, iMapLock handle=0x%x, Process=0x%lx, Thread=0x%lx",
       
   188 			iStateLock.Handle(), iMapLock.Handle(), RProcess().Id().Id(), RThread().Id().Id());
       
   189 
       
   190 	if (iStateLock.Handle())
       
   191 		{
       
   192 		iStateLock.Close();
       
   193 		OPENVG_TRACE("XOpenVgState::~XOpenVgState 2. iStateLock Handle=0x%x", iStateLock.Handle());
       
   194 		}
       
   195 	if (iMapLock.Handle())
       
   196 		{
       
   197 		iMapLock.Close();
       
   198 		OPENVG_TRACE("XOpenVgState::~XOpenVgState 3. iMapLock Handle=0x%x", iMapLock.Handle());
       
   199 		}
       
   200 
       
   201 	// unpublish MVgApiforEgl vtable
       
   202 	CVghwUtils::SetVgApiForEgl(NULL);
       
   203 	}
       
   204 
       
   205 
       
   206 TBool XOpenVgState::CheckVGHandle(MVgContext& aVgContext, VGHandle aHandle, CVgHandleBase** aHandleInfo, TVgHandleType aMatchType)
       
   207 	{ // client side VGHandle is an opaque data handle to Host Open VG objects such as VGPath or VGImage
       
   208 	// only check for logic errors in VG code in Debug builds
       
   209 	VGPANIC_ASSERT_DEBUG(iStateLock.IsHeld(), EVgPanicStateLockMutexNotHeld);
       
   210 	VGPANIC_ASSERT_DEBUG(aHandleInfo, EVgPanicFunctionParameterIsNull);
       
   211 
       
   212 	if (aHandle != VG_INVALID_HANDLE)
       
   213 		{
       
   214 		iMapLock.Wait();
       
   215 		CVgHandleBase** pHandleInfo = iHandleHashMap.Find(aHandle);
       
   216 		if (pHandleInfo)
       
   217 			{
       
   218 			CVgHandleBase* handleInfo = *pHandleInfo;
       
   219 			if (handleInfo && !handleInfo->IsDestroyed() &&
       
   220 					( (aMatchType == EVgHandleAny) || (aMatchType == handleInfo->HandleType()) ) )
       
   221 				{
       
   222 				// ToDo confirm handle belongs to this context or is shared with this context
       
   223 				*aHandleInfo = handleInfo;
       
   224 				OPENVG_TRACE("  XOpenVgState::CheckVGHandle client handle=0x%x, match type=%d; found matching Host VG Handle=0x%x",
       
   225 						aHandle, aMatchType, handleInfo->HostHandle());
       
   226 				iMapLock.Signal();
       
   227 				return ETrue;
       
   228 				}
       
   229 			}
       
   230 		iMapLock.Signal();
       
   231 		}
       
   232 	OPENVG_TRACE("  XOpenVgState::CheckVGHandle client handle=0x%x, match type=%d, setting VG_BAD_HANDLE_ERROR", aHandle, aMatchType);
       
   233 	aVgContext.SetVgError(VG_BAD_HANDLE_ERROR);
       
   234 	return EFalse;
       
   235 	}
       
   236 
       
   237 
       
   238 /*
       
   239  aKernelWidth or aKernelHeight must be >0 and <= [Size Limit], otherwise a VG_ILLEGAL_ARGUMENT_ERROR is flagged
       
   240  */
       
   241 TBool XOpenVgState::CheckKernelWidthAndHeight(MVgContext& aVgContext, VGint aKernelWidth, VGint aKernelHeight, VGParamType aLimitType)
       
   242 	{
       
   243 	VGPANIC_ASSERT_DEBUG(iStateLock.IsHeld(), EVgPanicStateLockMutexNotHeld);
       
   244 	VGint limit = 0;
       
   245 	// aLimitType must be either VG_MAX_KERNEL_SIZE or VG_MAX_SEPARABLE_KERNEL_SIZE
       
   246 	if (aLimitType == VG_MAX_KERNEL_SIZE)
       
   247 		{
       
   248 		if (iKVgMaxKernelSize == 0)
       
   249 			{ // first access, so fetch value from Host
       
   250 			iKVgMaxKernelSize = TGuestOpenVg::HostGeti(aVgContext, VG_MAX_KERNEL_SIZE);
       
   251 			}
       
   252 		limit = iKVgMaxKernelSize;
       
   253 		}
       
   254 	else if (aLimitType == VG_MAX_SEPARABLE_KERNEL_SIZE)
       
   255 		{
       
   256 		if (iKVgMaxSeparableKernelSize == 0)
       
   257 			{ // first access, so fetch value from Host
       
   258 			iKVgMaxSeparableKernelSize = TGuestOpenVg::HostGeti(aVgContext, VG_MAX_SEPARABLE_KERNEL_SIZE);
       
   259 			}
       
   260 		limit = iKVgMaxSeparableKernelSize;
       
   261 		}
       
   262 	VGPANIC_ASSERT(limit > 0, EVgPanicValueFromHostVgIsInvalid);
       
   263 
       
   264 	if ( (aKernelHeight > 0) && (aKernelHeight <= limit) && (aKernelWidth > 0) && (aKernelWidth <= limit) )
       
   265 		{
       
   266 		return ETrue;
       
   267 		}
       
   268 	OPENVG_TRACE("XOpenVgState::CheckKernelWidthAndHeight setting VG_ILLEGAL_ARGUMENT_ERROR");
       
   269 	aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
       
   270 	return EFalse;
       
   271 	}
       
   272 
       
   273 
       
   274 TBool XOpenVgState::AddToHashMap(MVgContext& aVgContext, CVgHandleBase* aHandleInfo, VGHandle aHostHandle)
       
   275 	{
       
   276 	VGPANIC_ASSERT_DEBUG(iStateLock.IsHeld(), EVgPanicStateLockMutexNotHeld);
       
   277 
       
   278 	OPENVG_TRACE("  XOpenVgState::AddToHashMap aHandleInfo=0x%x, aHostHandle=0x%x, ClientHandle=0x%x",
       
   279 			aHandleInfo, aHostHandle, aHandleInfo->ClientHandle());
       
   280 	aHandleInfo->SetHostHandle(aHostHandle);
       
   281 
       
   282 	iMapLock.Wait();
       
   283 	RHeap* clientHeap = CVghwUtils::SwitchToVghwHeap();
       
   284 	// ClientHandle is key to finding object, its Host Handle, object type, etc...
       
   285 	TInt err = iHandleHashMap.Insert(aHandleInfo->ClientHandle(), aHandleInfo);
       
   286 	CVghwUtils::SwitchFromVghwHeap(clientHeap);
       
   287 	iMapLock.Signal();
       
   288 
       
   289 	if (err == KErrNone)
       
   290 		{
       
   291 		return ETrue;
       
   292 		}
       
   293 
       
   294 	// Failed, Cleanup ...
       
   295 	OPENVG_TRACE("  XOpenVgState::AddToHashMap insert error = %d", err);
       
   296 	aVgContext.SetVgError(VG_OUT_OF_MEMORY_ERROR);
       
   297 	return EFalse;
       
   298 	}
       
   299 
       
   300 
       
   301 void XOpenVgState::UnMapHandle(TUint32 aClientHandle)
       
   302 	{
       
   303 	OPENVG_TRACE("  XOpenVgState::UnMapHandle aHandleInfo=0x%x -->", aClientHandle);
       
   304 	VGPANIC_ASSERT_DEBUG(iStateLock.IsHeld(), EVgPanicStateLockMutexNotHeld);
       
   305 	VGPANIC_ASSERT_DEBUG( CVghwUtils::UsingVghwHeap(), EVgPanicTemp);
       
   306 
       
   307 	iMapLock.Wait();
       
   308 #ifdef _DEBUG
       
   309 	TInt dbgErr =
       
   310 #endif
       
   311 			iHandleHashMap.Remove(aClientHandle);
       
   312 	iMapLock.Signal();
       
   313 
       
   314 	OPENVG_TRACE("  XOpenVgState::UnMapHandle ... dbgErr =%d <--", dbgErr);
       
   315 	}
       
   316 
       
   317 
       
   318 TBool XOpenVgState::EglImageOpenForVgImage(EGLImageKHR aImage, TSize& aSize, VGHandle& aVgHandle, TUint64& aSgImageId)
       
   319 	{
       
   320 	if (!iEglManagementApi)
       
   321 		{ // try to get EGL interface via VghwUtils
       
   322 		iEglManagementApi = CVghwUtils::EglManagementApi();
       
   323 		VGPANIC_ASSERT_DEBUG(iEglManagementApi, EVgPanicMissingEglInterface);
       
   324 		}
       
   325 	if (iEglManagementApi)
       
   326 		{
       
   327 		return iEglManagementApi->EglImageOpenForVgImage(aImage, aSize, aVgHandle, aSgImageId);
       
   328 		}
       
   329 	return EFalse;
       
   330 	}
       
   331 
       
   332 
       
   333 void XOpenVgState::EglImageClose(EGLImageKHR aImage)
       
   334 	{
       
   335 	if (iEglManagementApi)
       
   336 		{
       
   337 		iEglManagementApi->EglImageClose(aImage);
       
   338 		}
       
   339 	}
       
   340 
       
   341 
       
   342 // Guest Open VG extension export support for eglGetProcAddress
       
   343 typedef struct
       
   344 	{
       
   345 	const char*          procName;		// procedure name
       
   346 	ExtensionProcPointer procAddr;
       
   347 	} TVgExtnInfo;
       
   348 
       
   349 // VG extension functions
       
   350 static const TVgExtnInfo vgProcedures[] =
       
   351 	{
       
   352 		{ "vgCreateEGLImageTargetKHR", (ExtensionProcPointer)vgCreateEGLImageTargetKHR },
       
   353 	};
       
   354 
       
   355 const TInt KVgProcCount = sizeof(vgProcedures) / sizeof(TVgExtnInfo);
       
   356 
       
   357 ExtensionProcPointer XOpenVgState::guestGetVgProcAddress (const char *aProcName)
       
   358 	{
       
   359 	// exhaustive search
       
   360 	for (TInt idx = 0; idx < KVgProcCount; idx++)
       
   361 	  {
       
   362 	  if (!strcmp(aProcName, vgProcedures[idx].procName))
       
   363 		  return vgProcedures[idx].procAddr;
       
   364 	  }
       
   365 	return NULL;
       
   366 	}
       
   367 
       
   368 
       
   369 /////////////////////////////////////////////////////////////////////////////////////////////
       
   370 // TCleanupVgLocks
       
   371 /////////////////////////////////////////////////////////////////////////////////////////////
       
   372 
       
   373 TCleanupVgLocks::TCleanupVgLocks(MVgContext& aVgContext) :
       
   374 		iVgContext(aVgContext), iMutex(OpenVgState.MutexWait()), iIsHeld(ETrue)
       
   375 	{}
       
   376 
       
   377 TCleanupVgLocks::~TCleanupVgLocks()
       
   378 	{
       
   379 	if (iIsHeld)
       
   380 		{
       
   381 		SignalMutex();
       
   382 		}
       
   383 	}
       
   384 
       
   385 void TCleanupVgLocks::SignalMutex()
       
   386 	{
       
   387 	VGPANIC_ASSERT_DEBUG(iIsHeld && iMutex.IsHeld(), EVgPanicTemp);
       
   388 	iMutex.Signal();
       
   389 	iIsHeld = EFalse;
       
   390 	}
       
   391 
       
   392 
       
   393 /*
       
   394  Returns false & sets VG error to VG_ILLEGAL_ARGUMENT_ERROR if VGMaskOperation is not a supported operation
       
   395  */
       
   396 TBool TCleanupVgLocks::CheckVGMaskOperationAndHandle(VGMaskOperation aOperation, VGHandle aMask, CVgImageBase** aHandleInfo)
       
   397 	{
       
   398 	VGPANIC_ASSERT_DEBUG(iIsHeld, EVgPanicStateLockMutexNotHeld);
       
   399 	*aHandleInfo = NULL;
       
   400 	switch (aOperation)
       
   401 		{
       
   402 		case VG_CLEAR_MASK:
       
   403 		case VG_FILL_MASK:
       
   404 			// aMask is not used for these operations
       
   405 			return ETrue;
       
   406 		case VG_SET_MASK:
       
   407 		case VG_UNION_MASK:
       
   408 		case VG_INTERSECT_MASK:
       
   409 		case VG_SUBTRACT_MASK:
       
   410 			{
       
   411 			if (aMask == VG_INVALID_HANDLE)
       
   412 				return ETrue;
       
   413 
       
   414 			CVgHandleBase* tempInfo;
       
   415 			if (CheckVGAnyHandle(aMask, &tempInfo))
       
   416 				{
       
   417 				if ( (tempInfo->HandleType() == EVgHandleForMaskLayer) || (tempInfo->HandleType() == EVgHandleForImage) )
       
   418 					{
       
   419 					*aHandleInfo = (CVgImageBase*)tempInfo;
       
   420 					// TODO if handle is a VgImage verify that it is not a rendering target
       
   421 					return ETrue;
       
   422 					}
       
   423 				OPENVG_TRACE("TCleanupVgLocks::CheckVGMaskOperationAndHandle setting VG_BAD_HANDLE_ERROR");
       
   424 				iVgContext.SetVgError(VG_BAD_HANDLE_ERROR);
       
   425 				}
       
   426 			return EFalse;
       
   427 			}
       
   428 		default:
       
   429 			OPENVG_TRACE("TCleanupVgLocks::CheckVGMaskOperationAndHandle setting VG_ILLEGAL_ARGUMENT_ERROR");
       
   430 			iVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
       
   431 			return EFalse;
       
   432 		}
       
   433 	}
       
   434 
       
   435 
       
   436 VGFont TCleanupVgLocks::CreateFont(VGint aGlyphCapacityHint)
       
   437 	{
       
   438 	VGPANIC_ASSERT_DEBUG(iIsHeld && iMutex.IsHeld(), EVgPanicTemp);
       
   439 
       
   440 	CVgFontInfo* fontInfo = CVgFontInfo::New();
       
   441 	if (fontInfo == NULL)
       
   442 		{
       
   443 		OPENVG_TRACE("  TGuestOpenVg::vgCreateFont - CVgFontInfo::New() failed");
       
   444 		iVgContext.SetVgError(VG_OUT_OF_MEMORY_ERROR);
       
   445 		}
       
   446 	else
       
   447 		{
       
   448 		RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
       
   449 		vgApiData.Init(OpenVgRFC::EvgCreateFont);
       
   450 		vgApiData.AppendParam(aGlyphCapacityHint);
       
   451 		VGPANIC_ASSERT_DEBUG(vgApiData.Data().Header().iOpType == RemoteFunctionCallData::EOpRequestWithReply, EVgPanicNotReplyOpcode);
       
   452 		iVgContext.ExecuteVgCommand(vgApiData);
       
   453 		VGFont hostFont = static_cast<VGFont>(vgApiData.ReturnValue());
       
   454 		OPENVG_TRACE("  TCleanupVgLocks::CreateFont - CVgFontInfo::New() success, hostFont=0x%x", hostFont);
       
   455 
       
   456 		if ( (hostFont != VG_INVALID_HANDLE) && OpenVgState.AddToHashMap(iVgContext, fontInfo, hostFont) )
       
   457 			{
       
   458 			return fontInfo->ClientHandle();
       
   459 			}
       
   460 
       
   461 		fontInfo->Destroy(iVgContext);
       
   462 		}
       
   463 
       
   464 	return VG_INVALID_HANDLE;
       
   465 	}
       
   466 
       
   467 
       
   468 VGImage TCleanupVgLocks::ChildImage(CVgImageInfo& aParentInfo, VGint aX, VGint aY, VGint aWidth, VGint aHeight)
       
   469 	{
       
   470 	CVgImageInfo* imageInfo = CVgImageInfo::New(aWidth, aHeight, &aParentInfo);
       
   471 	if (imageInfo == NULL)
       
   472 		{
       
   473 		iVgContext.SetVgError(VG_OUT_OF_MEMORY_ERROR);
       
   474 		OPENVG_TRACE("  TCleanupVgLocks::ChildImage - CVgImageInfo::New() failed");
       
   475 		}
       
   476 	else
       
   477 		{
       
   478 		RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
       
   479 		vgApiData.Init(OpenVgRFC::EvgChildImage);
       
   480 		vgApiData.AppendParam(aParentInfo.HostHandle());
       
   481 		vgApiData.AppendParam(aX);
       
   482 		vgApiData.AppendParam(aY);
       
   483 		vgApiData.AppendParam(aWidth);
       
   484 		vgApiData.AppendParam(aHeight);
       
   485 		VGPANIC_ASSERT_DEBUG(vgApiData.Data().Header().iOpType == RemoteFunctionCallData::EOpRequestWithReply, EVgPanicNotReplyOpcode);
       
   486 		iVgContext.ExecuteVgCommand(vgApiData);
       
   487 		VGImage hostImageHandle = static_cast<VGImage>(vgApiData.ReturnValue());
       
   488 
       
   489 		OPENVG_TRACE("  TCleanupVgLocks::ChildImage - CVgImageInfo::New() success, hostImageHandle=0x%x", hostImageHandle);
       
   490 		if ( (hostImageHandle != VG_INVALID_HANDLE) && OpenVgState.AddToHashMap(iVgContext, imageInfo, hostImageHandle) )
       
   491 			{
       
   492 			return imageInfo->ClientHandle();
       
   493 			}
       
   494 		imageInfo->Destroy(iVgContext);
       
   495 		}
       
   496 
       
   497 	return VG_INVALID_HANDLE;
       
   498 	}
       
   499 
       
   500 
       
   501 VGImage TCleanupVgLocks::CreateImage(VGImageFormat aFormat, VGint aWidth, VGint aHeight, VGbitfield aAllowedQuality)
       
   502 	{
       
   503 	CVgImageInfo* imageInfo = CVgImageInfo::New(aFormat, aWidth, aHeight, aAllowedQuality);
       
   504 	if (imageInfo == NULL)
       
   505 		{
       
   506 		iVgContext.SetVgError(VG_OUT_OF_MEMORY_ERROR);
       
   507 		OPENVG_TRACE("  TCleanupVgLocks::CreateImage - CVgImageInfo::New() failed");
       
   508 		}
       
   509 	else
       
   510 		{
       
   511 		RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
       
   512 		vgApiData.Init(OpenVgRFC::EvgCreateImage);
       
   513 		vgApiData.AppendParam(aFormat);
       
   514 		vgApiData.AppendParam(aWidth);
       
   515 		vgApiData.AppendParam(aHeight);
       
   516 		vgApiData.AppendParam(aAllowedQuality);
       
   517 		VGPANIC_ASSERT_DEBUG(vgApiData.Data().Header().iOpType == RemoteFunctionCallData::EOpRequestWithReply, EVgPanicNotReplyOpcode);
       
   518 		iVgContext.ExecuteVgCommand(vgApiData);
       
   519 		VGImage hostImageHandle = static_cast<VGImage>(vgApiData.ReturnValue());
       
   520 
       
   521 		OPENVG_TRACE("  TCleanupVgLocks::CreateImage - CVgImageInfo::New() success, hostImageHandle=0x%x", hostImageHandle);
       
   522 		if ( (hostImageHandle != VG_INVALID_HANDLE) && OpenVgState.AddToHashMap(iVgContext, imageInfo, hostImageHandle) )
       
   523 			{
       
   524 			return imageInfo->ClientHandle();
       
   525 			}
       
   526 		imageInfo->Destroy(iVgContext);
       
   527 		}
       
   528 
       
   529 	return VG_INVALID_HANDLE;
       
   530 	}
       
   531 
       
   532 
       
   533 VGMaskLayer TCleanupVgLocks::CreateMaskLayer(VGint aWidth, VGint aHeight)
       
   534 	{
       
   535 	CVgMaskLayerInfo* maskLayerInfo = CVgMaskLayerInfo::New(aWidth, aHeight);
       
   536 	if (maskLayerInfo == NULL)
       
   537 		{
       
   538 		OPENVG_TRACE("  TCleanupVgLocks::CreateMaskLayer - CVgMaskLayerInfo::New() failed");
       
   539 		iVgContext.SetVgError(VG_OUT_OF_MEMORY_ERROR);
       
   540 		}
       
   541 	else
       
   542 		{
       
   543 		RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
       
   544 		vgApiData.Init(OpenVgRFC::EvgCreateMaskLayer);
       
   545 		vgApiData.AppendParam(aWidth);
       
   546 		vgApiData.AppendParam(aHeight);
       
   547 		VGPANIC_ASSERT_DEBUG(vgApiData.Data().Header().iOpType == RemoteFunctionCallData::EOpRequestWithReply, EVgPanicNotReplyOpcode);
       
   548 		iVgContext.ExecuteVgCommand(vgApiData);
       
   549 		VGMaskLayer hostMaskHandle = static_cast<VGMaskLayer>(vgApiData.ReturnValue());
       
   550 
       
   551 		OPENVG_TRACE("  TCleanupVgLocks::CreateMaskLayer - CVgMaskLayerInfo::New() success, hostMaskHandle=0x%x", hostMaskHandle);
       
   552 		if ( (hostMaskHandle != VG_INVALID_HANDLE) && OpenVgState.AddToHashMap(iVgContext, maskLayerInfo, hostMaskHandle) )
       
   553 			{
       
   554 			return maskLayerInfo->ClientHandle();
       
   555 			}
       
   556 		maskLayerInfo->Destroy(iVgContext);
       
   557 		}
       
   558 
       
   559 	return VG_INVALID_HANDLE;
       
   560 	}
       
   561 
       
   562 
       
   563 VGPaint TCleanupVgLocks::CreatePaint()
       
   564 	{
       
   565 	CVgPaintInfo* paintInfo = CVgPaintInfo::New();
       
   566 	if (paintInfo == NULL)
       
   567 		{
       
   568 		OPENVG_TRACE("  TCleanupVgLocks::CreatePaint - CVgPaintInfo::New() failed");
       
   569 		iVgContext.SetVgError(VG_OUT_OF_MEMORY_ERROR);
       
   570 		}
       
   571 	else
       
   572 		{
       
   573 		RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
       
   574 		vgApiData.Init(OpenVgRFC::EvgCreatePaint);
       
   575 		VGPANIC_ASSERT_DEBUG(vgApiData.Data().Header().iOpType == RemoteFunctionCallData::EOpRequestWithReply, EVgPanicNotReplyOpcode);
       
   576 		iVgContext.ExecuteVgCommand(vgApiData);
       
   577 		VGPaint hostPaint = static_cast<VGPaint>(vgApiData.ReturnValue());
       
   578 
       
   579 		OPENVG_TRACE("  TCleanupVgLocks::CreatePaint - CVgPaintInfo::New() success, clientHandle=0x%x, hostHandle=0x%x",
       
   580 				paintInfo->ClientHandle(), hostPaint);
       
   581 		if ( (hostPaint != VG_INVALID_HANDLE) && OpenVgState.AddToHashMap(iVgContext, paintInfo, hostPaint) )
       
   582 			{
       
   583 			return paintInfo->ClientHandle();
       
   584 			}
       
   585 		paintInfo->Destroy(iVgContext);
       
   586 		}
       
   587 
       
   588 	return VG_INVALID_HANDLE;
       
   589 	}
       
   590 
       
   591 
       
   592 VGPaint TCleanupVgLocks::GetPaint(VGPaintMode aPaintMode)
       
   593 	{
       
   594 	CVgPaintInfo* paintInfo = CVgPaintInfo::New();
       
   595 	if (paintInfo == NULL)
       
   596 		{
       
   597 		iVgContext.SetVgError(VG_OUT_OF_MEMORY_ERROR);
       
   598 		OPENVG_TRACE("  TCleanupVgLocks::GetPaint - CVgPaintInfo::New() failed");
       
   599 		}
       
   600 	else
       
   601 		{
       
   602 		RemoteFunctionCallData rfcdata; OpenVgRFC vgApiData(rfcdata);
       
   603 		vgApiData.Init(OpenVgRFC::EvgGetPaint);
       
   604 		vgApiData.AppendParam(aPaintMode);
       
   605 		VGPANIC_ASSERT_DEBUG(vgApiData.Data().Header().iOpType == RemoteFunctionCallData::EOpRequestWithReply, EVgPanicNotReplyOpcode);
       
   606 		iVgContext.ExecuteVgCommand(vgApiData);
       
   607 		VGPaint hostPaint = static_cast<VGPaint>(vgApiData.ReturnValue());
       
   608 
       
   609 		OPENVG_TRACE("  TCleanupVgLocks::GetPaint - CVgPaintInfo::New() success, clientHandle=0x%x, hostHandle=0x%x",
       
   610 				paintInfo->ClientHandle(), hostPaint);
       
   611 		if ( (hostPaint != VG_INVALID_HANDLE) && OpenVgState.AddToHashMap(iVgContext, paintInfo, hostPaint) )
       
   612 			{
       
   613 			return paintInfo->ClientHandle();
       
   614 			}
       
   615 		paintInfo->Destroy(iVgContext);
       
   616 		}
       
   617 
       
   618 	return VG_INVALID_HANDLE;
       
   619 	}
       
   620 
       
   621 
       
   622 VGPath TCleanupVgLocks::CreatePath(VGint aPathFormat, VGPathDatatype aDatatype, VGfloat aScale, VGfloat aBias,
       
   623 		VGint aSegmentCapacityHint, VGint aCoordCapacityHint, VGbitfield aCapabilities)
       
   624 	{
       
   625 	VGPANIC_ASSERT_DEBUG(iIsHeld && iMutex.IsHeld(), EVgPanicTemp);
       
   626 
       
   627 	aCapabilities &= VG_PATH_CAPABILITY_ALL;
       
   628 	CVgPathInfo* pathInfo = CVgPathInfo::New(aDatatype, aScale, aBias, aCapabilities);
       
   629 	if (pathInfo == NULL)
       
   630 		{
       
   631 		OPENVG_TRACE("  TCleanupVgLocks::CreatePath - CVgPathInfo::New() failed");
       
   632 		iVgContext.SetVgError(VG_OUT_OF_MEMORY_ERROR);
       
   633 		}
       
   634 	else
       
   635 		{
       
   636 		RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
       
   637 		vgApiData.Init(OpenVgRFC::EvgCreatePath);
       
   638 		vgApiData.AppendParam(aPathFormat);
       
   639 		vgApiData.AppendParam(aDatatype);
       
   640 		vgApiData.AppendParam(aScale);
       
   641 		vgApiData.AppendParam(aBias);
       
   642 		vgApiData.AppendParam(aSegmentCapacityHint);
       
   643 		vgApiData.AppendParam(aCoordCapacityHint);
       
   644 		vgApiData.AppendParam(aCapabilities);
       
   645 		VGPANIC_ASSERT_DEBUG(vgApiData.Data().Header().iOpType == RemoteFunctionCallData::EOpRequestWithReply, EVgPanicNotReplyOpcode);
       
   646 		iVgContext.ExecuteVgCommand(vgApiData);
       
   647 		VGPath hostPath = static_cast<VGPath>(vgApiData.ReturnValue());
       
   648 		OPENVG_TRACE("  TCleanupVgLocks::CreatePath - CVgPathInfo::New() success, hostHandle=0x%x", hostPath);
       
   649 
       
   650 		if ( (hostPath != VG_INVALID_HANDLE) && OpenVgState.AddToHashMap(iVgContext, pathInfo, hostPath) )
       
   651 			{
       
   652 			return pathInfo->ClientHandle();
       
   653 			}
       
   654 
       
   655 		pathInfo->Destroy(iVgContext);
       
   656 		}
       
   657 	
       
   658 	return VG_INVALID_HANDLE;
       
   659 	}
       
   660 
       
   661 
       
   662 VGImage TCleanupVgLocks::CreateEGLImageTargetKHR(VGeglImageKHR aImage)
       
   663 	{
       
   664 	VGErrorCode error = VG_NO_ERROR;
       
   665 
       
   666 	if (aImage == NULL)
       
   667 		{
       
   668 		error = VG_ILLEGAL_ARGUMENT_ERROR;
       
   669 		}
       
   670 	else
       
   671 		{
       
   672 		// Try to open EGL Image from handle, and get info such as image size
       
   673 		TSize imageSize;
       
   674 		TUint64 sgImageId;
       
   675 		VGHandle vgHandle;
       
   676 		if (!OpenVgState.EglImageOpenForVgImage((EGLImageKHR) aImage, imageSize, vgHandle, sgImageId))
       
   677 			{
       
   678 			error = VG_UNSUPPORTED_IMAGE_FORMAT_ERROR;
       
   679 			}
       
   680 		else
       
   681 			{ // Open success, create a CVgImageInfo with all the details ...
       
   682 			// ToDo get & store VGImageFormat of underlying VGImage
       
   683 			CVgImageInfo* newImageInfo = CVgImageInfo::New(VG_IMAGE_FORMAT_INVALID, imageSize.iWidth, imageSize.iHeight,
       
   684 					(EGLImageKHR) aImage, sgImageId);
       
   685 			OPENVG_TRACE("TGuestOpenVg::vgCreateEGLImageTargetKHR imageSize=%d,%d, vgHandle=0x%x, sgImageId=0x%lx  newImageInfo=0x%x",
       
   686 					imageSize.iWidth, imageSize.iHeight, vgHandle, sgImageId, newImageInfo);
       
   687 			if (newImageInfo == NULL)
       
   688 				{
       
   689 				error = VG_OUT_OF_MEMORY_ERROR;
       
   690 				OpenVgState.EglImageClose((EGLImageKHR) aImage);
       
   691 				}
       
   692 			else
       
   693 				{
       
   694 				if (OpenVgState.AddToHashMap(iVgContext, newImageInfo, vgHandle))
       
   695 					{
       
   696 					// Notify Command Scheduler & KhronosWrappers
       
   697 					RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
       
   698 					vgApiData.Init(OpenVgRFC::EvgCreateEGLImageTargetKHR, RemoteFunctionCallData::EOpRequestWithReply);
       
   699 					vgApiData.AppendParam(aImage);
       
   700 					// ToDo any other parameters needed? Is this really a Request with Reply?
       
   701 					iVgContext.ExecuteVgCommand(vgApiData);
       
   702 					return newImageInfo->ClientHandle();  
       
   703 					}
       
   704 				newImageInfo->Destroy(iVgContext);
       
   705 				}
       
   706 			}
       
   707 		}
       
   708 
       
   709 
       
   710 	if (error != VG_NO_ERROR)
       
   711 		{
       
   712 		iVgContext.SetVgError(error);
       
   713 		OPENVG_TRACE("TGuestOpenVg::vgCreateEGLImageTargetKHR fail - error=0x%x", error);
       
   714 		}
       
   715 
       
   716 	return VG_INVALID_HANDLE;
       
   717 	}
       
   718 
       
   719 
       
   720 
       
   721 
       
   722 // **** Desirable: could check VGParamType for vgGet & vgSet scalar & vector operations.
       
   723 /*
       
   724   // Mode settings
       
   725   VG_MATRIX_MODE  ???
       
   726   VG_FILL_RULE  ???
       
   727   VG_IMAGE_QUALITY  ???
       
   728   VG_RENDERING_QUALITY  ???
       
   729   VG_BLEND_MODE  ???
       
   730   VG_IMAGE_MODE  ???
       
   731 
       
   732   // Scissoring rectangles
       
   733   VG_SCISSOR_RECTS  ???
       
   734 
       
   735   // Color Transformation
       
   736   VG_COLOR_TRANSFORM  ???
       
   737   VG_COLOR_TRANSFORM_VALUES  ???
       
   738 
       
   739   // Stroke parameters
       
   740   VG_STROKE_LINE_WIDTH  ???
       
   741   VG_STROKE_CAP_STYLE  ???
       
   742   VG_STROKE_JOIN_STYLE  ???
       
   743   VG_STROKE_MITER_LIMIT  ???
       
   744   VG_STROKE_DASH_PATTERN  ???
       
   745   VG_STROKE_DASH_PHASE  ???
       
   746   VG_STROKE_DASH_PHASE_RESET  ???
       
   747 
       
   748   // Edge fill color for VG_TILE_FILL tiling mode
       
   749   VG_TILE_FILL_COLOR  ???
       
   750 
       
   751   // Color for vgClear
       
   752   VG_CLEAR_COLOR  ???
       
   753 
       
   754   // Glyph origin
       
   755   VG_GLYPH_ORIGIN  ???
       
   756 
       
   757   // Enable/disable alpha masking and scissoring
       
   758   VG_MASKING  ???
       
   759   VG_SCISSORING  ???
       
   760 
       
   761   // Pixel layout information
       
   762   VG_PIXEL_LAYOUT  ???
       
   763   VG_SCREEN_LAYOUT  ???
       
   764 
       
   765   // Source format selection for image filters
       
   766   VG_FILTER_FORMAT_LINEAR  ???
       
   767   VG_FILTER_FORMAT_PREMULTIPLIED  ???
       
   768 
       
   769   // Destination write enable mask for image filters
       
   770   VG_FILTER_CHANNEL_MASK  ???
       
   771 
       
   772   // Implementation limits (read-only)
       
   773   VG_MAX_SCISSOR_RECTS, ReadOnly, Scalar
       
   774   VG_MAX_DASH_COUNT  ???
       
   775   VG_MAX_KERNEL_SIZE  ???
       
   776   VG_MAX_SEPARABLE_KERNEL_SIZE  ???
       
   777   VG_MAX_COLOR_RAMP_STOPS  ???
       
   778   VG_MAX_IMAGE_WIDTH  ???
       
   779   VG_MAX_IMAGE_HEIGHT  ???
       
   780   VG_MAX_IMAGE_PIXELS  ???
       
   781   VG_MAX_IMAGE_BYTES  ???
       
   782   VG_MAX_FLOAT  ???
       
   783   VG_MAX_GAUSSIAN_STD_DEVIATION  ???
       
   784   */
       
   785 
       
   786 //////////////////////////////////////////////////////////////////////////
       
   787 
       
   788 // end of file vgstate.cpp