More progress towards getting the guestvideodriver and dependencies compiling for S3. This check-in does not compile, so don't sync to this changelist. A later changelist will declare when compilation works again. bug235_bringup_0
authorFaisal Memon <faisal.memon@nokia.com>
Wed, 25 Aug 2010 17:57:53 +0100
branchbug235_bringup_0
changeset 2 e8ccf068ac7f
parent 1 d8d95053303a
child 3 ccf5191a9db1
More progress towards getting the guestvideodriver and dependencies compiling for S3. This check-in does not compile, so don't sync to this changelist. A later changelist will declare when compilation works again.
guestrendering/guestvideodriver/api/group/bld.inf
guestrendering/guestvideodriver/api/group/guestvideodriver.mmp
guestrendering/guestvideodriver/api/src/guestvideodriver.cpp
guestrendering/guestvideodriver/ldd/group/bld.inf
guestrendering/guestvideodriver/ldd/group/virtualvideohwdevice.mmp
guestrendering/guestvideodriver/ldd/src/devicereqhandler.cpp
guestrendering/guestvideodriver/ldd/src/reqhandlerextension.cpp
guestrendering/guestvideodriver/ldd/src/virtualvideohwchannel.cpp
guestrendering/guestvideodriver/ldd/src/virtualvideohwdevice.cpp
guestrendering/guestvideodriver/ldd/src/virtualvideohwinterface.cpp
guestrendering/guestvideodriver/rom/guestvideodriver.iby
guestrendering/vghwserialiser/eabi/vghwserialiseru.def
guestrendering/vghwserialiser/group/vghwserialiser.mmp
--- a/guestrendering/guestvideodriver/api/group/bld.inf	Fri Aug 20 18:02:40 2010 +0100
+++ b/guestrendering/guestvideodriver/api/group/bld.inf	Wed Aug 25 17:57:53 2010 +0100
@@ -1,21 +1,21 @@
-// Copyright (c) 2010 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:
-// Build file for guest video driver 
-/
-
-PRJ_PLATFORMS
-ARMV5
-
-PRJ_MMPFILES
-guestvideodriver.mmp
+// Copyright (c) 2010 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:
+// Build file for guest video driver 
+/
+
+PRJ_PLATFORMS
+ARMV5
+
+PRJ_MMPFILES
+guestvideodriver.mmp
--- a/guestrendering/guestvideodriver/api/group/guestvideodriver.mmp	Fri Aug 20 18:02:40 2010 +0100
+++ b/guestrendering/guestvideodriver/api/group/guestvideodriver.mmp	Wed Aug 25 17:57:53 2010 +0100
@@ -1,45 +1,45 @@
-// Copyright (c) 2010 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:
-// Project file for Guest Video Driver Implementation
-
-#include <platform_paths.hrh>
-
-TARGET          guestvideohwapi.dll
-TARGETTYPE      dll
-UID             0x1000008D 0x20026A2F
-NOEXPORTLIBRARY
-LINKAS          guestvideohwapi.dll
-
-DEFFILE         /epoc32/include/def/eabi/guestvideohwapi.def
-VENDORID        VID_DEFAULT
-CAPABILITY      CAP_GENERAL_DLL
-
-SOURCEPATH      ../src
-
-SOURCE          guestvideodriver.cpp
-
-USERINCLUDE     ../../../serialiser/inc
-
-USERINCLUDE     ../inc
-USERINCLUDE	../../../vghwserialiser/inc
-
-// Default system include paths for middleware layer modules
-OS_LAYER_SYSTEMINCLUDE
-OS_LAYER_ESTLIB_SYSTEMINCLUDE
-//SYSTEMINCLUDE   /epoc32/include/internal
-
-LIBRARY         euser.lib
-LIBRARY         vghwserialiser.lib
-
-LANG            SC
+// Copyright (c) 2010 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:
+// Project file for Guest Video Driver Implementation
+
+#include <platform_paths.hrh>
+
+TARGET          guestvideohwapi.dll
+TARGETTYPE      dll
+UID             0x1000008D 0x20026A2F
+NOEXPORTLIBRARY
+LINKAS          guestvideohwapi.dll
+
+DEFFILE         /epoc32/include/def/eabi/guestvideohwapi.def
+VENDORID        VID_DEFAULT
+CAPABILITY      CAP_GENERAL_DLL
+
+SOURCEPATH      ../src
+
+SOURCE          guestvideodriver.cpp
+
+USERINCLUDE     ../../../serialiser/inc
+
+USERINCLUDE     ../inc
+USERINCLUDE	../../../vghwserialiser/inc
+
+// Default system include paths for middleware layer modules
+OS_LAYER_SYSTEMINCLUDE
+OS_LAYER_ESTLIB_SYSTEMINCLUDE
+//SYSTEMINCLUDE   /epoc32/include/internal
+
+LIBRARY         euser.lib
+LIBRARY         vghwserialiser.lib
+
+LANG            SC
--- a/guestrendering/guestvideodriver/api/src/guestvideodriver.cpp	Fri Aug 20 18:02:40 2010 +0100
+++ b/guestrendering/guestvideodriver/api/src/guestvideodriver.cpp	Wed Aug 25 17:57:53 2010 +0100
@@ -1,254 +1,254 @@
-// Copyright (c) 2010 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:
-// Guest Video Driver Implementation
-
-#include <e32cmn.h>
-#include <e32des8.h> 
-#include <e32std.h> 
-#include <e32debug.h> 
-
-#include <graphics/guestvideodriver.h>
-#include <graphics/guestvideodriverprotocol.h>
-#include <graphics/guestvideodriverinterfaceconstants.h>
-
-#include "remotefunctioncall.h"
-#include "serializedfunctioncall.h"
-
-// tracing
-#ifdef _DEBUG
-#include <e32debug.h>
-    #define UTIL_TRACE(fmt, args...) RDebug::Printf(fmt, ##args)
-	#define DRVRPANIC_ASSERT(condition, panic) if (!(condition)) { DriverPanic(panic, #condition, __LINE__); }
-	#define DRVRPANIC_ASSERT_DEBUG(condition, panic) if (!(condition)) { DriverPanic(panic, #condition, __LINE__); }
-#else
-    #define UTIL_TRACE(fmt, args...)
-	#define DRVRPANIC_ASSERT(condition, panic) if (!(condition)) { DriverPanic(panic, NULL, __LINE__); }
-	#define DRVRPANIC_ASSERT_DEBUG(condition, panic)
-#endif
-
-//Max supported request size
-const TUint32 KMaxRequestSize( VVI_PARAMETERS_INPUT_MEMORY_SIZE );
-
-typedef enum
-	{
-	EDriverPanicSendBufferFailed=1,
-	EDriverPanicInvalidOperationType,
-	EDriverPanicOperationDataTooBig,
-	EDriverPanicDriverAlreadyOpen,
-	EDriverPanicCreateDriverChannelFailed,
-	EDriverPanicCreateThreadLockFailed,
-	EDriverPanicSendBufferFnDoesNotHaveThreadLock,
-	EDriverPanicBufferCommandFnDoesNotHaveThreadLock,
-	EDriverPanicDriverNotOpenForExecuteCommandFn,
-	EDriverPanicRequestStatusErrorInExecuteCommandFn, // 10
-	EDriverPanicBufferWriteFailed,
-	} TDriverPanic;
-
-_LIT(KDriverPanicCategory, "Guest VidDrv");
-
-void DriverPanic(TDriverPanic aPanicCode, char* aCondition, TInt aLine)
-	{
-	UTIL_TRACE("Guest Video Driver Panic %d for failed Assert (%s), at guestvideodriver.cpp:%d", aPanicCode, aCondition, aLine);
-		
-	User::Panic(KDriverPanicCategory, aPanicCode);
-	}
-
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// RGuestVideoDriver::RGuestVideoDriver
-// -----------------------------------------------------------------------------
-//
-EXPORT_C RGuestVideoDriver::RGuestVideoDriver() : iIsOpen(EFalse), iProcessId(0)
-    {
-    }
-
-// -----------------------------------------------------------------------------
-// RGuestVideoDriver::Open
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TInt RGuestVideoDriver::Open()
-    {
-	UTIL_TRACE("RGuestVideoDriver::Open start iProcessId=0x%x, iIsOpen=%d", iProcessId, iIsOpen);
-	DRVRPANIC_ASSERT(iIsOpen == EFalse, EDriverPanicDriverAlreadyOpen);
-	iProcessId = RProcess().Id();
-	TInt error = iThreadLock.CreateLocal(EOwnerProcess);
-	DRVRPANIC_ASSERT_DEBUG( error == KErrNone, EDriverPanicCreateThreadLockFailed);
-	if (!error)
-		{
-		error = DoCreate(
-			GuestVideoDriver::KDeviceName,
-			TVersion( GuestVideoDriver::KMajorVer,
-					  GuestVideoDriver::KMinorVer,
-					  GuestVideoDriver::KBuildVer ),
-			KNullUnit,
-			NULL,
-			NULL);
-		DRVRPANIC_ASSERT_DEBUG( error == KErrNone, EDriverPanicCreateDriverChannelFailed);
-		if (!error)
-			{
-			iIsOpen = ETrue;
-			}
-		}
-	UTIL_TRACE("RGuestVideoDriver::Open end iProcessId=0x%x, error=%d", iProcessId, error);
-	return error;
-	}
-
-// -----------------------------------------------------------------------------
-// RGuestVideoDriver::~RGuestVideoDriver
-// -----------------------------------------------------------------------------
-//
-EXPORT_C RGuestVideoDriver::~RGuestVideoDriver()
-    {
-	UTIL_TRACE("RGuestVideoDriver::~RGuestVideoDriver iProcessId=0x%x", iProcessId);
-	iThreadLock.Close();
-    }
-
-// -----------------------------------------------------------------------------
-// RGuestVideoDriver::ExecuteCommand
-// Syncrhonous version with local buffering
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void RGuestVideoDriver::ExecuteCommand(RemoteFunctionCallData& aRequestData)
-	{
-	DRVRPANIC_ASSERT(iIsOpen, EDriverPanicDriverNotOpenForExecuteCommandFn);
-	DRVRPANIC_ASSERT( (RemoteFunctionCallData::EOpRequestWithReply == aRequestData.Header().iOpType) ||
-			(RemoteFunctionCallData::EOpRequest == aRequestData.Header().iOpType),
-			EDriverPanicInvalidOperationType);
-
-	//Set thread and process id
-	aRequestData.SetThreadInformation(iProcessId, RThread().Id());
-	TBool sendNow = (RemoteFunctionCallData::EOpRequest != aRequestData.Header().iOpType); 
-	if (!sendNow)
-		{
-		iThreadLock.Wait();
-		while (!BufferCommand(aRequestData))
-			{
-			// Flush any queued commands & retry
-			if (iBuffer.Length())
-				{
-				SendBuffer();
-				}
-			else
-				{ // Too big for buffer
-				sendNow = ETrue;
-				break;
-				}
-			}
-		iThreadLock.Signal();
-		}
-
-	if (sendNow)
-		{
-		// Maintain order of operations by flushing queue
-		iThreadLock.Wait();
-		if (iBuffer.Length())
-			{
-			SendBuffer();
-			}
-		iThreadLock.Signal();
-
-		TRequestStatus status;
-		TPckg<RemoteFunctionCallData> data(aRequestData);
-		DRVRPANIC_ASSERT(data().SerialisedLength() <= KMaxRequestSize, EDriverPanicOperationDataTooBig);
-		UTIL_TRACE("RGuestVideoDriver::ExecuteCommand direct send, req length=%d", data().SerialisedLength());
-		DoRequest(GuestVideoDriver::ERequestExecuteCommand, status, (TAny*)&data);
-		User::WaitForRequest(status);
-		// status <> 0 if write of reply data failed
-		DRVRPANIC_ASSERT_DEBUG(status.Int() == KErrNone, EDriverPanicRequestStatusErrorInExecuteCommandFn);
-		}
-	}
-
-// Flush video Command buffer
-EXPORT_C void RGuestVideoDriver::Flush()
-	{
-	iThreadLock.Wait();
-	if (iIsOpen && iBuffer.Length())
-		{
-		SendBuffer();
-		}
-	iThreadLock.Signal();
-	}
-
-
-// -----------------------------------------------------------------------------
-// RGuestVideoDriver::BufferCommand
-// -----------------------------------------------------------------------------
-//
-TBool RGuestVideoDriver::BufferCommand( RemoteFunctionCallData& aRequestData )
-	{
-	DRVRPANIC_ASSERT_DEBUG(iThreadLock.IsHeld(), EDriverPanicBufferCommandFnDoesNotHaveThreadLock);
-	TBool result = EFalse;
-	SerializedFunctionCall data( aRequestData );
-
-	const TUint32 len = aRequestData.SerialisedLength();
-	const TInt alignmentAdjIndex( RemoteFunctionCallData::AlignIndex( iBuffer.Length(), 4 ) );
-
-	if ( (alignmentAdjIndex + len) < iBuffer.MaxLength() )
-		{
-		//There is enough space left on local buffer
-		iBuffer.SetLength( alignmentAdjIndex + len );
-		TPtrC8 serialisedDataPtr = iBuffer.Right( len );
-		TInt wlen = data.WriteToBuffer( const_cast<TUint8*>(serialisedDataPtr.Ptr()), len, 0 );
-		DRVRPANIC_ASSERT(wlen == len, EDriverPanicBufferWriteFailed);
-		result = ETrue;
-		}
-
-	UTIL_TRACE("RGuestVideoDriver::BufferCommand length=%d, Req len=%d, result=%d",
-			iBuffer.Length(), len, result);
-	return result;
-	}
-
-// -----------------------------------------------------------------------------
-// RGuestVideoDriver::MapToHWAddress
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TInt RGuestVideoDriver::MapToHWAddress( const TInt aChunkHandle, TUint32& aHWAddress )
-    {
-    TPckgBuf<TInt> handle( aChunkHandle );
-    TPckg<TUint32> address( aHWAddress );
-    return DoControl( GuestVideoDriver::ERequestMapAddress, (TAny*)&handle, (TAny*)&address );
-    }
-
-// -----------------------------------------------------------------------------
-// RGuestVideoDriver::EglGetSgHandles
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TInt RGuestVideoDriver::EglGetSgHandles( const TUint64 aId, TUint64 *aSgHandles )
-    {
-    TPckg<TUint64> sgId( aId );
-    TPckg<TUint64> sgHandles( *aSgHandles );
-    return DoControl( GuestVideoDriver::ERequestSgHandles, (TAny*)&sgId, (TAny*)&sgHandles );
-    }
-
-// -----------------------------------------------------------------------------
-// RGuestVideoDriver::SendBuffer
-// -----------------------------------------------------------------------------
-//
-void RGuestVideoDriver::SendBuffer()
-    {
-	UTIL_TRACE("RGuestVideoDriver::SendBuffer length=%d", iBuffer.Length());
-	DRVRPANIC_ASSERT_DEBUG(iThreadLock.IsHeld(), EDriverPanicSendBufferFnDoesNotHaveThreadLock);
-    TRequestStatus status;
-
-    DoRequest(GuestVideoDriver::ERequestLoadCommands, status, (TAny*)&iBuffer);
-
-    User::WaitForRequest( status );
-
-    iBuffer.Zero();
-	UTIL_TRACE("RGuestVideoDriver::SendBuffer status=%d", status.Int());
-	// Commands expecting a reply should never come through here, so status should always be KErrNone
-	DRVRPANIC_ASSERT(status.Int() == KErrNone, EDriverPanicSendBufferFailed);
-    }
+// Copyright (c) 2010 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:
+// Guest Video Driver Implementation
+
+#include <e32cmn.h>
+#include <e32des8.h> 
+#include <e32std.h> 
+#include <e32debug.h> 
+
+#include <graphics/guestvideodriver.h>
+#include <graphics/guestvideodriverprotocol.h>
+#include <graphics/guestvideodriverinterfaceconstants.h>
+
+#include "remotefunctioncall.h"
+#include "serializedfunctioncall.h"
+
+// tracing
+#ifdef _DEBUG
+#include <e32debug.h>
+    #define UTIL_TRACE(fmt, args...) RDebug::Printf(fmt, ##args)
+	#define DRVRPANIC_ASSERT(condition, panic) if (!(condition)) { DriverPanic(panic, #condition, __LINE__); }
+	#define DRVRPANIC_ASSERT_DEBUG(condition, panic) if (!(condition)) { DriverPanic(panic, #condition, __LINE__); }
+#else
+    #define UTIL_TRACE(fmt, args...)
+	#define DRVRPANIC_ASSERT(condition, panic) if (!(condition)) { DriverPanic(panic, NULL, __LINE__); }
+	#define DRVRPANIC_ASSERT_DEBUG(condition, panic)
+#endif
+
+//Max supported request size
+const TUint32 KMaxRequestSize( VVI_PARAMETERS_INPUT_MEMORY_SIZE );
+
+typedef enum
+	{
+	EDriverPanicSendBufferFailed=1,
+	EDriverPanicInvalidOperationType,
+	EDriverPanicOperationDataTooBig,
+	EDriverPanicDriverAlreadyOpen,
+	EDriverPanicCreateDriverChannelFailed,
+	EDriverPanicCreateThreadLockFailed,
+	EDriverPanicSendBufferFnDoesNotHaveThreadLock,
+	EDriverPanicBufferCommandFnDoesNotHaveThreadLock,
+	EDriverPanicDriverNotOpenForExecuteCommandFn,
+	EDriverPanicRequestStatusErrorInExecuteCommandFn, // 10
+	EDriverPanicBufferWriteFailed,
+	} TDriverPanic;
+
+_LIT(KDriverPanicCategory, "Guest VidDrv");
+
+void DriverPanic(TDriverPanic aPanicCode, char* aCondition, TInt aLine)
+	{
+	UTIL_TRACE("Guest Video Driver Panic %d for failed Assert (%s), at guestvideodriver.cpp:%d", aPanicCode, aCondition, aLine);
+		
+	User::Panic(KDriverPanicCategory, aPanicCode);
+	}
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// RGuestVideoDriver::RGuestVideoDriver
+// -----------------------------------------------------------------------------
+//
+EXPORT_C RGuestVideoDriver::RGuestVideoDriver() : iIsOpen(EFalse), iProcessId(0)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// RGuestVideoDriver::Open
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RGuestVideoDriver::Open()
+    {
+	UTIL_TRACE("RGuestVideoDriver::Open start iProcessId=0x%x, iIsOpen=%d", iProcessId, iIsOpen);
+	DRVRPANIC_ASSERT(iIsOpen == EFalse, EDriverPanicDriverAlreadyOpen);
+	iProcessId = RProcess().Id();
+	TInt error = iThreadLock.CreateLocal(EOwnerProcess);
+	DRVRPANIC_ASSERT_DEBUG( error == KErrNone, EDriverPanicCreateThreadLockFailed);
+	if (!error)
+		{
+		error = DoCreate(
+			GuestVideoDriver::KDeviceName,
+			TVersion( GuestVideoDriver::KMajorVer,
+					  GuestVideoDriver::KMinorVer,
+					  GuestVideoDriver::KBuildVer ),
+			KNullUnit,
+			NULL,
+			NULL);
+		DRVRPANIC_ASSERT_DEBUG( error == KErrNone, EDriverPanicCreateDriverChannelFailed);
+		if (!error)
+			{
+			iIsOpen = ETrue;
+			}
+		}
+	UTIL_TRACE("RGuestVideoDriver::Open end iProcessId=0x%x, error=%d", iProcessId, error);
+	return error;
+	}
+
+// -----------------------------------------------------------------------------
+// RGuestVideoDriver::~RGuestVideoDriver
+// -----------------------------------------------------------------------------
+//
+EXPORT_C RGuestVideoDriver::~RGuestVideoDriver()
+    {
+	UTIL_TRACE("RGuestVideoDriver::~RGuestVideoDriver iProcessId=0x%x", iProcessId);
+	iThreadLock.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// RGuestVideoDriver::ExecuteCommand
+// Syncrhonous version with local buffering
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RGuestVideoDriver::ExecuteCommand(RemoteFunctionCallData& aRequestData)
+	{
+	DRVRPANIC_ASSERT(iIsOpen, EDriverPanicDriverNotOpenForExecuteCommandFn);
+	DRVRPANIC_ASSERT( (RemoteFunctionCallData::EOpRequestWithReply == aRequestData.Header().iOpType) ||
+			(RemoteFunctionCallData::EOpRequest == aRequestData.Header().iOpType),
+			EDriverPanicInvalidOperationType);
+
+	//Set thread and process id
+	aRequestData.SetThreadInformation(iProcessId, RThread().Id());
+	TBool sendNow = (RemoteFunctionCallData::EOpRequest != aRequestData.Header().iOpType); 
+	if (!sendNow)
+		{
+		iThreadLock.Wait();
+		while (!BufferCommand(aRequestData))
+			{
+			// Flush any queued commands & retry
+			if (iBuffer.Length())
+				{
+				SendBuffer();
+				}
+			else
+				{ // Too big for buffer
+				sendNow = ETrue;
+				break;
+				}
+			}
+		iThreadLock.Signal();
+		}
+
+	if (sendNow)
+		{
+		// Maintain order of operations by flushing queue
+		iThreadLock.Wait();
+		if (iBuffer.Length())
+			{
+			SendBuffer();
+			}
+		iThreadLock.Signal();
+
+		TRequestStatus status;
+		TPckg<RemoteFunctionCallData> data(aRequestData);
+		DRVRPANIC_ASSERT(data().SerialisedLength() <= KMaxRequestSize, EDriverPanicOperationDataTooBig);
+		UTIL_TRACE("RGuestVideoDriver::ExecuteCommand direct send, req length=%d", data().SerialisedLength());
+		DoRequest(GuestVideoDriver::ERequestExecuteCommand, status, (TAny*)&data);
+		User::WaitForRequest(status);
+		// status <> 0 if write of reply data failed
+		DRVRPANIC_ASSERT_DEBUG(status.Int() == KErrNone, EDriverPanicRequestStatusErrorInExecuteCommandFn);
+		}
+	}
+
+// Flush video Command buffer
+EXPORT_C void RGuestVideoDriver::Flush()
+	{
+	iThreadLock.Wait();
+	if (iIsOpen && iBuffer.Length())
+		{
+		SendBuffer();
+		}
+	iThreadLock.Signal();
+	}
+
+
+// -----------------------------------------------------------------------------
+// RGuestVideoDriver::BufferCommand
+// -----------------------------------------------------------------------------
+//
+TBool RGuestVideoDriver::BufferCommand( RemoteFunctionCallData& aRequestData )
+	{
+	DRVRPANIC_ASSERT_DEBUG(iThreadLock.IsHeld(), EDriverPanicBufferCommandFnDoesNotHaveThreadLock);
+	TBool result = EFalse;
+	SerializedFunctionCall data( aRequestData );
+
+	const TUint32 len = aRequestData.SerialisedLength();
+	const TInt alignmentAdjIndex( RemoteFunctionCallData::AlignIndex( iBuffer.Length(), 4 ) );
+
+	if ( (alignmentAdjIndex + len) < iBuffer.MaxLength() )
+		{
+		//There is enough space left on local buffer
+		iBuffer.SetLength( alignmentAdjIndex + len );
+		TPtrC8 serialisedDataPtr = iBuffer.Right( len );
+		TInt wlen = data.WriteToBuffer( const_cast<TUint8*>(serialisedDataPtr.Ptr()), len, 0 );
+		DRVRPANIC_ASSERT(wlen == len, EDriverPanicBufferWriteFailed);
+		result = ETrue;
+		}
+
+	UTIL_TRACE("RGuestVideoDriver::BufferCommand length=%d, Req len=%d, result=%d",
+			iBuffer.Length(), len, result);
+	return result;
+	}
+
+// -----------------------------------------------------------------------------
+// RGuestVideoDriver::MapToHWAddress
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RGuestVideoDriver::MapToHWAddress( const TInt aChunkHandle, TUint32& aHWAddress )
+    {
+    TPckgBuf<TInt> handle( aChunkHandle );
+    TPckg<TUint32> address( aHWAddress );
+    return DoControl( GuestVideoDriver::ERequestMapAddress, (TAny*)&handle, (TAny*)&address );
+    }
+
+// -----------------------------------------------------------------------------
+// RGuestVideoDriver::EglGetSgHandles
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RGuestVideoDriver::EglGetSgHandles( const TUint64 aId, TUint64 *aSgHandles )
+    {
+    TPckg<TUint64> sgId( aId );
+    TPckg<TUint64> sgHandles( *aSgHandles );
+    return DoControl( GuestVideoDriver::ERequestSgHandles, (TAny*)&sgId, (TAny*)&sgHandles );
+    }
+
+// -----------------------------------------------------------------------------
+// RGuestVideoDriver::SendBuffer
+// -----------------------------------------------------------------------------
+//
+void RGuestVideoDriver::SendBuffer()
+    {
+	UTIL_TRACE("RGuestVideoDriver::SendBuffer length=%d", iBuffer.Length());
+	DRVRPANIC_ASSERT_DEBUG(iThreadLock.IsHeld(), EDriverPanicSendBufferFnDoesNotHaveThreadLock);
+    TRequestStatus status;
+
+    DoRequest(GuestVideoDriver::ERequestLoadCommands, status, (TAny*)&iBuffer);
+
+    User::WaitForRequest( status );
+
+    iBuffer.Zero();
+	UTIL_TRACE("RGuestVideoDriver::SendBuffer status=%d", status.Int());
+	// Commands expecting a reply should never come through here, so status should always be KErrNone
+	DRVRPANIC_ASSERT(status.Int() == KErrNone, EDriverPanicSendBufferFailed);
+    }
--- a/guestrendering/guestvideodriver/ldd/group/bld.inf	Fri Aug 20 18:02:40 2010 +0100
+++ b/guestrendering/guestvideodriver/ldd/group/bld.inf	Wed Aug 25 17:57:53 2010 +0100
@@ -20,4 +20,4 @@
 #ifdef FAISALMEMON_S4_SGIMAGE
 reqhandlerextension.mmp
 #endif
-// now lets tackle virtualvideohwdevice.mmp
+virtualvideohwdevice.mmp
--- a/guestrendering/guestvideodriver/ldd/group/virtualvideohwdevice.mmp	Fri Aug 20 18:02:40 2010 +0100
+++ b/guestrendering/guestvideodriver/ldd/group/virtualvideohwdevice.mmp	Wed Aug 25 17:57:53 2010 +0100
@@ -1,68 +1,63 @@
-/*
-* ==============================================================================
-*  Name        : VirtualVideoHwDevice.mmp
-*  Part of     : aasw / aamm
-*  Description : Project information file for Graphics Hw LDD.
-*  Version     : %version:7 %
-*
-*  Copyright © 2002-2010 Nokia. All rights reserved.
-*  This material, including documentation and any related 
-*  computer programs, is protected by copyright controlled by 
-*  Nokia. All rights are reserved. Copying, including 
-*  reproducing, storing, adapting or translating, any 
-*  or all of this material requires the prior written consent of 
-*  Nokia. This material also contains confidential 
-*  information which may not be disclosed to others without the 
-*  prior written consent of Nokia.
-* ==============================================================================
-*/
-
-#include <kernel/kern_ext.mmh>
-
-TARGET          platsimvideohw.ldd
-TARGETTYPE      ldd
- 
-UID             0 0x20026A2E //- 0x20026A32
-LINKAS          platsimvideohw.ldd
-VENDORID        0x70000001
-CAPABILITY      all
-
-OS_LAYER_SYSTEMINCLUDE
-OS_LAYER_KERNEL_SYSTEMINCLUDE
-OS_LAYER_ESTLIB_SYSTEMINCLUDE
-USERINCLUDE     ../inc
-USERINCLUDE     ../../commoninc
-SYSTEMINCLUDE   /epoc32/include/drivers
-SYSTEMINCLUDE   /epoc32/include/internal
-
-SOURCEPATH      ../src
-SOURCE          virtualvideohwdevice.cpp
-SOURCE          virtualvideohwchannel.cpp
-SOURCE          devicereqhandler.cpp
-SOURCE          virtualvideohwinterface.cpp
-
-USERINCLUDE     ../../../serialiser/inc
-USERINCLUDE     ../../../graphicsresourceimplementation/inc
-
-SOURCEPATH      ../../../serialiser/src
-SOURCE remotefunctioncall.cpp
-SOURCE serializedfunctioncall.cpp
-SOURCE eglrfc.cpp
-SOURCE openvgrfc.cpp
-SOURCE driverrfc.cpp
-SOURCE opengles11rfc.cpp
-
-#if defined(NCP_COMMON_RAPU_FAMILY)
-LIBRARY         karap.lib
-#else
-LIBRARY         VariantTarget(kanomadik,lib)
-#endif // NCP_COMMON_RAPU_FAMILY
-
-LIBRARY			reqhandlerextension.lib
-LIBRARY			sgextension.lib
-
-start wins
-win32_headers
-end
-// End of file
-
+// Copyright (c) 2010 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:
+//
+
+#include <kernel/kern_ext.mmh>
+
+TARGET          guestvideohw.ldd
+TARGETTYPE      ldd
+ 
+UID             0 0x20026A2E //- 0x20026A32
+LINKAS          guestvideohw.ldd
+VENDORID        0x70000001
+CAPABILITY      all
+
+OS_LAYER_SYSTEMINCLUDE
+OS_LAYER_KERNEL_SYSTEMINCLUDE
+OS_LAYER_ESTLIB_SYSTEMINCLUDE
+USERINCLUDE     ../inc
+USERINCLUDE     ../../commoninc
+SYSTEMINCLUDE   /epoc32/include/drivers
+
+SOURCEPATH      ../src
+SOURCE          virtualvideohwdevice.cpp
+SOURCE          virtualvideohwchannel.cpp
+SOURCE          devicereqhandler.cpp
+SOURCE          virtualvideohwinterface.cpp
+
+USERINCLUDE     ../../../vghwserialiser/inc
+#ifdef FAISALMEMON_S4_SGIMAGE
+USERINCLUDE     ../../../graphicsresourceimplementation/inc
+#endif
+
+SOURCEPATH      ../../../vghwserialiser/src
+SOURCE remotefunctioncall.cpp
+SOURCE serializedfunctioncall.cpp
+SOURCE eglrfc.cpp
+SOURCE openvgrfc.cpp
+SOURCE driverrfc.cpp
+SOURCE opengles11rfc.cpp
+
+// We need to link to some ASSP kernel extension here
+// TODO FAISALMEMON Need to confirm the correct library
+LIBRARY kasyborg.lib
+
+#ifdef FAISALMEMON_S4_SGIMAGE
+LIBRARY			reqhandlerextension.lib
+LIBRARY			sgextension.lib
+#endif
+
+start wins
+win32_headers
+end
--- a/guestrendering/guestvideodriver/ldd/src/devicereqhandler.cpp	Fri Aug 20 18:02:40 2010 +0100
+++ b/guestrendering/guestvideodriver/ldd/src/devicereqhandler.cpp	Wed Aug 25 17:57:53 2010 +0100
@@ -1,1439 +1,1451 @@
-/*
- * =============================================================================
- *  Name        : devicereqhandler.cpp
- *  Part of     : 
- *  Description : Implementation of the class DDeviceReqHandler.
- *  Version     : %version:6 %
- *
- *  Copyright © 2008-2010 Nokia. All rights reserved.
- *  This material, including documentation and any related
- *  computer programs, is protected by copyright controlled by
- *  Nokia. All rights are reserved. Copying, including
- *  reproducing, storing, adapting or translating, any
- *  or all of this material requires the prior written consent of
- *  Nokia. This material also contains confidential
- *  information which may not be disclosed to others without the
- *  prior written consent of Nokia.
- * =============================================================================
- */
-
-
-// INCLUDE FILES
-#include <platform.h>
-#include <assp.h>
-#include <kernel/kernel.h>
-#include <e32cmn.h>
-
-#include "devicereqhandler.h"
-#include "virtualvideohwinterface.h"
-
-#include "virtualvideotracing.h"
-
-#include "remotefunctioncall.h"
-#include "serializedfunctioncall.h"
-#include "driverrfc.h"
-#include "openvgrfc.h" //For the opcodes
-#include "eglrfc.h" //For the opcodes
-#include "opengles11rfc.h" //For the opcodes
-
-
-using namespace PlatsimVideoDriver;
-
-// LOCAL DATA TYPES
-TInt CmpTPbsIds(const TPbSId& a, const TPbSId& b)
-    {
-    if( a.iPbuffer == b.iPbuffer )
-        return 0;
-    else
-        return b.iPbuffer - a.iPbuffer;
-    }
-
-TInt CmpTVGIsIds(const TVGISId& a, const TVGISId& b)
-    {
-    if( a.iVGImage == b.iVGImage )
-        return 0;
-    else
-        return b.iVGImage - a.iVGImage;
-    }
-/*
- * Copies data from client space to the request buffer during serialisation
- */
-class TDataFromClientSpaceCopier: public MDataCopier
-    {
-public:
-    TDataFromClientSpaceCopier( DThread* aUserThread ):
-        iUserThread(aUserThread)
-        {
-        }
-    
-    TInt CopyData( TUint8* aDest, const TUint8* aSource, TUint32 aSize )
-        {
-        memcpy( aDest, aSource, aSize );
-        return KErrNone;
-        }
-    
-    TInt CopyVector( TUint8* aDest, const TUint8* aSource, TUint32 aSize )
-        {
-        return Kern::ThreadRawRead( iUserThread, aSource, aDest, aSize );
-        }
-
-    DThread* iUserThread;
-    };
-
-/*
- * Copies data to client space from the request buffer during deserialisation
- */
-class TDataToClientSpaceCopier: public MDataCopier
-    {
-public:
-    TDataToClientSpaceCopier( DThread* aUserThread ):
-        iUserThread(aUserThread)
-        {
-        }
-    
-    TInt CopyData( TUint8* aDest, const TUint8* aSource, TUint32 aSize )
-        {
-        memcpy( aDest, aSource, aSize );
-        return KErrNone;
-        }
-    
-    TInt CopyVector( TUint8* aDest, const TUint8* aSource, TUint32 aSize )
-        {
-        return Kern::ThreadRawWrite(iUserThread, aDest, aSource, aSize );
-        }
-
-    DThread* iUserThread;
-    };
-
-// LOCAL FUNCTION DEFINITIONS
-
-// -----------------------------------------------------------------------------
-// ListRemoteFunctionCall
-// -----------------------------------------------------------------------------
-//
-inline void ListRemoteFunctionCall(RemoteFunctionCallData& call)
-    {
-#if _DEBUG
-    VVHW_TRACE("RFC: %u %u %u %u %u %u %u",
-    call.Header().iOpCode,
-    call.Header().iTransactionId,
-    call.Header().iProcessId,
-    call.Header().iThreadId,
-    call.Header().iParameterCount,
-    call.Header().iOpType,
-    call.Header().iReturnValue);
-    
-    for ( TInt i = 0; i < call.Header().iParameterCount; i++)
-        {
-        RemoteFunctionCallData::TParam param = call.Parameters()[i];
-
-        TUint32 dir = param.iDir;
-        TUint32 type = param.iType;
-
-        
-        if ( RemoteFunctionCallData::TParam::ESimple == param.iType )
-            {
-            TUint32 datatype = param.iSimpleParam.iDataType; 
-            VVHW_TRACE("RFC Simple Param %d: %u %u %u",i, dir, type, datatype );
-            }
-        else if ( RemoteFunctionCallData::TParam::EVector == param.iType )
-            {
-            TUint32 datatype = param.iVectorParam.iDataType; 
-            TUint32 size = param.iVectorParam.iVectorLength;
-            VVHW_TRACE("RFC Vec Param %d: %u %u %u %u",i, dir, type, datatype, size );
-            }
-        }
-#endif // _DEBUG
-    }
-
-
-// CONSTANTS
-const TInt KDfcPriority = 1;
-
-// ============================= LOCAL FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// Isr
-// Interrupt service routine
-// -----------------------------------------------------------------------------
-//
-void Isr( TAny* aParam )
-    {
-    DDeviceReqHandler* handler = ( DDeviceReqHandler* )aParam;
-    Interrupt::Disable( handler->InterruptId() );
-    handler->Dfc().Add();
-    }
-
-// -----------------------------------------------------------------------------
-// DfcFunc
-// Function to call when HW has an interrupt
-// -----------------------------------------------------------------------------
-//
-void DfcFunc( TAny* aParam )
-    {
-    DDeviceReqHandler* handler = ( DDeviceReqHandler* )aParam;
-    handler->ProcessDfc();
-    }
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-
-// -----------------------------------------------------------------------------
-// DDeviceReqHandler::DDeviceReqHandler
-// -----------------------------------------------------------------------------
-//
-DDeviceReqHandler::DDeviceReqHandler(
-    DVirtualVideoHwInterface& aHwInterface,
-    TDfcQue* aQueue) :
-    iPbufferSgMapOrder ( &CmpTPbsIds ),
-    iVGImageSgMapOrder ( &CmpTVGIsIds ),
-    iCurrClientData(NULL),
-    iInitialized(EFalse),
-    iHwInterface( aHwInterface ),
-    iDfc( DfcFunc, (TAny*)this, aQueue, KDfcPriority ),
-    iInterruptId( 0 ),
-    iTransactionId( 1 ),
-    iRequestBuffer( *this, VVI_PARAMETERS_INPUT_MEMORY_SIZE )
-    {
-    iDriverRfcProcessId = 0;
-    iDriverRfcThreadId  = 0;
-    iOpType       = 0; 
-    iOpChainPhase = 0;
-    iInterruptId  = VVI_IRQ;
-    VVHW_TRACE( "DDeviceReqHandler constructor" );
-    VVHW_TRACE( "Called in process/thread %0x / %0x", Kern::CurrentProcess().iId, Kern::CurrentThread().iId );
-    TInt err = Interrupt::Bind( iInterruptId, Isr, ( TAny* )this );
-    if ( err != KErrNone )
-        {
-        VVHW_TRACE( "Interrupt::Bind Error: %d", err );
-        }
-    err = Interrupt::Enable( iInterruptId );
-    if ( err != KErrNone )
-        {
-        Interrupt::Unbind( iInterruptId );
-        iInterruptId = 0;
-        VVHW_TRACE( "Interrupt::Enable Error: %d", err );
-        }
-    iRequestBuffer.InitBuffer();
-    //Register this object with the extension
-    VVHW_TRACE( "DDeviceReqHandler calling ReqHandlerExtension" );
-    ReqHandlerExtension::SetReqHandler( this );
-    }
-
-// -----------------------------------------------------------------------------
-// DDeviceReqHandler::~DDeviceReqHandler
-// -----------------------------------------------------------------------------
-//
-DDeviceReqHandler::~DDeviceReqHandler()
-    {
-    for( TInt i=0; i < iClientData.Count(); ++i )
-        {
-        delete iClientData[i];
-        }
-    iClientData.Close();
-    Interrupt::Disable( iInterruptId );
-    Interrupt::Unbind( iInterruptId );
-    iInterruptId = 0;
-    }
-
-// -----------------------------------------------------------------------------
-// DDeviceReqHandler::HandleClientShutdown
-// -----------------------------------------------------------------------------
-//
-TInt DDeviceReqHandler::HandleClientShutdown( TUint aProcessId, TUint aThreadId )
-    {
-    VVHW_TRACE("DDeviceReqHandler::HandleClientShutdown");
-    TInt err( KErrNone );
-    TAsyncRequest* req = AllocRequest( NULL, NULL, NULL, NULL, TAsyncRequest::ERTDriver );
-    
-    if ( req )
-        {
-        DriverRFC drfc( req->iRemoteFunctionCall );
-        drfc.Init( DriverRFC::EDrvClientShutdown, RemoteFunctionCallData::EOpRequest );        
-        req->iRemoteFunctionCall.SetTransactionId( ++iTransactionId );
-        req->iRemoteFunctionCall.SetThreadInformation( aProcessId, aThreadId );        
-        iPendingRequestRoot.AppendToLast( req );
-        TInt ret = ProcessNextPendingRequest();
-        while ( KErrNone == ret )
-            {
-            ret = ProcessNextPendingRequest();
-            }
-        }
-    else
-        {
-        err = KErrNoMemory;
-        }
-    return err;
-    }
-
-// -----------------------------------------------------------------------------
-// DDeviceReqHandler::ProcessNextPendingRequest
-// -----------------------------------------------------------------------------
-//
-TInt DDeviceReqHandler::ProcessNextPendingRequest()
-    {
-    VVHW_TRACE("DDeviceReqHandler::ProcessNextPendingRequest");
-    TInt err( KErrNone );
-    TAsyncRequest* req = iPendingRequestRoot.iNext;
-    if ( !req )
-        {
-        VVHW_TRACE("DDeviceReqHandler::ProcessNextPendingRequest !req");
-        return KErrUnderflow;
-        }
-    //Try to serve the client from here, or do some sgImage specific stuff
-    TInt mode = InterpretRequest( req );
-    switch( mode )
-        {
-        case ENormal:
-            {
-            //Nothing, process as normal
-            break;
-            }
-        case EHandled:
-            {
-            //Already handled, remove and signal complete
-            req->RemoveFromList( &iPendingRequestRoot );
-            Kern::RequestComplete( req->iAsyncClient, req->iStatus, KErrNone );
-            ReleaseRequest( req );
-            return KErrNone;//Change to "err" if you add lines above this that may set it to something else
-            }
-        case EQueued:
-            {
-            //To be removed from the usual queues, but not deleted (released) or completed
-            req->RemoveFromList( &iPendingRequestRoot );
-            return KErrNone;
-            }
-        default:
-            {
-            break;
-            }
-        }
-    
-    if ( TAsyncRequest::ERTCommandLoad == req->iCommandLoadRequest )
-        {
-        VVHW_TRACE("DDeviceReqHandler::HandleLoadCommands");
-        TInt loaderr( KErrNone );
-        TInt len = Kern::ThreadGetDesLength( req->iAsyncClient, req->iA1 );
-
-        if ( len < 0 )
-            {
-            VVHW_TRACE("DDeviceReqHandler::HandleLoadCommands len < 0");
-            return KErrUnderflow;;
-            }
-
-        if ( !iRequestBuffer.CheckForSpace( len ) )
-           {
-           //Not enough space
-           VVHW_TRACE("DDeviceReqHandler::HandleLoadCommands No space");
-           return KErrNoMemory;
-           }
-
-        req->RemoveFromList( &iPendingRequestRoot );
-
-        const TUint32 base( iRequestBuffer.AllocateBytes( len ) );
-
-        //Next, serialize the call to the HW memory
-        const TLinAddr paramAddr( iHwInterface.InputParametersAddress() + base );
-
-        TPtr8 ptr(reinterpret_cast<TUint8*>(paramAddr), 0, len );
-        
-        //Read the RemoveFunctionCall
-        loaderr = Kern::ThreadDesRead( req->iAsyncClient, req->iA1, ptr, 0, 0 );
-        VVHW_TRACE("DDeviceReqHandler::HandleLoadCommands ThreadDesRead %d", loaderr);
-
-        if ( KErrNone == loaderr )
-            {
-            VVHW_TRACE("DDeviceReqHandler::HandleLoadCommands CommitBytes");
-            iRequestBuffer.CommitBytes( base, len );
-            iHwInterface.IssueCommand( VVI_EXECUTE );
-            }
-        Kern::RequestComplete( req->iAsyncClient, req->iStatus, loaderr );
-        ReleaseRequest( req );
-        }
-    else //ERTRequest or ERTDriver
-        {
-#if _DEBUG
-        ListRemoteFunctionCall( req->iRemoteFunctionCall );
-#endif
-       VVHW_TRACE("DDeviceReqHandler::ProcessNextPendingRequest req %u tid %u opcode %u", 
-            req, req->iRemoteFunctionCall.Header().iTransactionId,
-            req->iRemoteFunctionCall.Header().iOpCode );
-        const TUint32 serializedLength( req->iRemoteFunctionCall.SerialisedLength() );
-        if ( !iRequestBuffer.CheckForSpace( serializedLength ) )
-           {
-           //Not enough space
-           VVHW_TRACE("DDeviceReqHandler::ProcessNextPendingRequest No space");
-           return KErrOverflow;
-           }
-    
-        req->RemoveFromList( &iPendingRequestRoot );
-    
-        if ( RemoteFunctionCallData::EOpRequestWithReply == req->iRemoteFunctionCall.Header().iOpType )
-            {
-            VVHW_TRACE("DDeviceReqHandler::ProcessNextPendingRequest 3");
-            iSerializedRequestRoot.AppendToLast( req );
-            }
-        TDataFromClientSpaceCopier datacopier( req->iAsyncClient );
-        SerializedFunctionCall sfc( req->iRemoteFunctionCall );
-        
-        if ( TAsyncRequest::ERTRequest == req->iCommandLoadRequest )
-            {
-            sfc.SetDataCopier( &datacopier );            
-            }
-        
-        const TUint32 base( iRequestBuffer.AllocateBytes( serializedLength ) );
-    
-        //Next, serialize the call to the HW memory
-        const TLinAddr paramAddr( iHwInterface.InputParametersAddress() + base );
-    
-        TInt len = sfc.WriteToBuffer( reinterpret_cast<TUint8*>(paramAddr),
-                VVI_PARAMETERS_INPUT_MEMORY_SIZE - 1 - base );
-        
-        sfc.SetDataCopier( NULL );
-        VVHW_TRACE("DDeviceReqHandler::ProcessNextPendingRequest Write at index %u with length %u", base, len );
-        iRequestBuffer.CommitBytes( base, serializedLength );
-    
-        iHwInterface.IssueCommand( VVI_EXECUTE );
-        
-        if ( RemoteFunctionCallData::EOpRequest == req->iRemoteFunctionCall.Header().iOpType )
-            {
-            if ( TAsyncRequest::ERTRequest == req->iCommandLoadRequest )
-                {
-                VVHW_TRACE("DDeviceReqHandler::ProcessNextPendingRequest RequestComplete");
-                Kern::RequestComplete( req->iAsyncClient, req->iStatus, KErrNone );
-                }
-            ReleaseRequest( req );
-            }
-        }
-    VVHW_TRACE("DDeviceReqHandler::ProcessNextPendingRequest DONE");
-    return err;
-    }
-
-// -----------------------------------------------------------------------------
-// DDeviceReqHandler::HandleLoadCommands
-// -----------------------------------------------------------------------------
-//
-TInt DDeviceReqHandler::HandleLoadCommands(
-        DThread*& aUserThread,
-        TRequestStatus* aStatus,
-        TAny* aA1 )
-    {
-    VVHW_TRACE("DDeviceReqHandler::HandleLoadCommands");
-    TInt err( KErrNone );
-    TAsyncRequest* req = AllocRequest( aStatus, aUserThread, aA1, NULL, TAsyncRequest::ERTCommandLoad );
-    
-    if ( req )
-        {
-        TInt len = Kern::ThreadGetDesLength( req->iAsyncClient, req->iA1 );
-    
-        if ( len < 0 )
-            {
-            err = len;//TODO: this sucks
-            ReleaseRequest( req );
-            return err;
-            }
-            
-        iPendingRequestRoot.AppendToLast( req );
-        TInt ret = ProcessNextPendingRequest();
-        while ( KErrNone == ret )
-            {
-            ret = ProcessNextPendingRequest();
-            }
-        }
-    else
-        {
-        err = KErrNoMemory;
-        }
-
-    return err;
-    }
-
-// -----------------------------------------------------------------------------
-// DDeviceReqHandler::HandleExecuteAsync
-// -----------------------------------------------------------------------------
-//
-TInt DDeviceReqHandler::HandleExecuteAsync(
-        DThread*& aUserThread,
-        TRequestStatus* aStatus,
-        TAny* a1 )
-    {
-    VVHW_TRACE("DDeviceReqHandler::HandleExecuteAsync");
-    TInt err( KErrNone );
-    TAsyncRequest* req = AllocRequest( aStatus, aUserThread, a1, NULL );
-    
-    if ( req )
-        {
-        TInt len = Kern::ThreadGetDesLength( req->iAsyncClient, req->iA1 );
-    
-        if ( len < 0 )
-            {
-            err = len;
-            ReleaseRequest( req );
-            return err;
-            }
-    
-        TPckg<RemoteFunctionCallData> rcallbuf( req->iRemoteFunctionCall );
-        
-        //Read the RemoteFunctionCall
-        err = Kern::ThreadDesRead( req->iAsyncClient, req->iA1, rcallbuf, 0, 0 );
-
-        if ( KErrNone != err )
-            {
-            ReleaseRequest( req );
-            return err;
-            }
-        
-        req->iRemoteFunctionCall.SetTransactionId( ++iTransactionId );
-
-        iPendingRequestRoot.AppendToLast( req );
-        TInt ret = ProcessNextPendingRequest();
-        while ( KErrNone == ret )
-            {
-            ret = ProcessNextPendingRequest();
-            }
-        }
-    else
-        {
-        err = KErrNoMemory;
-        }
-    VVHW_TRACE("DDeviceReqHandler::HandleExecuteAsync <-");
-    return err;
-    }
-
-// -----------------------------------------------------------------------------
-// DDeviceReqHandler::ProcessDfc
-// -----------------------------------------------------------------------------
-//
-void DDeviceReqHandler::ProcessDfc()
-    {
-    VVHW_TRACE("DDeviceReqHandler::ProcessDfc");
-    TUint32 error( 0 );
-    iHwInterface.GetRegisterValue( DVirtualVideoHwInterface::ERegError, error );
-
-    TUint32 transactionId;
-    iHwInterface.GetRegisterValue( DVirtualVideoHwInterface::ERegRequestId, transactionId );
-
-    TAsyncRequest* req = iSerializedRequestRoot.iNext;
-    VVHW_TRACE( "DDeviceReqHandler::ProcessDfc req %u transactionid %u", req, transactionId );
-    
-
-    if ( req && transactionId == req->iRemoteFunctionCall.Header().iTransactionId )
-        {
-        req->RemoveFromList( &iSerializedRequestRoot );
-        
-        //Check if the request was scheduler-initiated
-        TBool driverInitiated(EFalse);
-        if( iSchedulerInitiatedTransactionIds.Count() > 0 )
-            {
-            for( int i=0;i<iSchedulerInitiatedTransactionIds.Count();++i )
-                {
-                if( iSchedulerInitiatedTransactionIds[i].iTransactionId == req->iRemoteFunctionCall.Header().iTransactionId )
-                    {
-                driverInitiated = ETrue;
-                    //This will be used in the "consume" function later on in many cases
-                    iSchedulerInitiatedTransactionData = iSchedulerInitiatedTransactionIds[i].iTransactionData; 
-                    iSchedulerInitiatedTransactionIds.Remove( i );
-                    break;
-                    }
-                }
-            }
-        
-        if( driverInitiated )
-            {
-            //This branch is for the purpose of handling commands that have been initiated from (this) 
-            //Command Scheduler, and not a client thread. So far no cases exists, where this would
-            //imply notifying a (client) DLL, so RequestComplete does not have to be called here (this could change later).
-            //Parse result and write vectors back to client space
-            if ( 0 == error )
-                {
-                //Parse result and write vectors back to client space        
-                TDataToClientSpaceCopier datacopier2( req->iAsyncClient );
-                RemoteFunctionCallData rfc;
-                SerializedFunctionCall sfc( rfc );
-                sfc.SetDataCopier( &datacopier2 );
-                const TLinAddr paramAddr( iHwInterface.OutputParametersAddress() );
-                VVHW_TRACE("DDeviceReqHandler::ProcessDfc parse");
-                sfc.ParseBuffer( reinterpret_cast<TUint8*>( paramAddr ), VVI_PARAMETERS_OUTPUT_MEMORY_SIZE );
-                TPckg<RemoteFunctionCallData> resultbuf( rfc );
-                req->iRemoteFunctionCall = resultbuf();//Get the object; its in the same address space 
-                VVHW_TRACE("DDeviceReqHandler::ProcessDfc ThreadDesWrite err=%d (data len=%d)", error, resultbuf.Length());
-                sfc.SetDataCopier( NULL );
-                }
-
-            error = ResetAndEnableInterrupt( DVirtualVideoHwInterface::EInterruptNewDataAvailable );
-            ConsumeSchedulerInitiatedRequestResult( req );
-            }
-        else
-            {
-			TInt desWriteError = KErrNone;
-            if ( 0 == error )
-                {
-                //Parse result and write vectors back to client space
-				// TODO for performance only write back result & output vectors, not whole request buffer
-                TDataToClientSpaceCopier datacopier2( req->iAsyncClient );
-                RemoteFunctionCallData rfc;
-                SerializedFunctionCall sfc( rfc );
-                sfc.SetDataCopier( &datacopier2 );
-                const TLinAddr paramAddr( iHwInterface.OutputParametersAddress() );
-                VVHW_TRACE("DDeviceReqHandler::ProcessDfc parse");
-                sfc.ParseBuffer( reinterpret_cast<TUint8*>( paramAddr ), VVI_PARAMETERS_OUTPUT_MEMORY_SIZE );
-                TPckg<RemoteFunctionCallData> resultbuf( rfc );
-                desWriteError = Kern::ThreadDesWrite( req->iAsyncClient, req->iA1, resultbuf, 0, 0 );
-                VVHW_TRACE("DDeviceReqHandler::ProcessDfc ThreadDesWrite err=%d (data len=%d)",desWriteError, resultbuf.Length());
-                sfc.SetDataCopier( NULL );
-                }
-
-            Kern::RequestComplete( req->iAsyncClient, req->iStatus, desWriteError );
-            ResetAndEnableInterrupt( DVirtualVideoHwInterface::EInterruptNewDataAvailable );
-            ReleaseRequest( req );
-            }
-        }
-    else
-        {
-        ResetAndEnableInterrupt( DVirtualVideoHwInterface::EInterruptNewDataAvailable );
-        }
-    VVHW_TRACE("DDeviceReqHandler::ProcessDfc ProcessNextPendingRequest");
-    
-    TInt ret = ProcessNextPendingRequest();
-    while ( KErrNone == ret )
-        {
-        ret = ProcessNextPendingRequest();
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// DDeviceReqHandler::AllocRequest
-// -----------------------------------------------------------------------------
-//
-DDeviceReqHandler::TAsyncRequest* DDeviceReqHandler::AllocRequest( TRequestStatus* aStatus,
-        DThread* aAsyncClient,
-        TAny* aA1,
-        TAny* aA2,
-        DDeviceReqHandler::TAsyncRequest::TRequestType aRequestType )
-    {
-    TAsyncRequest* req( NULL );
-    if ( iFreeCount )
-        {
-        req = iFreeListRoot.iNext;
-        req->RemoveFromList( &iFreeListRoot );
-        req->Init( aStatus, aAsyncClient, aA1, aA2, aRequestType );
-        iFreeCount--;
-        }
-    else
-        {
-        VVHW_TRACE("DDeviceReqHandler::AllocRequest new");
-        req = new TAsyncRequest( aStatus, aAsyncClient, aA1, aA2, aRequestType );
-        }
-    return req;
-    }
-
-// -----------------------------------------------------------------------------
-// DDeviceReqHandler::ReleaseRequest
-// -----------------------------------------------------------------------------
-//
-void DDeviceReqHandler::ReleaseRequest( DDeviceReqHandler::TAsyncRequest* aReq )
-    {
-    if ( iFreeCount > KMaxFreeRequests )
-        {
-        VVHW_TRACE("DDeviceReqHandler::AllocRequest delete");
-        delete aReq;
-        }
-    else
-        {
-        aReq->AppendToList( &iFreeListRoot );
-        iFreeCount++;
-        }
-    }
-
-
-
-void DDeviceReqHandler::RemoveClientData( const TUint32 aProcId, const TUint32 aThreadId )
-    {
-    VVHW_TRACE("DDeviceReqHandler::RemoveClientData (%d/%d)", aProcId, aThreadId );
-    TPerThreadData* data( NULL );
-    for( TInt i=0; i < iClientData.Count(); ++i )
-        {
-        if( iClientData[i]->sameThread( aProcId, aThreadId ) )
-            {
-            data = iClientData[i];
-            iClientData.Remove(i);
-            if( data == iCurrClientData )
-                {
-                iCurrClientData = 0;
-                }
-            delete data;
-            break;
-            }
-        }
-    }
-
-TBool DDeviceReqHandler::InitiateRequestWithReply( TAsyncRequest* aRec, TAny* aTransactionData )
-    {
-    VVHW_TRACE("DDeviceReqHandler::InitiateRequestWithReply" );
-    if( iDriverRfcThreadId == 0 || iDriverRfcProcessId == 0 )
-        {
-        iDriverRfcProcessId = Kern::CurrentProcess().iId;
-        iDriverRfcThreadId  = Kern::CurrentThread().iId;
-        }
-    //iReqIssueMutex.Wait();
-    const TUint32 serializedLength( aRec->iRemoteFunctionCall.SerialisedLength() );
-    if ( !iRequestBuffer.CheckForSpace( serializedLength ) )
-       {
-       return EFalse;
-       }
-    ++iTransactionId;
-    aRec->iRemoteFunctionCall.SetTransactionId( iTransactionId );
-    aRec->iRemoteFunctionCall.SetOperationType( RemoteFunctionCallData::EOpRequestWithReply );
-    aRec->iAsyncClient = &(Kern::CurrentThread());
-    aRec->iRemoteFunctionCall.SetThreadInformation( iDriverRfcProcessId, iDriverRfcThreadId );
-    
-    iSchedulerInitiatedTransactionIds.Append( TTransactionInfo( iTransactionId, aTransactionData ) );
-    VVHW_TRACE("DDeviceReqHandler::InitiateRequestWithReply ids len=%d transaction id = %u proc/thread = %u / %u api/op = %0x / %0x", iSchedulerInitiatedTransactionIds.Count(), iTransactionId, Kern::CurrentProcess().iId, Kern::CurrentThread().iId, aRec->iRemoteFunctionCall.Header().iApiUid, aRec->iRemoteFunctionCall.Header().iOpCode );
-    if( aRec->iRemoteFunctionCall.Header().iApiUid )
-        {
-        VVHW_TRACE("DDeviceReqHandler::InitiateRequestWithReply request's api is SERIALISED_DRIVER_API_UID" );
-        }
-    
-    iSerializedRequestRoot.AppendToLast( aRec );//we need the result, so add to the dfc handled requests
-    TDataFromClientSpaceCopier datacopier( aRec->iAsyncClient );
-    SerializedFunctionCall sfc( aRec->iRemoteFunctionCall );
-    
-    sfc.SetDataCopier( &datacopier );//We know this is a "request" (precondition)
-    const TUint32 base( iRequestBuffer.AllocateBytes( serializedLength ) );
-    //Next, serialize the call to the HW memory
-    const TLinAddr paramAddr( iHwInterface.InputParametersAddress() + base );
-    TInt len = sfc.WriteToBuffer( reinterpret_cast<TUint8*>(paramAddr), VVI_PARAMETERS_INPUT_MEMORY_SIZE - 1 - base );
-    VVHW_TRACE("DDeviceReqHandler::InitiateRequestWithReply len = %d", len);
-    sfc.SetDataCopier( NULL );
-    iRequestBuffer.CommitBytes( base, serializedLength );
-    iHwInterface.IssueCommand( VVI_EXECUTE );
-    VVHW_TRACE("DDeviceReqHandler::InitiateRequestWithReply issued");
-    return ETrue;
-    }
-
-/**
- * This routine adds extra info about the sgImage's pbuffer handle for syncing,
- * when that is required. 
- * 1. checks the sgImage handle, and if it's not NULL, then
- *  2. Get the sgImage's metadata
- *  3. Check if the vgImage is "dirty", and if yes,
- *      then append the pbuffer handle as a parameter to the call   
- *  4. Set the pbuffer "dirty", if aSetBufferDirty is ETrue
- */
-
-void DDeviceReqHandler::getVGSyncInOp( TAsyncRequest* aReq, TInt aSgHandleIndexInReq, TBool aSetBufferDirty )
-    {    
-    VVHW_TRACE( "DDeviceReqHandler::getVGSyncInOp" );
-    EGLSurface surface( EGL_NO_SURFACE );//The pbuffer surface to sync from, if needed
-    VGboolean syncNeeded = VG_FALSE;
-    OpenVgRFC call( aReq->iRemoteFunctionCall );
-    TUint64 sgId(NULL);
-    
-    if( call.Data().Header().iParameterCount > aSgHandleIndexInReq )
-        {
-        call.GetTUint64( sgId, aSgHandleIndexInReq );
-        }
-    else
-        {
-        return;//No sgImage handle appended on the client side, just exit
-        }
-    
-    if( sgId != NULL )
-        {
-        VVHW_TRACE( "DDeviceReqHandler::getVGSyncInOp SgImage-backing VGImage found" );
-        DSgResource* resource;
-        HBuf8* data = OpenSgImageMetaData( sgId, resource );
-        if( data )
-            {
-            TSgImageMetaData sginfo (((TPckgBuf<TSgImageMetaData>*) data)->operator ()());
-            
-            if( !sginfo.iVGImageClean )
-                {
-                //set the sync bit as clean now.
-                sginfo.iVGImageClean = ETrue;
-                //Additional info for the host side to use
-                syncNeeded = VG_TRUE;
-                surface = sginfo.iPbufferHandle;
-                }
-            if( aSetBufferDirty )
-                {
-                sginfo.iPbufferClean = EFalse;
-                }
-            resource->SetMetaData( *data );
-            delete data;//delete the copy of the metadata descriptor
-            }
-        }
-    if( syncNeeded )
-        {
-        call.AppendParam ( (int)surface );
-        }
-    }
-
-
-void DDeviceReqHandler::ConsumeSchedulerInitiatedRequestResult( TAsyncRequest* aReq )
-    {
-    const TUint32 proc_id( aReq->iRemoteFunctionCall.Header().iProcessId );
-    const TUint32 thread_id( aReq->iRemoteFunctionCall.Header().iThreadId );
-    const TUint32 apicode( aReq->iRemoteFunctionCall.Header().iApiUid );
-    const TUint32 opcode( aReq->iRemoteFunctionCall.Header().iOpCode );
-    VVHW_TRACE( "DDeviceReqHandler::ConsumeSchedulerInitiatedRequestResult: process/thread id : %d / %d", Kern::CurrentProcess().iId, Kern::CurrentThread().iId );
-    VVHW_TRACE( "DDeviceReqHandler::ConsumeSchedulerInitiatedRequestResult: process/thread id : %d / %d API/opcode = %0x/%0x", proc_id, thread_id, apicode, opcode );
-    TPerThreadData* data(0);
-    for( TInt i=0; i < iClientData.Count(); ++i )
-        {
-        if( iClientData[i]->sameThread( proc_id, thread_id ))
-            {
-            data = iClientData[i];
-            break;
-            }
-        }
-    
-    switch ( apicode )
-        {
-        case SERIALISED_DRIVER_API_UID:
-            {
-            switch( opcode )
-                {
-                case DriverRFC::EDrvCreatePbufferSg:
-                    {
-                    VVHW_TRACE( "DDeviceReqHandler::ConsumeSchedulerInitiatedRequestResult : EDrvCreatePbufferSg" );
-                    if( iSchedulerInitiatedTransactionData )
-                        {
-                        ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iPbufferHandle = aReq->iRemoteFunctionCall.Header().iReturnValue;
-                        VVHW_TRACE( "DDeviceReqHandler::ConsumeSchedulerInitiatedRequestResult pbuffer=%u", ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iPbufferHandle );
-                        }
-                    TPbSId obj ( ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iPbufferHandle,
-                                 ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iSgId );
-                    iPbufferSgMap.InsertInOrder( obj, iPbufferSgMapOrder );
-                    VVHW_TRACE( "pbuffer creation RequestComplete. Inserted (%u, %u) into sg map. Notify thread %u, request status %u",
-                                                                    ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iPbufferHandle,
-                                                                    ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iSgId,
-                                                                    aReq->iAsyncClient,
-                                                                    aReq->iStatus );
-                    *(aReq->iStatus) = 0;//REquestComplete doesn't work
-                    VVHW_TRACE( "Pbuffer creation RequestComplete" );
-                    break;
-                    }
-                case DriverRFC::EDrvCreateVGImageSg:
-                    {
-                    VVHW_TRACE( "DDeviceReqHandler::ConsumeSchedulerInitiatedRequestResult : EDrvCreateVGImageSg" );
-                    if( iSchedulerInitiatedTransactionData )
-                        {
-                        ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iVGImageHandle = aReq->iRemoteFunctionCall.Header().iReturnValue;
-                        }
-                    TVGISId obj ( ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iVGImageHandle,
-                                 ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iSgId );
-                    iVGImageSgMap.InsertInOrder( obj, iVGImageSgMapOrder );
-                    VVHW_TRACE( "pbuffer creation RequestComplete. Inserted (%u, %u) into sg map. Notify thread %u, request status %u",
-                               ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iVGImageHandle,
-                               ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iSgId,
-                               aReq->iAsyncClient,
-                               aReq->iStatus );
-                    *(aReq->iStatus) = 0;//REquestComplete doesn't work
-                    VVHW_TRACE( "VGImage creation RequestComplete" );
-                    break;
-                    }
-                case DriverRFC::EDrvDeleteSgImage:
-                    {
-                    *(aReq->iStatus) = 0;
-                    }
-                case DriverRFC::EDrvSyncVGImageFromPBuffer:
-                    {
-                    ((TAsyncRequest*)iSchedulerInitiatedTransactionData)->AppendToList( (TAsyncRequest*)(&iPendingRequestRoot) );
-                    break;
-                    }
-                default:
-                    {
-                    break;
-                    }
-                }
-            }
-        case SERIALISED_OPENVG_API_UID:
-            {
-            switch( opcode )
-                {
-                case OpenVgRFC::EvgGetError:
-                    {
-                    VVHW_TRACE("OpenVgRFC::EvgGetError");
-                    data->iErrorVG = aReq->iRemoteFunctionCall.Header().iReturnValue;
-                    data->iErrUpdatedVG = EFalse;//TODO: ETrue
-                    break;
-                    }
-                default:{break;}
-                }
-            break;
-            }
-        case SERIALISED_EGL_API_UID:
-            {
-            switch( opcode )
-                {
-                case EglRFC::EeglGetError:
-                    {
-                    VVHW_TRACE("EglRFC::EeglGetError");
-                    data->iErrorEGL = aReq->iRemoteFunctionCall.Header().iReturnValue;
-                    data->iErrUpdatedEGL = EFalse;//TODO: ETrue
-                    break;
-                    }
-                default:
-                    {break;}
-                }
-            break;
-            }
-        case SERIALISED_OPENGLES_1_1_API_UID:
-            {
-            switch( opcode )
-                {
-                case OpenGlES11RFC::EglGetError:
-                    {
-                    VVHW_TRACE("OpenGlES11RFC::EglGetError");
-                    data->iErrorGLES = aReq->iRemoteFunctionCall.Header().iReturnValue;
-                    data->iErrUpdatedGLES = EFalse;//TODO: ETrue
-                    }
-                default:{break;}
-                }
-            break;
-            }
-        default:{break;}
-        }
-
-    VVHW_TRACE( "DDeviceReqHandler::ConsumeSchedulerInitiatedRequestResult return value: %d", aReq->iRemoteFunctionCall.Header().iReturnValue );
-    if( data )
-        {
-        VVHW_TRACE("errors EGL/VG/GLES=%0x/%0x/%0x", data->iErrorEGL, data->iErrorVG, data->iErrorGLES );
-        }
-    //Delete the request object, as it is no longer needed
-    aReq->iStatus = 0;
-    aReq->iAsyncClient = 0;
-    delete aReq;
-    VVHW_TRACE("DDeviceReqHandle::ConsumeSchedulerInitiatedRequestResult done.");
-    }
-
-/**
- * DDeviceReqHandler::CreateSgImagePbuffer
+/*
+ * =============================================================================
+ *  Name        : devicereqhandler.cpp
+ *  Part of     : 
+ *  Description : Implementation of the class DDeviceReqHandler.
+ *  Version     : %version:6 %
+ *
+ *  Copyright © 2008-2010 Nokia. All rights reserved.
+ *  This material, including documentation and any related
+ *  computer programs, is protected by copyright controlled by
+ *  Nokia. All rights are reserved. Copying, including
+ *  reproducing, storing, adapting or translating, any
+ *  or all of this material requires the prior written consent of
+ *  Nokia. This material also contains confidential
+ *  information which may not be disclosed to others without the
+ *  prior written consent of Nokia.
+ * =============================================================================
+ */
+
+
+// INCLUDE FILES
+#include <platform.h>
+#include <assp.h>
+#include <kernel/kernel.h>
+#include <e32cmn.h>
+
+#include <graphics/devicereqhandler.h>
+#include <graphics/virtualvideohwinterface.h>
+#include <graphics/virtualvideotracing.h>
+
+#include "remotefunctioncall.h"
+#include "serializedfunctioncall.h"
+#include "driverrfc.h"
+#include "openvgrfc.h" //For the opcodes
+#include "eglrfc.h" //For the opcodes
+#include "opengles11rfc.h" //For the opcodes
+
+
+using namespace GuestVideoDriver;
+
+// LOCAL DATA TYPES
+TInt CmpTPbsIds(const TPbSId& a, const TPbSId& b)
+    {
+    if( a.iPbuffer == b.iPbuffer )
+        return 0;
+    else
+        return b.iPbuffer - a.iPbuffer;
+    }
+
+TInt CmpTVGIsIds(const TVGISId& a, const TVGISId& b)
+    {
+    if( a.iVGImage == b.iVGImage )
+        return 0;
+    else
+        return b.iVGImage - a.iVGImage;
+    }
+/*
+ * Copies data from client space to the request buffer during serialisation
+ */
+class TDataFromClientSpaceCopier: public MDataCopier
+    {
+public:
+    TDataFromClientSpaceCopier( DThread* aUserThread ):
+        iUserThread(aUserThread)
+        {
+        }
+    
+    TInt CopyData( TUint8* aDest, const TUint8* aSource, TUint32 aSize )
+        {
+        memcpy( aDest, aSource, aSize );
+        return KErrNone;
+        }
+    
+    TInt CopyVector( TUint8* aDest, const TUint8* aSource, TUint32 aSize )
+        {
+        return Kern::ThreadRawRead( iUserThread, aSource, aDest, aSize );
+        }
+
+    DThread* iUserThread;
+    };
+
+/*
+ * Copies data to client space from the request buffer during deserialisation
+ */
+class TDataToClientSpaceCopier: public MDataCopier
+    {
+public:
+    TDataToClientSpaceCopier( DThread* aUserThread ):
+        iUserThread(aUserThread)
+        {
+        }
+    
+    TInt CopyData( TUint8* aDest, const TUint8* aSource, TUint32 aSize )
+        {
+        memcpy( aDest, aSource, aSize );
+        return KErrNone;
+        }
+    
+    TInt CopyVector( TUint8* aDest, const TUint8* aSource, TUint32 aSize )
+        {
+        return Kern::ThreadRawWrite(iUserThread, aDest, aSource, aSize );
+        }
+
+    DThread* iUserThread;
+    };
+
+// LOCAL FUNCTION DEFINITIONS
+
+// -----------------------------------------------------------------------------
+// ListRemoteFunctionCall
+// -----------------------------------------------------------------------------
+//
+inline void ListRemoteFunctionCall(RemoteFunctionCallData& call)
+    {
+#if _DEBUG
+    VVHW_TRACE("RFC: %u %u %u %u %u %u %u",
+    call.Header().iOpCode,
+    call.Header().iTransactionId,
+    call.Header().iProcessId,
+    call.Header().iThreadId,
+    call.Header().iParameterCount,
+    call.Header().iOpType,
+    call.Header().iReturnValue);
+    
+    for ( TInt i = 0; i < call.Header().iParameterCount; i++)
+        {
+        RemoteFunctionCallData::TParam param = call.Parameters()[i];
+
+        TUint32 dir = param.iDir;
+        TUint32 type = param.iType;
+
+        
+        if ( RemoteFunctionCallData::TParam::ESimple == param.iType )
+            {
+            TUint32 datatype = param.iSimpleParam.iDataType; 
+            VVHW_TRACE("RFC Simple Param %d: %u %u %u",i, dir, type, datatype );
+            }
+        else if ( RemoteFunctionCallData::TParam::EVector == param.iType )
+            {
+            TUint32 datatype = param.iVectorParam.iDataType; 
+            TUint32 size = param.iVectorParam.iVectorLength;
+            VVHW_TRACE("RFC Vec Param %d: %u %u %u %u",i, dir, type, datatype, size );
+            }
+        }
+#endif // _DEBUG
+    }
+
+
+// CONSTANTS
+const TInt KDfcPriority = 1;
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// Isr
+// Interrupt service routine
+// -----------------------------------------------------------------------------
+//
+void Isr( TAny* aParam )
+    {
+    DDeviceReqHandler* handler = ( DDeviceReqHandler* )aParam;
+    Interrupt::Disable( handler->InterruptId() );
+    handler->Dfc().Add();
+    }
+
+// -----------------------------------------------------------------------------
+// DfcFunc
+// Function to call when HW has an interrupt
+// -----------------------------------------------------------------------------
+//
+void DfcFunc( TAny* aParam )
+    {
+    DDeviceReqHandler* handler = ( DDeviceReqHandler* )aParam;
+    handler->ProcessDfc();
+    }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// DDeviceReqHandler::DDeviceReqHandler
+// -----------------------------------------------------------------------------
+//
+DDeviceReqHandler::DDeviceReqHandler(
+    DVirtualVideoHwInterface& aHwInterface,
+    TDfcQue* aQueue) :
+    iPbufferSgMapOrder ( &CmpTPbsIds ),
+    iVGImageSgMapOrder ( &CmpTVGIsIds ),
+    iCurrClientData(NULL),
+    iInitialized(EFalse),
+    iHwInterface( aHwInterface ),
+    iDfc( DfcFunc, (TAny*)this, aQueue, KDfcPriority ),
+    iInterruptId( 0 ),
+    iTransactionId( 1 ),
+    iRequestBuffer( *this, VVI_PARAMETERS_INPUT_MEMORY_SIZE )
+    {
+    iDriverRfcProcessId = 0;
+    iDriverRfcThreadId  = 0;
+    iOpType       = 0; 
+    iOpChainPhase = 0;
+    iInterruptId  = VVI_IRQ;
+    VVHW_TRACE( "DDeviceReqHandler constructor" );
+    VVHW_TRACE( "Called in process/thread %0x / %0x", Kern::CurrentProcess().iId, Kern::CurrentThread().iId );
+    TInt err = Interrupt::Bind( iInterruptId, Isr, ( TAny* )this );
+    if ( err != KErrNone )
+        {
+        VVHW_TRACE( "Interrupt::Bind Error: %d", err );
+        }
+    err = Interrupt::Enable( iInterruptId );
+    if ( err != KErrNone )
+        {
+        Interrupt::Unbind( iInterruptId );
+        iInterruptId = 0;
+        VVHW_TRACE( "Interrupt::Enable Error: %d", err );
+        }
+    iRequestBuffer.InitBuffer();
+    //Register this object with the extension
+    VVHW_TRACE( "DDeviceReqHandler calling ReqHandlerExtension" );
+    ReqHandlerExtension::SetReqHandler( this );
+    }
+
+// -----------------------------------------------------------------------------
+// DDeviceReqHandler::~DDeviceReqHandler
+// -----------------------------------------------------------------------------
+//
+DDeviceReqHandler::~DDeviceReqHandler()
+    {
+    for( TInt i=0; i < iClientData.Count(); ++i )
+        {
+        delete iClientData[i];
+        }
+    iClientData.Close();
+    Interrupt::Disable( iInterruptId );
+    Interrupt::Unbind( iInterruptId );
+    iInterruptId = 0;
+    }
+
+// -----------------------------------------------------------------------------
+// DDeviceReqHandler::HandleClientShutdown
+// -----------------------------------------------------------------------------
+//
+TInt DDeviceReqHandler::HandleClientShutdown( TUint aProcessId, TUint aThreadId )
+    {
+    VVHW_TRACE("DDeviceReqHandler::HandleClientShutdown");
+    TInt err( KErrNone );
+    TAsyncRequest* req = AllocRequest( NULL, NULL, NULL, NULL, TAsyncRequest::ERTDriver );
+    
+    if ( req )
+        {
+        DriverRFC drfc( req->iRemoteFunctionCall );
+        drfc.Init( DriverRFC::EDrvClientShutdown, RemoteFunctionCallData::EOpRequest );        
+        req->iRemoteFunctionCall.SetTransactionId( ++iTransactionId );
+        req->iRemoteFunctionCall.SetThreadInformation( aProcessId, aThreadId );        
+        iPendingRequestRoot.AppendToLast( req );
+        TInt ret = ProcessNextPendingRequest();
+        while ( KErrNone == ret )
+            {
+            ret = ProcessNextPendingRequest();
+            }
+        }
+    else
+        {
+        err = KErrNoMemory;
+        }
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// DDeviceReqHandler::ProcessNextPendingRequest
+// -----------------------------------------------------------------------------
+//
+TInt DDeviceReqHandler::ProcessNextPendingRequest()
+    {
+    VVHW_TRACE("DDeviceReqHandler::ProcessNextPendingRequest");
+    TInt err( KErrNone );
+    TAsyncRequest* req = iPendingRequestRoot.iNext;
+    if ( !req )
+        {
+        VVHW_TRACE("DDeviceReqHandler::ProcessNextPendingRequest !req");
+        return KErrUnderflow;
+        }
+    //Try to serve the client from here, or do some sgImage specific stuff
+    TInt mode = InterpretRequest( req );
+    switch( mode )
+        {
+        case ENormal:
+            {
+            //Nothing, process as normal
+            break;
+            }
+        case EHandled:
+            {
+            //Already handled, remove and signal complete
+            req->RemoveFromList( &iPendingRequestRoot );
+            Kern::RequestComplete( req->iAsyncClient, req->iStatus, KErrNone );
+            ReleaseRequest( req );
+            return KErrNone;//Change to "err" if you add lines above this that may set it to something else
+            }
+        case EQueued:
+            {
+            //To be removed from the usual queues, but not deleted (released) or completed
+            req->RemoveFromList( &iPendingRequestRoot );
+            return KErrNone;
+            }
+        default:
+            {
+            break;
+            }
+        }
+    
+    if ( TAsyncRequest::ERTCommandLoad == req->iCommandLoadRequest )
+        {
+        VVHW_TRACE("DDeviceReqHandler::HandleLoadCommands");
+        TInt loaderr( KErrNone );
+        TInt len = Kern::ThreadGetDesLength( req->iAsyncClient, req->iA1 );
+
+        if ( len < 0 )
+            {
+            VVHW_TRACE("DDeviceReqHandler::HandleLoadCommands len < 0");
+            return KErrUnderflow;;
+            }
+
+        if ( !iRequestBuffer.CheckForSpace( len ) )
+           {
+           //Not enough space
+           VVHW_TRACE("DDeviceReqHandler::HandleLoadCommands No space");
+           return KErrNoMemory;
+           }
+
+        req->RemoveFromList( &iPendingRequestRoot );
+
+        const TUint32 base( iRequestBuffer.AllocateBytes( len ) );
+
+        //Next, serialize the call to the HW memory
+        const TLinAddr paramAddr( iHwInterface.InputParametersAddress() + base );
+
+        TPtr8 ptr(reinterpret_cast<TUint8*>(paramAddr), 0, len );
+        
+        //Read the RemoveFunctionCall
+        loaderr = Kern::ThreadDesRead( req->iAsyncClient, req->iA1, ptr, 0, 0 );
+        VVHW_TRACE("DDeviceReqHandler::HandleLoadCommands ThreadDesRead %d", loaderr);
+
+        if ( KErrNone == loaderr )
+            {
+            VVHW_TRACE("DDeviceReqHandler::HandleLoadCommands CommitBytes");
+            iRequestBuffer.CommitBytes( base, len );
+            iHwInterface.IssueCommand( VVI_EXECUTE );
+            }
+        Kern::RequestComplete( req->iAsyncClient, req->iStatus, loaderr );
+        ReleaseRequest( req );
+        }
+    else //ERTRequest or ERTDriver
+        {
+#if _DEBUG
+        ListRemoteFunctionCall( req->iRemoteFunctionCall );
+#endif
+       VVHW_TRACE("DDeviceReqHandler::ProcessNextPendingRequest req %u tid %u opcode %u", 
+            req, req->iRemoteFunctionCall.Header().iTransactionId,
+            req->iRemoteFunctionCall.Header().iOpCode );
+        const TUint32 serializedLength( req->iRemoteFunctionCall.SerialisedLength() );
+        if ( !iRequestBuffer.CheckForSpace( serializedLength ) )
+           {
+           //Not enough space
+           VVHW_TRACE("DDeviceReqHandler::ProcessNextPendingRequest No space");
+           return KErrOverflow;
+           }
+    
+        req->RemoveFromList( &iPendingRequestRoot );
+    
+        if ( RemoteFunctionCallData::EOpRequestWithReply == req->iRemoteFunctionCall.Header().iOpType )
+            {
+            VVHW_TRACE("DDeviceReqHandler::ProcessNextPendingRequest 3");
+            iSerializedRequestRoot.AppendToLast( req );
+            }
+        TDataFromClientSpaceCopier datacopier( req->iAsyncClient );
+        SerializedFunctionCall sfc( req->iRemoteFunctionCall );
+        
+        if ( TAsyncRequest::ERTRequest == req->iCommandLoadRequest )
+            {
+            sfc.SetDataCopier( &datacopier );            
+            }
+        
+        const TUint32 base( iRequestBuffer.AllocateBytes( serializedLength ) );
+    
+        //Next, serialize the call to the HW memory
+        const TLinAddr paramAddr( iHwInterface.InputParametersAddress() + base );
+    
+        TInt len = sfc.WriteToBuffer( reinterpret_cast<TUint8*>(paramAddr),
+                VVI_PARAMETERS_INPUT_MEMORY_SIZE - 1 - base );
+        
+        sfc.SetDataCopier( NULL );
+        VVHW_TRACE("DDeviceReqHandler::ProcessNextPendingRequest Write at index %u with length %u", base, len );
+        iRequestBuffer.CommitBytes( base, serializedLength );
+    
+        iHwInterface.IssueCommand( VVI_EXECUTE );
+        
+        if ( RemoteFunctionCallData::EOpRequest == req->iRemoteFunctionCall.Header().iOpType )
+            {
+            if ( TAsyncRequest::ERTRequest == req->iCommandLoadRequest )
+                {
+                VVHW_TRACE("DDeviceReqHandler::ProcessNextPendingRequest RequestComplete");
+                Kern::RequestComplete( req->iAsyncClient, req->iStatus, KErrNone );
+                }
+            ReleaseRequest( req );
+            }
+        }
+    VVHW_TRACE("DDeviceReqHandler::ProcessNextPendingRequest DONE");
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// DDeviceReqHandler::HandleLoadCommands
+// -----------------------------------------------------------------------------
+//
+TInt DDeviceReqHandler::HandleLoadCommands(
+        DThread*& aUserThread,
+        TRequestStatus* aStatus,
+        TAny* aA1 )
+    {
+    VVHW_TRACE("DDeviceReqHandler::HandleLoadCommands");
+    TInt err( KErrNone );
+    TAsyncRequest* req = AllocRequest( aStatus, aUserThread, aA1, NULL, TAsyncRequest::ERTCommandLoad );
+    
+    if ( req )
+        {
+        TInt len = Kern::ThreadGetDesLength( req->iAsyncClient, req->iA1 );
+    
+        if ( len < 0 )
+            {
+            err = len;//TODO: this sucks
+            ReleaseRequest( req );
+            return err;
+            }
+            
+        iPendingRequestRoot.AppendToLast( req );
+        TInt ret = ProcessNextPendingRequest();
+        while ( KErrNone == ret )
+            {
+            ret = ProcessNextPendingRequest();
+            }
+        }
+    else
+        {
+        err = KErrNoMemory;
+        }
+
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// DDeviceReqHandler::HandleExecuteAsync
+// -----------------------------------------------------------------------------
+//
+TInt DDeviceReqHandler::HandleExecuteAsync(
+        DThread*& aUserThread,
+        TRequestStatus* aStatus,
+        TAny* a1 )
+    {
+    VVHW_TRACE("DDeviceReqHandler::HandleExecuteAsync");
+    TInt err( KErrNone );
+    TAsyncRequest* req = AllocRequest( aStatus, aUserThread, a1, NULL );
+    
+    if ( req )
+        {
+        TInt len = Kern::ThreadGetDesLength( req->iAsyncClient, req->iA1 );
+    
+        if ( len < 0 )
+            {
+            err = len;
+            ReleaseRequest( req );
+            return err;
+            }
+    
+        TPckg<RemoteFunctionCallData> rcallbuf( req->iRemoteFunctionCall );
+        
+        //Read the RemoteFunctionCall
+        err = Kern::ThreadDesRead( req->iAsyncClient, req->iA1, rcallbuf, 0, 0 );
+
+        if ( KErrNone != err )
+            {
+            ReleaseRequest( req );
+            return err;
+            }
+        
+        req->iRemoteFunctionCall.SetTransactionId( ++iTransactionId );
+
+        iPendingRequestRoot.AppendToLast( req );
+        TInt ret = ProcessNextPendingRequest();
+        while ( KErrNone == ret )
+            {
+            ret = ProcessNextPendingRequest();
+            }
+        }
+    else
+        {
+        err = KErrNoMemory;
+        }
+    VVHW_TRACE("DDeviceReqHandler::HandleExecuteAsync <-");
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// DDeviceReqHandler::ProcessDfc
+// -----------------------------------------------------------------------------
+//
+void DDeviceReqHandler::ProcessDfc()
+    {
+    VVHW_TRACE("DDeviceReqHandler::ProcessDfc");
+    TUint32 error( 0 );
+    iHwInterface.GetRegisterValue( DVirtualVideoHwInterface::ERegError, error );
+
+    TUint32 transactionId;
+    iHwInterface.GetRegisterValue( DVirtualVideoHwInterface::ERegRequestId, transactionId );
+
+    TAsyncRequest* req = iSerializedRequestRoot.iNext;
+    VVHW_TRACE( "DDeviceReqHandler::ProcessDfc req %u transactionid %u", req, transactionId );
+    
+
+    if ( req && transactionId == req->iRemoteFunctionCall.Header().iTransactionId )
+        {
+        req->RemoveFromList( &iSerializedRequestRoot );
+        
+        //Check if the request was scheduler-initiated
+        TBool driverInitiated(EFalse);
+        if( iSchedulerInitiatedTransactionIds.Count() > 0 )
+            {
+            for( int i=0;i<iSchedulerInitiatedTransactionIds.Count();++i )
+                {
+                if( iSchedulerInitiatedTransactionIds[i].iTransactionId == req->iRemoteFunctionCall.Header().iTransactionId )
+                    {
+                driverInitiated = ETrue;
+                    //This will be used in the "consume" function later on in many cases
+                    iSchedulerInitiatedTransactionData = iSchedulerInitiatedTransactionIds[i].iTransactionData; 
+                    iSchedulerInitiatedTransactionIds.Remove( i );
+                    break;
+                    }
+                }
+            }
+        
+        if( driverInitiated )
+            {
+            //This branch is for the purpose of handling commands that have been initiated from (this) 
+            //Command Scheduler, and not a client thread. So far no cases exists, where this would
+            //imply notifying a (client) DLL, so RequestComplete does not have to be called here (this could change later).
+            //Parse result and write vectors back to client space
+            if ( 0 == error )
+                {
+                //Parse result and write vectors back to client space        
+                TDataToClientSpaceCopier datacopier2( req->iAsyncClient );
+                RemoteFunctionCallData rfc;
+                SerializedFunctionCall sfc( rfc );
+                sfc.SetDataCopier( &datacopier2 );
+                const TLinAddr paramAddr( iHwInterface.OutputParametersAddress() );
+                VVHW_TRACE("DDeviceReqHandler::ProcessDfc parse");
+                sfc.ParseBuffer( reinterpret_cast<TUint8*>( paramAddr ), VVI_PARAMETERS_OUTPUT_MEMORY_SIZE );
+                TPckg<RemoteFunctionCallData> resultbuf( rfc );
+                req->iRemoteFunctionCall = resultbuf();//Get the object; its in the same address space 
+                VVHW_TRACE("DDeviceReqHandler::ProcessDfc ThreadDesWrite err=%d (data len=%d)", error, resultbuf.Length());
+                sfc.SetDataCopier( NULL );
+                }
+
+            error = ResetAndEnableInterrupt( DVirtualVideoHwInterface::EInterruptNewDataAvailable );
+            ConsumeSchedulerInitiatedRequestResult( req );
+            }
+        else
+            {
+			TInt desWriteError = KErrNone;
+            if ( 0 == error )
+                {
+                //Parse result and write vectors back to client space
+				// TODO for performance only write back result & output vectors, not whole request buffer
+                TDataToClientSpaceCopier datacopier2( req->iAsyncClient );
+                RemoteFunctionCallData rfc;
+                SerializedFunctionCall sfc( rfc );
+                sfc.SetDataCopier( &datacopier2 );
+                const TLinAddr paramAddr( iHwInterface.OutputParametersAddress() );
+                VVHW_TRACE("DDeviceReqHandler::ProcessDfc parse");
+                sfc.ParseBuffer( reinterpret_cast<TUint8*>( paramAddr ), VVI_PARAMETERS_OUTPUT_MEMORY_SIZE );
+                TPckg<RemoteFunctionCallData> resultbuf( rfc );
+                desWriteError = Kern::ThreadDesWrite( req->iAsyncClient, req->iA1, resultbuf, 0, 0 );
+                VVHW_TRACE("DDeviceReqHandler::ProcessDfc ThreadDesWrite err=%d (data len=%d)",desWriteError, resultbuf.Length());
+                sfc.SetDataCopier( NULL );
+                }
+
+            Kern::RequestComplete( req->iAsyncClient, req->iStatus, desWriteError );
+            ResetAndEnableInterrupt( DVirtualVideoHwInterface::EInterruptNewDataAvailable );
+            ReleaseRequest( req );
+            }
+        }
+    else
+        {
+        ResetAndEnableInterrupt( DVirtualVideoHwInterface::EInterruptNewDataAvailable );
+        }
+    VVHW_TRACE("DDeviceReqHandler::ProcessDfc ProcessNextPendingRequest");
+    
+    TInt ret = ProcessNextPendingRequest();
+    while ( KErrNone == ret )
+        {
+        ret = ProcessNextPendingRequest();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// DDeviceReqHandler::AllocRequest
+// -----------------------------------------------------------------------------
+//
+DDeviceReqHandler::TAsyncRequest* DDeviceReqHandler::AllocRequest( TRequestStatus* aStatus,
+        DThread* aAsyncClient,
+        TAny* aA1,
+        TAny* aA2,
+        DDeviceReqHandler::TAsyncRequest::TRequestType aRequestType )
+    {
+    TAsyncRequest* req( NULL );
+    if ( iFreeCount )
+        {
+        req = iFreeListRoot.iNext;
+        req->RemoveFromList( &iFreeListRoot );
+        req->Init( aStatus, aAsyncClient, aA1, aA2, aRequestType );
+        iFreeCount--;
+        }
+    else
+        {
+        VVHW_TRACE("DDeviceReqHandler::AllocRequest new");
+        req = new TAsyncRequest( aStatus, aAsyncClient, aA1, aA2, aRequestType );
+        }
+    return req;
+    }
+
+// -----------------------------------------------------------------------------
+// DDeviceReqHandler::ReleaseRequest
+// -----------------------------------------------------------------------------
+//
+void DDeviceReqHandler::ReleaseRequest( DDeviceReqHandler::TAsyncRequest* aReq )
+    {
+    if ( iFreeCount > KMaxFreeRequests )
+        {
+        VVHW_TRACE("DDeviceReqHandler::AllocRequest delete");
+        delete aReq;
+        }
+    else
+        {
+        aReq->AppendToList( &iFreeListRoot );
+        iFreeCount++;
+        }
+    }
+
+
+
+void DDeviceReqHandler::RemoveClientData( const TUint32 aProcId, const TUint32 aThreadId )
+    {
+    VVHW_TRACE("DDeviceReqHandler::RemoveClientData (%d/%d)", aProcId, aThreadId );
+    TPerThreadData* data( NULL );
+    for( TInt i=0; i < iClientData.Count(); ++i )
+        {
+        if( iClientData[i]->sameThread( aProcId, aThreadId ) )
+            {
+            data = iClientData[i];
+            iClientData.Remove(i);
+            if( data == iCurrClientData )
+                {
+                iCurrClientData = 0;
+                }
+            delete data;
+            break;
+            }
+        }
+    }
+
+TBool DDeviceReqHandler::InitiateRequestWithReply( TAsyncRequest* aRec, TAny* aTransactionData )
+    {
+    VVHW_TRACE("DDeviceReqHandler::InitiateRequestWithReply" );
+    if( iDriverRfcThreadId == 0 || iDriverRfcProcessId == 0 )
+        {
+        iDriverRfcProcessId = Kern::CurrentProcess().iId;
+        iDriverRfcThreadId  = Kern::CurrentThread().iId;
+        }
+    //iReqIssueMutex.Wait();
+    const TUint32 serializedLength( aRec->iRemoteFunctionCall.SerialisedLength() );
+    if ( !iRequestBuffer.CheckForSpace( serializedLength ) )
+       {
+       return EFalse;
+       }
+    ++iTransactionId;
+    aRec->iRemoteFunctionCall.SetTransactionId( iTransactionId );
+    aRec->iRemoteFunctionCall.SetOperationType( RemoteFunctionCallData::EOpRequestWithReply );
+    aRec->iAsyncClient = &(Kern::CurrentThread());
+    aRec->iRemoteFunctionCall.SetThreadInformation( iDriverRfcProcessId, iDriverRfcThreadId );
+    
+    iSchedulerInitiatedTransactionIds.Append( TTransactionInfo( iTransactionId, aTransactionData ) );
+    VVHW_TRACE("DDeviceReqHandler::InitiateRequestWithReply ids len=%d transaction id = %u proc/thread = %u / %u api/op = %0x / %0x", iSchedulerInitiatedTransactionIds.Count(), iTransactionId, Kern::CurrentProcess().iId, Kern::CurrentThread().iId, aRec->iRemoteFunctionCall.Header().iApiUid, aRec->iRemoteFunctionCall.Header().iOpCode );
+    if( aRec->iRemoteFunctionCall.Header().iApiUid )
+        {
+        VVHW_TRACE("DDeviceReqHandler::InitiateRequestWithReply request's api is SERIALISED_DRIVER_API_UID" );
+        }
+    
+    iSerializedRequestRoot.AppendToLast( aRec );//we need the result, so add to the dfc handled requests
+    TDataFromClientSpaceCopier datacopier( aRec->iAsyncClient );
+    SerializedFunctionCall sfc( aRec->iRemoteFunctionCall );
+    
+    sfc.SetDataCopier( &datacopier );//We know this is a "request" (precondition)
+    const TUint32 base( iRequestBuffer.AllocateBytes( serializedLength ) );
+    //Next, serialize the call to the HW memory
+    const TLinAddr paramAddr( iHwInterface.InputParametersAddress() + base );
+    TInt len = sfc.WriteToBuffer( reinterpret_cast<TUint8*>(paramAddr), VVI_PARAMETERS_INPUT_MEMORY_SIZE - 1 - base );
+    VVHW_TRACE("DDeviceReqHandler::InitiateRequestWithReply len = %d", len);
+    sfc.SetDataCopier( NULL );
+    iRequestBuffer.CommitBytes( base, serializedLength );
+    iHwInterface.IssueCommand( VVI_EXECUTE );
+    VVHW_TRACE("DDeviceReqHandler::InitiateRequestWithReply issued");
+    return ETrue;
+    }
+
+/**
+ * This routine adds extra info about the sgImage's pbuffer handle for syncing,
+ * when that is required. 
+ * 1. checks the sgImage handle, and if it's not NULL, then
+ *  2. Get the sgImage's metadata
+ *  3. Check if the vgImage is "dirty", and if yes,
+ *      then append the pbuffer handle as a parameter to the call   
+ *  4. Set the pbuffer "dirty", if aSetBufferDirty is ETrue
+ */
+
+void DDeviceReqHandler::getVGSyncInOp( TAsyncRequest* aReq, TInt aSgHandleIndexInReq, TBool aSetBufferDirty )
+    {    
+    VVHW_TRACE( "DDeviceReqHandler::getVGSyncInOp" );
+    EGLSurface surface( EGL_NO_SURFACE );//The pbuffer surface to sync from, if needed
+    VGboolean syncNeeded = VG_FALSE;
+    OpenVgRFC call( aReq->iRemoteFunctionCall );
+    TUint64 sgId(NULL);
+    
+    if( call.Data().Header().iParameterCount > aSgHandleIndexInReq )
+        {
+        call.GetTUint64( sgId, aSgHandleIndexInReq );
+        }
+    else
+        {
+        return;//No sgImage handle appended on the client side, just exit
+        }
+    
+#ifdef FAISALMEMON_S4_SGIMAGE
+    if( sgId != NULL )
+        {
+        VVHW_TRACE( "DDeviceReqHandler::getVGSyncInOp SgImage-backing VGImage found" );
+        DSgResource* resource;
+        HBuf8* data = OpenSgImageMetaData( sgId, resource );
+        if( data )
+            {
+            TSgImageMetaData sginfo (((TPckgBuf<TSgImageMetaData>*) data)->operator ()());
+            
+            if( !sginfo.iVGImageClean )
+                {
+                //set the sync bit as clean now.
+                sginfo.iVGImageClean = ETrue;
+                //Additional info for the host side to use
+                syncNeeded = VG_TRUE;
+                surface = sginfo.iPbufferHandle;
+                }
+            if( aSetBufferDirty )
+                {
+                sginfo.iPbufferClean = EFalse;
+                }
+            resource->SetMetaData( *data );
+            delete data;//delete the copy of the metadata descriptor
+            }
+        }
+    if( syncNeeded )
+        {
+        call.AppendParam ( (int)surface );
+        }
+#endif
+    }
+
+
+void DDeviceReqHandler::ConsumeSchedulerInitiatedRequestResult( TAsyncRequest* aReq )
+    {
+    const TUint32 proc_id( aReq->iRemoteFunctionCall.Header().iProcessId );
+    const TUint32 thread_id( aReq->iRemoteFunctionCall.Header().iThreadId );
+    const TUint32 apicode( aReq->iRemoteFunctionCall.Header().iApiUid );
+    const TUint32 opcode( aReq->iRemoteFunctionCall.Header().iOpCode );
+    VVHW_TRACE( "DDeviceReqHandler::ConsumeSchedulerInitiatedRequestResult: process/thread id : %d / %d", Kern::CurrentProcess().iId, Kern::CurrentThread().iId );
+    VVHW_TRACE( "DDeviceReqHandler::ConsumeSchedulerInitiatedRequestResult: process/thread id : %d / %d API/opcode = %0x/%0x", proc_id, thread_id, apicode, opcode );
+    TPerThreadData* data(0);
+    for( TInt i=0; i < iClientData.Count(); ++i )
+        {
+        if( iClientData[i]->sameThread( proc_id, thread_id ))
+            {
+            data = iClientData[i];
+            break;
+            }
+        }
+    
+    switch ( apicode )
+        {
+        case SERIALISED_DRIVER_API_UID:
+            {
+            switch( opcode )
+                {
+                case DriverRFC::EDrvCreatePbufferSg:
+                    {
+                    VVHW_TRACE( "DDeviceReqHandler::ConsumeSchedulerInitiatedRequestResult : EDrvCreatePbufferSg" );
+                    if( iSchedulerInitiatedTransactionData )
+                        {
+                        ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iPbufferHandle = aReq->iRemoteFunctionCall.Header().iReturnValue;
+                        VVHW_TRACE( "DDeviceReqHandler::ConsumeSchedulerInitiatedRequestResult pbuffer=%u", ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iPbufferHandle );
+                        }
+                    TPbSId obj ( ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iPbufferHandle,
+                                 ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iSgId );
+                    iPbufferSgMap.InsertInOrder( obj, iPbufferSgMapOrder );
+                    VVHW_TRACE( "pbuffer creation RequestComplete. Inserted (%u, %u) into sg map. Notify thread %u, request status %u",
+                                                                    ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iPbufferHandle,
+                                                                    ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iSgId,
+                                                                    aReq->iAsyncClient,
+                                                                    aReq->iStatus );
+                    *(aReq->iStatus) = 0;//REquestComplete doesn't work
+                    VVHW_TRACE( "Pbuffer creation RequestComplete" );
+                    break;
+                    }
+                case DriverRFC::EDrvCreateVGImageSg:
+                    {
+                    VVHW_TRACE( "DDeviceReqHandler::ConsumeSchedulerInitiatedRequestResult : EDrvCreateVGImageSg" );
+                    if( iSchedulerInitiatedTransactionData )
+                        {
+                        ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iVGImageHandle = aReq->iRemoteFunctionCall.Header().iReturnValue;
+                        }
+                    TVGISId obj ( ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iVGImageHandle,
+                                 ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iSgId );
+                    iVGImageSgMap.InsertInOrder( obj, iVGImageSgMapOrder );
+                    VVHW_TRACE( "pbuffer creation RequestComplete. Inserted (%u, %u) into sg map. Notify thread %u, request status %u",
+                               ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iVGImageHandle,
+                               ((TSgImageMetaData*)iSchedulerInitiatedTransactionData)->iSgId,
+                               aReq->iAsyncClient,
+                               aReq->iStatus );
+                    *(aReq->iStatus) = 0;//REquestComplete doesn't work
+                    VVHW_TRACE( "VGImage creation RequestComplete" );
+                    break;
+                    }
+                case DriverRFC::EDrvDeleteSgImage:
+                    {
+                    *(aReq->iStatus) = 0;
+                    }
+                case DriverRFC::EDrvSyncVGImageFromPBuffer:
+                    {
+                    ((TAsyncRequest*)iSchedulerInitiatedTransactionData)->AppendToList( (TAsyncRequest*)(&iPendingRequestRoot) );
+                    break;
+                    }
+                default:
+                    {
+                    break;
+                    }
+                }
+            }
+        case SERIALISED_OPENVG_API_UID:
+            {
+            switch( opcode )
+                {
+                case OpenVgRFC::EvgGetError:
+                    {
+                    VVHW_TRACE("OpenVgRFC::EvgGetError");
+                    data->iErrorVG = aReq->iRemoteFunctionCall.Header().iReturnValue;
+                    data->iErrUpdatedVG = EFalse;//TODO: ETrue
+                    break;
+                    }
+                default:{break;}
+                }
+            break;
+            }
+        case SERIALISED_EGL_API_UID:
+            {
+            switch( opcode )
+                {
+                case EglRFC::EeglGetError:
+                    {
+                    VVHW_TRACE("EglRFC::EeglGetError");
+                    data->iErrorEGL = aReq->iRemoteFunctionCall.Header().iReturnValue;
+                    data->iErrUpdatedEGL = EFalse;//TODO: ETrue
+                    break;
+                    }
+                default:
+                    {break;}
+                }
+            break;
+            }
+        case SERIALISED_OPENGLES_1_1_API_UID:
+            {
+            switch( opcode )
+                {
+                case OpenGlES11RFC::EglGetError:
+                    {
+                    VVHW_TRACE("OpenGlES11RFC::EglGetError");
+                    data->iErrorGLES = aReq->iRemoteFunctionCall.Header().iReturnValue;
+                    data->iErrUpdatedGLES = EFalse;//TODO: ETrue
+                    }
+                default:{break;}
+                }
+            break;
+            }
+        default:{break;}
+        }
+
+    VVHW_TRACE( "DDeviceReqHandler::ConsumeSchedulerInitiatedRequestResult return value: %d", aReq->iRemoteFunctionCall.Header().iReturnValue );
+    if( data )
+        {
+        VVHW_TRACE("errors EGL/VG/GLES=%0x/%0x/%0x", data->iErrorEGL, data->iErrorVG, data->iErrorGLES );
+        }
+    //Delete the request object, as it is no longer needed
+    aReq->iStatus = 0;
+    aReq->iAsyncClient = 0;
+    delete aReq;
+    VVHW_TRACE("DDeviceReqHandle::ConsumeSchedulerInitiatedRequestResult done.");
+    }
+
+/**
+ * DDeviceReqHandler::CreateSgImagePbuffer
  * @param aInfo the info 
- */
-void DDeviceReqHandler::CreateSgImagePbuffer( const TSgImageMetaData& aInfo, TRequestStatus* aStatus, DThread* aThread )
-    {
-    //eglCreatePbufferSurface
-    //
-    VVHW_TRACE("DDeviceReqHandler::CreateSgImagePbuffer ->");
-    if( !iCurrClientData )
-        {return;}
-    TBool allok = ETrue;
-    TAsyncRequest* req(0);
-    TPckg<TUint32> res( iOpReturn );
-    *aStatus = KRequestPending;
-    VVHW_TRACE("DDeviceReqHandler::CreateSgImagePbuffer request from thread %u, requeststatus %u", aThread, aStatus );
-    req = AllocRequest( aStatus, aThread, NULL, (TAny*)(&res), TAsyncRequest::ERTRequest );
-    if( req )
-        {
-        DriverRFC call( req->iRemoteFunctionCall );
-        call.Init( DriverRFC::EDrvCreatePbufferSg );
-        
-        call.AppendEGLint  ( aInfo.iSizeInPixels.iWidth );
-        call.AppendEGLint  ( aInfo.iSizeInPixels.iHeight );
-        call.AppendEGLint  ( aInfo.iPixelFormat );
-
-        TPckg<RemoteFunctionCallData> data( req->iRemoteFunctionCall );
-        req->iA1 = (TAny*)( &data );
-        allok = InitiateRequestWithReply( req, (TAny*)(&aInfo) );
-        }
-    if( !allok )
-        {
-        //request not sent, or something else went wrong. Tell the client its over
-        //TODO: somehow dispose of the pbuffer that might have been created
-        }
-    while( *(aStatus) == KRequestPending )
-        {
-        NKern::Sleep( 20 );   
-        }
-    VVHW_TRACE("DDeviceReqHandler::CreateSgImagePBuffer <-");
-    return;
-    }
-
-void DDeviceReqHandler::CreateSgImageVGImage( const TSgImageMetaData& aInfo, TRequestStatus* aStatus, DThread* aThread )
-    {
-    //eglCreatePbufferSurface
-    //
-    VVHW_TRACE("DDeviceReqHandler::CreateSgImageVGImage ->");
-    if( !iCurrClientData )
-        {return;}
-    TBool allok = ETrue;
-    TAsyncRequest* req(0);
-    TPckg<TUint32> res( iOpReturn );
-    *aStatus = KRequestPending;
-    //make a request for the vgImage
-    req = AllocRequest( aStatus, aThread, NULL, (TAny*)(&res), TAsyncRequest::ERTRequest );
-    if( req )
-        {
-        DriverRFC call( req->iRemoteFunctionCall );
-        call.Init( DriverRFC::EDrvCreateVGImageSg );
-        
-        call.AppendEGLint  ( aInfo.iSizeInPixels.iWidth );
-        call.AppendEGLint  ( aInfo.iSizeInPixels.iHeight );
-        call.AppendEGLint  ( aInfo.iPixelFormat );
-
-        TPckg<RemoteFunctionCallData> data( req->iRemoteFunctionCall );
-        req->iA1 = (TAny*)(&data);
-        allok = InitiateRequestWithReply( req, (TAny*)(&aInfo) );
-        }
-    if( !allok )
-        {
-        //request not sent, or something else went wrong. Tell the client its over
-        //TODO: somehow dispose of the image that might have been created
-        //Kern::RequestComplete( aStatus, KErrGeneral );
-        }
-    while( *(aStatus) == KRequestPending )
-        {
-        NKern::Sleep( 20 );
-        }
-    VVHW_TRACE("DDeviceReqHandler::CreateSgImageVGImage <-");
-    return;
-    }
-
-
-
-
-TInt DDeviceReqHandler::DestroySgImage( const TUint64 aId )
-    {
-    VVHW_TRACE("DDeviceReqHandler::DestroySgImage ->");
-    TBool allok = ETrue;
-    TAsyncRequest* req(0);
-    TPckg<TUint32> res( iOpReturn );
-    EGLSurface surface(0);
-    VGImage    image(0);
-    
-    DSgResource* resource;
-    HBuf8* data = OpenSgImageMetaData( aId, resource );
-    if( data )
-        {
-        TSgImageMetaData sginfo (((TPckgBuf<TSgImageMetaData>*) data)->operator ()());
-        surface = sginfo.iPbufferHandle;
-        //TODO: are there other cases: e.g. can the vgimage be destroyed without destroying the surface?
-        if( sginfo.iUsage || ESgUsageBitOpenVgImage )
-            {
-            image = sginfo.iVGImageHandle;
-            }
-        delete data;
-        }
-    TRequestStatus status = KRequestPending;
-    //make a request for the vgImage
-    req = AllocRequest( &status, &Kern::CurrentThread(), NULL, (TAny*)(&res), TAsyncRequest::ERTRequest );
-    allok = (req?EFalse:ETrue);
-    if( req )
-        {
-        DriverRFC call( req->iRemoteFunctionCall );
-        call.Init( DriverRFC::EDrvDeleteSgImage );
-        
-        call.AppendEGLSurface( surface );
-        call.AppendVGParam ( image );
-
-        TPckg<RemoteFunctionCallData> data( req->iRemoteFunctionCall );
-        req->iA1 = (TAny*)(&data);
-        allok = InitiateRequestWithReply( req, 0 );
-        }
-    if( !allok )
-        {
-        //TODO
-        }
-    while( status == KRequestPending )
-        {
-        NKern::Sleep( 20 );
-        }
-    VVHW_TRACE("DDeviceReqHandler::DestroySgImage <-");
-    return 1;
-    }
-
-
-DDeviceReqHandler::TRequestMode DDeviceReqHandler::InterpretRequest( TAsyncRequest* aReq )
-    {
-    TRequestMode alreadyProcessed( ENormal );//processed here? The return value
-    const TUint32 proc_id( aReq->iRemoteFunctionCall.Header().iProcessId );
-    const TUint32 thread_id( aReq->iRemoteFunctionCall.Header().iThreadId );
-    const TUint32 apicode( aReq->iRemoteFunctionCall.Header().iApiUid );
-    const TUint32 opcode( aReq->iRemoteFunctionCall.Header().iOpCode );
-    
-    VVHW_TRACE( "DDeviceReqHandler::InterpretRequest in the process/thread %0x / %0x", Kern::CurrentProcess().iId, Kern::CurrentThread().iId );
-    
-    TBool ErrUpdatedVG = EFalse;//is the error updated during this function call
-    TBool ErrUpdatedEGL = EFalse;//is the error updated during this function call
-    TBool ErrUpdatedGLES = EFalse;//is the error updated during this function call
-    //Get a data object to work with
-    //(either a previously used client data object, or create a new one)
-    TPerThreadData* data(NULL);
-    if( iCurrClientData &&
-        iCurrClientData->sameThread( proc_id, thread_id ))
-        {
-        //the same client as previously
-        data = iCurrClientData;
-        }
-    else
-        {
-        //Check if this client is already known
-        for( TInt i=0; i < iClientData.Count(); ++i )
-            {
-            if( iClientData[i]->sameThread( proc_id, thread_id ))
-                {
-                data = iClientData[i];
-                break;
-                }
-            }
-        if( !data )
-            {
-            data = new TPerThreadData( aReq->iStatus, aReq->iAsyncClient, proc_id, thread_id );
-            iClientData.Append( data );
-            }
-        if( iCurrClientData )
-            {
-            VVHW_TRACE( "DDeviceReqHandler::InterpretRequest: SWITCHING CONTEXT: %d / %d -> %d / %d",
-                    iCurrClientData->iProcessId,
-                    iCurrClientData->iThreadId,
-                    proc_id,
-                    thread_id );
-            //Some other things need to be done here as well, as per 5.2 in the "Implementing SgImage" design doc
-            //TODO: currently the context switch does not need to be done on this level
-            }
-        //Context switched, or no previous client. Current set to new current.
-        iCurrClientData = data;
-        }
-    //Invariant: "data" and "iCurrClient" are the same and not null after this line
-    VVHW_TRACE("DDeviceReqHandler::InterpretRequest: number of clients = %d", iClientData.Count() );
-    
-    
-    iCurrClientData->iCurrApiUid = apicode;
-    iCurrClientData->iCurrOpCode = opcode;
-    VVHW_TRACE( "DDeviceReqHandler::InterpretRequest: process/thread id : %d / %d API/opcode = %d/%0x", proc_id, thread_id, apicode, opcode );
-    
-    
-    switch ( apicode )
-        {
-        case SERIALISED_DRIVER_API_UID:
-            {
-            VVHW_TRACE("Driver request (must be a shutdown for %d / %d)", proc_id, thread_id  );
-            if( opcode == DriverRFC::EDrvClientShutdown )
-                {
-                RemoveClientData( proc_id, thread_id );
-                }
-            break;
-            }
-        case SERIALISED_OPENVG_API_UID:
-            {
-            VVHW_TRACE("OpenVG request" );
-            switch( opcode )
-                {
-                case OpenVgRFC::EvgGetError:
-                    {
-                    break;
-                    }
-                //We need to catch all the operations that create or access VGImage buffers
-                case OpenVgRFC::EvgChildImage:
-                    {
-                    VVHW_TRACE("vgChildImage" );
-                    break;
-                    }
-                case OpenVgRFC::EvgDestroyImage:
-                    {
-                    VVHW_TRACE("vgDestroyImage" );
-                    break;
-                    }
-                case OpenVgRFC::EvgFinish:
-                    {
-                    VVHW_TRACE("vgFinish" );
-                    //A sync is required if there are any native pixmaps backing surfaces in the current context
-                    break;
-                    }
-                /* 
-                The sgImage ID is a 64-bit value, it has to be serialised as 2 32-bit values, thus occupying
-                2 parameter slots each. The sgImage ID position is thus the second last + last parameters in the 
-                parameter list
-                */ 
-                case OpenVgRFC::EvgClearImage:
-                    {
-                    VVHW_TRACE("vgClearImage" );
-                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );
-                    break;
-                    }
-                case OpenVgRFC::EvgImageSubData:
-                    {
-                    VVHW_TRACE("vgImageSubData" );
-                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );
-                    break;
-                    }
-                case OpenVgRFC::EvgGetPixels:
-                    {
-                    VVHW_TRACE("vgGetPixels" );
-                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );
-                    break;
-                    }
-                case OpenVgRFC::EvgSetPixels:
-                    {
-                    VVHW_TRACE("vgSetPixels" );
-                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );
-                    break;
-                    }
-                case OpenVgRFC::EvgCopyImage:
-                    {
-                    VVHW_TRACE("vgCopyImage" );
-                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );
-                    break;
-                    }
-                case OpenVgRFC::EvgDrawImage:
-                    {
-                    VVHW_TRACE("vgDrawImage" );
-                    break;
-                    }
-                case OpenVgRFC::EvgColorMatrix:
-                    {
-                    VVHW_TRACE("vgColorMatrix" );
-                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-4 );//dst
-                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );//src
-                    break;
-                    }
-                case OpenVgRFC::EvgConvolve:
-                    {
-                    VVHW_TRACE("vgConvolve" );
-                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-4 );//dst
-                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );//src
-                    break;
-                    }
-                case OpenVgRFC::EvgSeparableConvolve:
-                    {
-                    VVHW_TRACE("vgSeparableConvolve" );
-                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-4 );//dst
-                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );//src
-                    break;
-                    }
-                case OpenVgRFC::EvgGaussianBlur:
-                    {
-                    VVHW_TRACE("vgGaussianBlur" );
-                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-4 );//dst
-                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );//src
-                    break;
-                    }
-                case OpenVgRFC::EvgLookup:
-                    {
-                    VVHW_TRACE("vgLookup" );
-                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-4 );//dst
-                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );//src
-                    break;
-                    }
-                case OpenVgRFC::EvgLookupSingle:
-                    {
-                    VVHW_TRACE("vgLookupSingle" );
-                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-4 );//dst
-                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );//src
-                    break;
-                    }
-                case OpenVgRFC::EvgPathBounds:
-                    {
-                    VVHW_TRACE("vgPathBounds" );
-                    break;
-                    }
-                default:
-                    {
-                    break;
-                    }
-                }
-            break;
-            }
-        case SERIALISED_EGL_API_UID:
-            {
-            VVHW_TRACE("EGL request" );
-            switch( opcode )
-                {
-                case EglRFC::EeglMetaSgGetHandles:
-                    {
-                    VVHW_TRACE("EglRFC::EeglMetaSgGetHandles" );
-                    EglRFC call( aReq->iRemoteFunctionCall );
-                    TUint64 id(0);
-                    EGLint* handles;
-                    EGLint handles_size;
-                    
-                    call.GetTUint64( id, 0 );
-                    call.GetEGLintVectorData( handles, handles_size, 2 );
-                    DSgResource* resource;
-                    VVHW_TRACE("EglRFC::EeglMetaSgGetHandles openSgImageMetaData" );
-                    HBuf8* data = OpenSgImageMetaData( id, resource );
-                    if( data && handles_size >= 2 )
-                        {
-                        TSgImageMetaData sginfo (((TPckgBuf<TSgImageMetaData>*) data)->operator ()());
-                        handles[0] = sginfo.iPbufferHandle;
-                        handles[1] = sginfo.iVGImageHandle;
-                        call.SetReturnValue( (int)EGL_TRUE );
-                        }
-                    else
-                        {
-                        call.SetReturnValue( (int)EGL_FALSE );
-                        }
-                    alreadyProcessed = EHandled;
-					break;
-                    }
-                case EglRFC::EeglCreateContext:
-                    {
-                    //if no share_context specified, pass the sgImage pool context
-                    VVHW_TRACE("eglCreateContext" );
-                    break;
-                    }
-                case EglRFC::EeglMakeCurrent:
-                    {
-                    EGLDisplay dpy;
-                    EGLSurface draw;
-                    EGLSurface read;
-                    EGLContext ctx;
-                    EGLint syncRequirement(0);//no sync = 0
-                    
-                    EglRFC call( aReq->iRemoteFunctionCall );
-                    call.GetEGLDisplay( dpy, 0 );
-                    call.GetEGLSurface( draw, 1 );
-                    call.GetEGLSurface( read, 2 );
-                    call.GetEGLContext( ctx, 3 );
-                    VGImage img = 0;
-                    
-                    TPbSId obj ( draw, 0 );
-
-                    TInt sgIdIndex = iPbufferSgMap.FindInOrder( obj, iPbufferSgMapOrder );
-                    if( sgIdIndex != KErrNotFound )
-                        {
-                        DSgResource* resource;
-                        HBuf8* data = OpenSgImageMetaData( iPbufferSgMap[sgIdIndex].iSgId, resource );
-                        if( data )
-                            {
-                            TSgImageMetaData sginfo (((TPckgBuf<TSgImageMetaData>*) data)->operator ()());
-                            
-                            if( !sginfo.iPbufferClean )
-                                {
-                                img = sginfo.iVGImageHandle;
-                                //sync with the underlying pbuffer surface
-                                syncRequirement = syncRequirement | KSyncDrawSurface;
-                                call.AppendEGLint( img );
-                                }
-                            delete data;
-                            }
-                        }
-                    obj.iPbuffer = read;
-                    obj.iSgId = 0;
-
-                    sgIdIndex = iPbufferSgMap.FindInOrder( obj, iPbufferSgMapOrder );
-                    if( sgIdIndex != KErrNotFound )
-                        {
-                        DSgResource* resource;
-                        HBuf8* data = OpenSgImageMetaData( iPbufferSgMap[sgIdIndex].iSgId, resource );
-                        if( data )
-                            {
-                            TSgImageMetaData sginfo (((TPckgBuf<TSgImageMetaData>*) data)->operator ()());
-                            
-                            if( !sginfo.iPbufferClean )
-                                {
-                                img = sginfo.iVGImageHandle;
-                                //sync with the underlying pbuffer surface
-                                syncRequirement = syncRequirement | KSyncReadSurface;
-                                }
-                            delete data;
-                            }
-                        }
-                    call.AppendEGLint( syncRequirement );
-                    call.AppendEGLint( img );
-                    
-                    VVHW_TRACE("eglMakeCurrent %u", iCurrClientData->iContext );
-                    break;
-                    }
-                case EglRFC::EeglMakeCurrentSg:
-                    {
-                    VVHW_TRACE("eglMakeCurrentSg" );
-                    break;
-                    }
-                case EglRFC::EeglCreatePixmapSurfaceSg:
-                    {
-                    alreadyProcessed = EHandled;//This will be handled here
-                    
-                    TUint64 sgId;
-                    EglRFC call( aReq->iRemoteFunctionCall );
-                    call.GetTUint64( sgId, 0 );//get the sgImage id
-                    
-                    DSgResource* resource;
-                    HBuf8* data = OpenSgImageMetaData( sgId, resource );
-                    if( data )
-                        {
-                            TSgImageMetaData sginfo (((TPckgBuf<TSgImageMetaData>*) data)->operator ()());
-                            resource->SetMetaData( (*data) );
-                            aReq->iRemoteFunctionCall.SetReturnValue( sginfo.iPbufferHandle );
-                            delete data;
-                        }
-                    else
-                        {
-                        aReq->iRemoteFunctionCall.SetReturnValue( EGL_NO_SURFACE );
-                        }
-                    //Find the sgimage's pbuffer surface, then return that
-                    VVHW_TRACE( "EeglCreatePixmapSurfaceSg" );
-                    break;
-                    }
-                case EglRFC::EeglCreatePbufferFromClientBuffer:
-                    {
-                    //if a sgImage-backing VGImage handle is passed here, then fail with EGL_BAD_ACCESS
-                    
-                    VVHW_TRACE("eglCreatePbufferFromClientBuffer" );
-                    break;
-                    }
-                case EglRFC::EeglGetError:
-                    {
-                    VVHW_TRACE("eglGetError" );
-                    break;
-                    }
-                default:
-                    {
-                    break;
-                    }
-                }//switch opcode (EGL)
-                
-            break;
-            }
-        case SERIALISED_OPENGLES_1_1_API_UID:
-            {
-            VVHW_TRACE("OpenGLES request" );
-            switch( opcode )
-                {
-                case OpenGlES11RFC::EglGetError:
-                    {
-                    //Get the GLES error
-                    }
-                default:
-                    {
-                    break;
-                    }
-                }
-            break;
-            }
-        default:
-            {
-            break;
-            }
-        }//switch apicode
-    //VVHW_TRACE( "DDeviceReqHandler::InterpretRequest: opcode : %d ", data->iCurrOpCode );
-    if( iCurrClientData )//This could have been removed, in a call to RemoveClientData
-        {
-        iCurrClientData->iErrUpdatedVG = ErrUpdatedVG;
-        iCurrClientData->iErrUpdatedEGL = ErrUpdatedEGL;
-        iCurrClientData->iErrUpdatedGLES = ErrUpdatedGLES;
-        }
-    return alreadyProcessed;
-    }
-
-HBuf8* DDeviceReqHandler::OpenSgImageMetaData( const TUint64 aId, DSgResource*& aResource )
-    {
-    VVHW_TRACE("DDeviceReqHandler::OpenSgImageMetaData 0x%lx", aId );
-    aResource = 0;
-    HBuf8* data(0);
-    TInt sgOpenErr( KErrNone );
-    
-    sgOpenErr = SgExtension::FindAndOpenResource( aId, aResource );//Open the sgimage resource
-    VVHW_TRACE(" sgOpenErr %d", sgOpenErr);
-    if( sgOpenErr == KErrNone )
-        {
-        data = HBuf8::New( aResource->GetMetaDataSize() );
-        if( data )
-            {
-            aResource->GetMetaData( (*data) );
-            }
-        }
-    return data;//If there was a problem, this is zero. Ownership belongs to caller
-    }
+ */
+void DDeviceReqHandler::CreateSgImagePbuffer( const TSgImageMetaData& aInfo, TRequestStatus* aStatus, DThread* aThread )
+    {
+    //eglCreatePbufferSurface
+    //
+    VVHW_TRACE("DDeviceReqHandler::CreateSgImagePbuffer ->");
+    if( !iCurrClientData )
+        {return;}
+    TBool allok = ETrue;
+    TAsyncRequest* req(0);
+    TPckg<TUint32> res( iOpReturn );
+    *aStatus = KRequestPending;
+    VVHW_TRACE("DDeviceReqHandler::CreateSgImagePbuffer request from thread %u, requeststatus %u", aThread, aStatus );
+    req = AllocRequest( aStatus, aThread, NULL, (TAny*)(&res), TAsyncRequest::ERTRequest );
+    if( req )
+        {
+        DriverRFC call( req->iRemoteFunctionCall );
+        call.Init( DriverRFC::EDrvCreatePbufferSg );
+        
+        call.AppendEGLint  ( aInfo.iSizeInPixels.iWidth );
+        call.AppendEGLint  ( aInfo.iSizeInPixels.iHeight );
+        call.AppendEGLint  ( aInfo.iPixelFormat );
+
+        TPckg<RemoteFunctionCallData> data( req->iRemoteFunctionCall );
+        req->iA1 = (TAny*)( &data );
+        allok = InitiateRequestWithReply( req, (TAny*)(&aInfo) );
+        }
+    if( !allok )
+        {
+        //request not sent, or something else went wrong. Tell the client its over
+        //TODO: somehow dispose of the pbuffer that might have been created
+        }
+    while( *(aStatus) == KRequestPending )
+        {
+        NKern::Sleep( 20 );   
+        }
+    VVHW_TRACE("DDeviceReqHandler::CreateSgImagePBuffer <-");
+    return;
+    }
+
+void DDeviceReqHandler::CreateSgImageVGImage( const TSgImageMetaData& aInfo, TRequestStatus* aStatus, DThread* aThread )
+    {
+    //eglCreatePbufferSurface
+    //
+    VVHW_TRACE("DDeviceReqHandler::CreateSgImageVGImage ->");
+    if( !iCurrClientData )
+        {return;}
+    TBool allok = ETrue;
+    TAsyncRequest* req(0);
+    TPckg<TUint32> res( iOpReturn );
+    *aStatus = KRequestPending;
+    //make a request for the vgImage
+    req = AllocRequest( aStatus, aThread, NULL, (TAny*)(&res), TAsyncRequest::ERTRequest );
+    if( req )
+        {
+        DriverRFC call( req->iRemoteFunctionCall );
+        call.Init( DriverRFC::EDrvCreateVGImageSg );
+        
+        call.AppendEGLint  ( aInfo.iSizeInPixels.iWidth );
+        call.AppendEGLint  ( aInfo.iSizeInPixels.iHeight );
+        call.AppendEGLint  ( aInfo.iPixelFormat );
+
+        TPckg<RemoteFunctionCallData> data( req->iRemoteFunctionCall );
+        req->iA1 = (TAny*)(&data);
+        allok = InitiateRequestWithReply( req, (TAny*)(&aInfo) );
+        }
+    if( !allok )
+        {
+        //request not sent, or something else went wrong. Tell the client its over
+        //TODO: somehow dispose of the image that might have been created
+        //Kern::RequestComplete( aStatus, KErrGeneral );
+        }
+    while( *(aStatus) == KRequestPending )
+        {
+        NKern::Sleep( 20 );
+        }
+    VVHW_TRACE("DDeviceReqHandler::CreateSgImageVGImage <-");
+    return;
+    }
+
+
+
+
+TInt DDeviceReqHandler::DestroySgImage( const TUint64 aId )
+    {
+    VVHW_TRACE("DDeviceReqHandler::DestroySgImage ->");
+    TBool allok = ETrue;
+    TAsyncRequest* req(0);
+    TPckg<TUint32> res( iOpReturn );
+    EGLSurface surface(0);
+    VGImage    image(0);
+    
+#ifdef FAISALMEMON_S4_SGIMAGE
+    DSgResource* resource;
+    HBuf8* data = OpenSgImageMetaData( aId, resource );
+    if( data )
+        {
+        TSgImageMetaData sginfo (((TPckgBuf<TSgImageMetaData>*) data)->operator ()());
+        surface = sginfo.iPbufferHandle;
+        //TODO: are there other cases: e.g. can the vgimage be destroyed without destroying the surface?
+        if( sginfo.iUsage || ESgUsageBitOpenVgImage )
+            {
+            image = sginfo.iVGImageHandle;
+            }
+        delete data;
+        }
+    TRequestStatus status = KRequestPending;
+    //make a request for the vgImage
+    req = AllocRequest( &status, &Kern::CurrentThread(), NULL, (TAny*)(&res), TAsyncRequest::ERTRequest );
+    allok = (req?EFalse:ETrue);
+    if( req )
+        {
+        DriverRFC call( req->iRemoteFunctionCall );
+        call.Init( DriverRFC::EDrvDeleteSgImage );
+        
+        call.AppendEGLSurface( surface );
+        call.AppendVGParam ( image );
+
+        TPckg<RemoteFunctionCallData> data( req->iRemoteFunctionCall );
+        req->iA1 = (TAny*)(&data);
+        allok = InitiateRequestWithReply( req, 0 );
+        }
+    if( !allok )
+        {
+        //TODO
+        }
+    while( status == KRequestPending )
+        {
+        NKern::Sleep( 20 );
+        }
+#endif
+
+    VVHW_TRACE("DDeviceReqHandler::DestroySgImage <-");
+    return 1;
+    }
+
+
+DDeviceReqHandler::TRequestMode DDeviceReqHandler::InterpretRequest( TAsyncRequest* aReq )
+    {
+    TRequestMode alreadyProcessed( ENormal );//processed here? The return value
+    const TUint32 proc_id( aReq->iRemoteFunctionCall.Header().iProcessId );
+    const TUint32 thread_id( aReq->iRemoteFunctionCall.Header().iThreadId );
+    const TUint32 apicode( aReq->iRemoteFunctionCall.Header().iApiUid );
+    const TUint32 opcode( aReq->iRemoteFunctionCall.Header().iOpCode );
+    
+    VVHW_TRACE( "DDeviceReqHandler::InterpretRequest in the process/thread %0x / %0x", Kern::CurrentProcess().iId, Kern::CurrentThread().iId );
+    
+    TBool ErrUpdatedVG = EFalse;//is the error updated during this function call
+    TBool ErrUpdatedEGL = EFalse;//is the error updated during this function call
+    TBool ErrUpdatedGLES = EFalse;//is the error updated during this function call
+    //Get a data object to work with
+    //(either a previously used client data object, or create a new one)
+    TPerThreadData* data(NULL);
+    if( iCurrClientData &&
+        iCurrClientData->sameThread( proc_id, thread_id ))
+        {
+        //the same client as previously
+        data = iCurrClientData;
+        }
+    else
+        {
+        //Check if this client is already known
+        for( TInt i=0; i < iClientData.Count(); ++i )
+            {
+            if( iClientData[i]->sameThread( proc_id, thread_id ))
+                {
+                data = iClientData[i];
+                break;
+                }
+            }
+        if( !data )
+            {
+            data = new TPerThreadData( aReq->iStatus, aReq->iAsyncClient, proc_id, thread_id );
+            iClientData.Append( data );
+            }
+        if( iCurrClientData )
+            {
+            VVHW_TRACE( "DDeviceReqHandler::InterpretRequest: SWITCHING CONTEXT: %d / %d -> %d / %d",
+                    iCurrClientData->iProcessId,
+                    iCurrClientData->iThreadId,
+                    proc_id,
+                    thread_id );
+            //Some other things need to be done here as well, as per 5.2 in the "Implementing SgImage" design doc
+            //TODO: currently the context switch does not need to be done on this level
+            }
+        //Context switched, or no previous client. Current set to new current.
+        iCurrClientData = data;
+        }
+    //Invariant: "data" and "iCurrClient" are the same and not null after this line
+    VVHW_TRACE("DDeviceReqHandler::InterpretRequest: number of clients = %d", iClientData.Count() );
+    
+    
+    iCurrClientData->iCurrApiUid = apicode;
+    iCurrClientData->iCurrOpCode = opcode;
+    VVHW_TRACE( "DDeviceReqHandler::InterpretRequest: process/thread id : %d / %d API/opcode = %d/%0x", proc_id, thread_id, apicode, opcode );
+    
+    
+    switch ( apicode )
+        {
+        case SERIALISED_DRIVER_API_UID:
+            {
+            VVHW_TRACE("Driver request (must be a shutdown for %d / %d)", proc_id, thread_id  );
+            if( opcode == DriverRFC::EDrvClientShutdown )
+                {
+                RemoveClientData( proc_id, thread_id );
+                }
+            break;
+            }
+        case SERIALISED_OPENVG_API_UID:
+            {
+            VVHW_TRACE("OpenVG request" );
+            switch( opcode )
+                {
+                case OpenVgRFC::EvgGetError:
+                    {
+                    break;
+                    }
+                //We need to catch all the operations that create or access VGImage buffers
+                case OpenVgRFC::EvgChildImage:
+                    {
+                    VVHW_TRACE("vgChildImage" );
+                    break;
+                    }
+                case OpenVgRFC::EvgDestroyImage:
+                    {
+                    VVHW_TRACE("vgDestroyImage" );
+                    break;
+                    }
+                case OpenVgRFC::EvgFinish:
+                    {
+                    VVHW_TRACE("vgFinish" );
+                    //A sync is required if there are any native pixmaps backing surfaces in the current context
+                    break;
+                    }
+                /* 
+                The sgImage ID is a 64-bit value, it has to be serialised as 2 32-bit values, thus occupying
+                2 parameter slots each. The sgImage ID position is thus the second last + last parameters in the 
+                parameter list
+                */ 
+                case OpenVgRFC::EvgClearImage:
+                    {
+                    VVHW_TRACE("vgClearImage" );
+                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );
+                    break;
+                    }
+                case OpenVgRFC::EvgImageSubData:
+                    {
+                    VVHW_TRACE("vgImageSubData" );
+                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );
+                    break;
+                    }
+                case OpenVgRFC::EvgGetPixels:
+                    {
+                    VVHW_TRACE("vgGetPixels" );
+                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );
+                    break;
+                    }
+                case OpenVgRFC::EvgSetPixels:
+                    {
+                    VVHW_TRACE("vgSetPixels" );
+                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );
+                    break;
+                    }
+                case OpenVgRFC::EvgCopyImage:
+                    {
+                    VVHW_TRACE("vgCopyImage" );
+                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );
+                    break;
+                    }
+                case OpenVgRFC::EvgDrawImage:
+                    {
+                    VVHW_TRACE("vgDrawImage" );
+                    break;
+                    }
+                case OpenVgRFC::EvgColorMatrix:
+                    {
+                    VVHW_TRACE("vgColorMatrix" );
+                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-4 );//dst
+                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );//src
+                    break;
+                    }
+                case OpenVgRFC::EvgConvolve:
+                    {
+                    VVHW_TRACE("vgConvolve" );
+                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-4 );//dst
+                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );//src
+                    break;
+                    }
+                case OpenVgRFC::EvgSeparableConvolve:
+                    {
+                    VVHW_TRACE("vgSeparableConvolve" );
+                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-4 );//dst
+                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );//src
+                    break;
+                    }
+                case OpenVgRFC::EvgGaussianBlur:
+                    {
+                    VVHW_TRACE("vgGaussianBlur" );
+                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-4 );//dst
+                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );//src
+                    break;
+                    }
+                case OpenVgRFC::EvgLookup:
+                    {
+                    VVHW_TRACE("vgLookup" );
+                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-4 );//dst
+                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );//src
+                    break;
+                    }
+                case OpenVgRFC::EvgLookupSingle:
+                    {
+                    VVHW_TRACE("vgLookupSingle" );
+                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-4 );//dst
+                    getVGSyncInOp( aReq, aReq->iRemoteFunctionCall.Header().iParameterCount-2 );//src
+                    break;
+                    }
+                case OpenVgRFC::EvgPathBounds:
+                    {
+                    VVHW_TRACE("vgPathBounds" );
+                    break;
+                    }
+                default:
+                    {
+                    break;
+                    }
+                }
+            break;
+            }
+        case SERIALISED_EGL_API_UID:
+            {
+            VVHW_TRACE("EGL request" );
+            switch( opcode )
+                {
+                case EglRFC::EeglMetaSgGetHandles:
+                    {
+                    VVHW_TRACE("EglRFC::EeglMetaSgGetHandles" );
+                    EglRFC call( aReq->iRemoteFunctionCall );
+                    TUint64 id(0);
+                    EGLint* handles;
+                    EGLint handles_size;
+                    
+                    call.GetTUint64( id, 0 );
+                    call.GetEGLintVectorData( handles, handles_size, 2 );
+#ifdef FAISALMEMON_S4_SGIMAGE
+                    DSgResource* resource;
+                    VVHW_TRACE("EglRFC::EeglMetaSgGetHandles openSgImageMetaData" );
+                    HBuf8* data = OpenSgImageMetaData( id, resource );
+                    if( data && handles_size >= 2 )
+                        {
+                        TSgImageMetaData sginfo (((TPckgBuf<TSgImageMetaData>*) data)->operator ()());
+                        handles[0] = sginfo.iPbufferHandle;
+                        handles[1] = sginfo.iVGImageHandle;
+                        call.SetReturnValue( (int)EGL_TRUE );
+                        }
+                    else
+                        {
+                        call.SetReturnValue( (int)EGL_FALSE );
+                        }
+                    alreadyProcessed = EHandled;
+#endif
+					break;
+                    }
+                case EglRFC::EeglCreateContext:
+                    {
+                    //if no share_context specified, pass the sgImage pool context
+                    VVHW_TRACE("eglCreateContext" );
+                    break;
+                    }
+                case EglRFC::EeglMakeCurrent:
+                    {
+                    EGLDisplay dpy;
+                    EGLSurface draw;
+                    EGLSurface read;
+                    EGLContext ctx;
+                    EGLint syncRequirement(0);//no sync = 0
+                    
+                    EglRFC call( aReq->iRemoteFunctionCall );
+                    call.GetEGLDisplay( dpy, 0 );
+                    call.GetEGLSurface( draw, 1 );
+                    call.GetEGLSurface( read, 2 );
+                    call.GetEGLContext( ctx, 3 );
+                    VGImage img = 0;
+                    
+                    TPbSId obj ( draw, 0 );
+
+                    TInt sgIdIndex = iPbufferSgMap.FindInOrder( obj, iPbufferSgMapOrder );
+                    if( sgIdIndex != KErrNotFound )
+                        {
+#ifdef FAISALMEMON_S4_SGIMAGE
+                        DSgResource* resource;
+                        HBuf8* data = OpenSgImageMetaData( iPbufferSgMap[sgIdIndex].iSgId, resource );
+                        if( data )
+                            {
+                            TSgImageMetaData sginfo (((TPckgBuf<TSgImageMetaData>*) data)->operator ()());
+                            
+                            if( !sginfo.iPbufferClean )
+                                {
+                                img = sginfo.iVGImageHandle;
+                                //sync with the underlying pbuffer surface
+                                syncRequirement = syncRequirement | KSyncDrawSurface;
+                                call.AppendEGLint( img );
+                                }
+                            delete data;
+                            }
+#endif
+                        }
+                    obj.iPbuffer = read;
+                    obj.iSgId = 0;
+
+                    sgIdIndex = iPbufferSgMap.FindInOrder( obj, iPbufferSgMapOrder );
+                    if( sgIdIndex != KErrNotFound )
+                        {
+#ifdef FAISALMEMON_S4_SGIMAGE
+                        DSgResource* resource;
+                        HBuf8* data = OpenSgImageMetaData( iPbufferSgMap[sgIdIndex].iSgId, resource );
+                        if( data )
+                            {
+                            TSgImageMetaData sginfo (((TPckgBuf<TSgImageMetaData>*) data)->operator ()());
+                            
+                            if( !sginfo.iPbufferClean )
+                                {
+                                img = sginfo.iVGImageHandle;
+                                //sync with the underlying pbuffer surface
+                                syncRequirement = syncRequirement | KSyncReadSurface;
+                                }
+                            delete data;
+                            }
+#endif
+                        }
+                    call.AppendEGLint( syncRequirement );
+                    call.AppendEGLint( img );
+                    
+                    VVHW_TRACE("eglMakeCurrent %u", iCurrClientData->iContext );
+                    break;
+                    }
+                case EglRFC::EeglMakeCurrentSg:
+                    {
+                    VVHW_TRACE("eglMakeCurrentSg" );
+                    break;
+                    }
+                case EglRFC::EeglCreatePixmapSurfaceSg:
+                    {
+                    alreadyProcessed = EHandled;//This will be handled here
+                    
+                    TUint64 sgId;
+                    EglRFC call( aReq->iRemoteFunctionCall );
+                    call.GetTUint64( sgId, 0 );//get the sgImage id
+                    
+#ifdef FAISALMEMON_S4_SGIMAGE
+                    DSgResource* resource;
+                    HBuf8* data = OpenSgImageMetaData( sgId, resource );
+                    if( data )
+                        {
+                            TSgImageMetaData sginfo (((TPckgBuf<TSgImageMetaData>*) data)->operator ()());
+                            resource->SetMetaData( (*data) );
+                            aReq->iRemoteFunctionCall.SetReturnValue( sginfo.iPbufferHandle );
+                            delete data;
+                        }
+                    else
+                        {
+                        aReq->iRemoteFunctionCall.SetReturnValue( EGL_NO_SURFACE );
+                        }
+                    //Find the sgimage's pbuffer surface, then return that
+#endif
+                    VVHW_TRACE( "EeglCreatePixmapSurfaceSg" );
+                    break;
+                    }
+                case EglRFC::EeglCreatePbufferFromClientBuffer:
+                    {
+                    //if a sgImage-backing VGImage handle is passed here, then fail with EGL_BAD_ACCESS
+                    
+                    VVHW_TRACE("eglCreatePbufferFromClientBuffer" );
+                    break;
+                    }
+                case EglRFC::EeglGetError:
+                    {
+                    VVHW_TRACE("eglGetError" );
+                    break;
+                    }
+                default:
+                    {
+                    break;
+                    }
+                }//switch opcode (EGL)
+                
+            break;
+            }
+        case SERIALISED_OPENGLES_1_1_API_UID:
+            {
+            VVHW_TRACE("OpenGLES request" );
+            switch( opcode )
+                {
+                case OpenGlES11RFC::EglGetError:
+                    {
+                    //Get the GLES error
+                    }
+                default:
+                    {
+                    break;
+                    }
+                }
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }//switch apicode
+    //VVHW_TRACE( "DDeviceReqHandler::InterpretRequest: opcode : %d ", data->iCurrOpCode );
+    if( iCurrClientData )//This could have been removed, in a call to RemoveClientData
+        {
+        iCurrClientData->iErrUpdatedVG = ErrUpdatedVG;
+        iCurrClientData->iErrUpdatedEGL = ErrUpdatedEGL;
+        iCurrClientData->iErrUpdatedGLES = ErrUpdatedGLES;
+        }
+    return alreadyProcessed;
+    }
+
+HBuf8* DDeviceReqHandler::OpenSgImageMetaData( const TUint64 aId, DSgResource*& aResource )
+    {
+    VVHW_TRACE("DDeviceReqHandler::OpenSgImageMetaData 0x%lx", aId );
+    aResource = 0;
+    HBuf8* data(0);
+    TInt sgOpenErr( KErrNone );
+    
+    sgOpenErr = SgExtension::FindAndOpenResource( aId, aResource );//Open the sgimage resource
+    VVHW_TRACE(" sgOpenErr %d", sgOpenErr);
+    if( sgOpenErr == KErrNone )
+        {
+        data = HBuf8::New( aResource->GetMetaDataSize() );
+        if( data )
+            {
+            aResource->GetMetaData( (*data) );
+            }
+        }
+    return data;//If there was a problem, this is zero. Ownership belongs to caller
+    }
--- a/guestrendering/guestvideodriver/ldd/src/reqhandlerextension.cpp	Fri Aug 20 18:02:40 2010 +0100
+++ b/guestrendering/guestvideodriver/ldd/src/reqhandlerextension.cpp	Wed Aug 25 17:57:53 2010 +0100
@@ -1,139 +1,139 @@
-// Copyright (c) 2010 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:
-// Platsim video driver - request handler extension (a.k.a. Command Scheduler extension)
-//
-
-#include <kernel/kern_priv.h>
-#include <kernel.h>
-#include <graphics/reqhandlerextension.h>
-
-DReqHandlerExtensionImpl* TheReqHandlerExtensionImpl = NULL;
-
-DECLARE_STANDARD_EXTENSION()
-	{
-	__KTRACE_OPT(KBOOT, Kern::Printf("Starting TheReqHandlerExtension"));
-	TInt err;
-	TheReqHandlerExtensionImpl = new DReqHandlerExtensionImpl;
-	if (TheReqHandlerExtensionImpl)
-		{
-		err = TheReqHandlerExtensionImpl->Construct();
-		if (err != KErrNone)
-			{
-			delete TheReqHandlerExtensionImpl;
-			TheReqHandlerExtensionImpl = NULL;
-			}
-		}
-	else
-		{
-		err = KErrNoMemory;
-		}
-	if (err != KErrNone)
-		{
-		__KTRACE_OPT(KBOOT, Kern::Printf("Error: TheReqHandlerExtension failed to start"));
-		}
-	return err;
-	}
-
-
-EXPORT_C TInt ReqHandlerExtension::CreateSgImagePbuffer( const TSgImageMetaData& aInfo )
-	{
-    VVHW_TRACE( "ReqHandlerExtension::CreateSgImagePbuffer ->" );
-	if ( !TheReqHandlerExtensionImpl )
-		{
-		__KTRACE_OPT(KPANIC, Kern::Printf("Error: The ReqHandlerExtension not ready"));
-		return KErrNotReady;
-		}
-	TRequestStatus status = KRequestPending;
-	TheReqHandlerExtensionImpl->CreateSgImagePbuffer( aInfo, &status, &Kern::CurrentThread() );
-	//Kern::WaitForRequest( status );
-	VVHW_TRACE( "ReqHandlerExtension::CreateSgImagePbuffer <-" );
-	return 0;
-	}
-
-EXPORT_C TInt ReqHandlerExtension::CreateSgImageVGImage( const TSgImageMetaData& aInfo )
-    {
-    VVHW_TRACE( "ReqHandlerExtension::CreateSgImageVGImage" );
-    if ( !TheReqHandlerExtensionImpl )
-        {
-        __KTRACE_OPT(KPANIC, Kern::Printf("Error: The ReqHandlerExtension not ready"));
-        return KErrNotReady;
-        }
-    TRequestStatus status;
-    TheReqHandlerExtensionImpl->CreateSgImageVGImage( aInfo, &status, &Kern::CurrentThread() );
-    //Kern::WaitForRequest( status );
-    return 0;
-    }
-
-
-EXPORT_C TInt ReqHandlerExtension::DestroySgImage( const TUint64 aId )
-	{
-    VVHW_TRACE( "ReqHandlerExtension::DestroySgImage" );
-	if ( !TheReqHandlerExtensionImpl )
-		{
-		__KTRACE_OPT(KPANIC, Kern::Printf("Error: The ReqHandlerExtension not ready"));
-		return KErrNotReady;
-		}
-	return TheReqHandlerExtensionImpl->DestroySgImage( aId );
-	}
-
-EXPORT_C TInt ReqHandlerExtension::SetReqHandler( MReqHandlerCallback* aHandler )
-	{
-	if ( !TheReqHandlerExtensionImpl )
-		{
-		__KTRACE_OPT(KPANIC, Kern::Printf("Error: The ReqHandlerExtension not ready"));
-		return KErrNotReady;
-		}
-	return TheReqHandlerExtensionImpl->SetReqHandler( aHandler );
-	}
-
-//Implementation
-
-TInt DReqHandlerExtensionImpl::Construct()
-	{
-	return Kern::MutexCreate(iMutex, KNullDesC8, KMutexOrdGeneral0);
-	}
-
-void DReqHandlerExtensionImpl::CreateSgImagePbuffer( const TSgImageMetaData& aInfo, TRequestStatus* aStatus, DThread* aThread )
-	{
-	if( iCallBackHandler )
-        {
-		return iCallBackHandler->CreateSgImagePbuffer( aInfo, aStatus, aThread );
-		}
-	}
-
-void DReqHandlerExtensionImpl::CreateSgImageVGImage( const TSgImageMetaData& aInfo, TRequestStatus* aStatus, DThread* aThread )
-    {
-    if( iCallBackHandler )
-        {
-        return iCallBackHandler->CreateSgImageVGImage( aInfo, aStatus, aThread );
-        }
-    }
-
-TInt DReqHandlerExtensionImpl::DestroySgImage( const TUint64 aId )
-	{
-	if( iCallBackHandler )
-        {
-        TRequestStatus status;
-	    TInt err = iCallBackHandler->DestroySgImage( aId );
-	    return err; 
-		}
-    return 0;
-	}
-
-TInt DReqHandlerExtensionImpl::SetReqHandler( MReqHandlerCallback* aHandler )
-	{
-	iCallBackHandler = aHandler;
-	return 1;
-	}
-
+// Copyright (c) 2010 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:
+// Platsim video driver - request handler extension (a.k.a. Command Scheduler extension)
+//
+
+#include <kernel/kern_priv.h>
+#include <kernel.h>
+#include <graphics/reqhandlerextension.h>
+
+DReqHandlerExtensionImpl* TheReqHandlerExtensionImpl = NULL;
+
+DECLARE_STANDARD_EXTENSION()
+	{
+	__KTRACE_OPT(KBOOT, Kern::Printf("Starting TheReqHandlerExtension"));
+	TInt err;
+	TheReqHandlerExtensionImpl = new DReqHandlerExtensionImpl;
+	if (TheReqHandlerExtensionImpl)
+		{
+		err = TheReqHandlerExtensionImpl->Construct();
+		if (err != KErrNone)
+			{
+			delete TheReqHandlerExtensionImpl;
+			TheReqHandlerExtensionImpl = NULL;
+			}
+		}
+	else
+		{
+		err = KErrNoMemory;
+		}
+	if (err != KErrNone)
+		{
+		__KTRACE_OPT(KBOOT, Kern::Printf("Error: TheReqHandlerExtension failed to start"));
+		}
+	return err;
+	}
+
+
+EXPORT_C TInt ReqHandlerExtension::CreateSgImagePbuffer( const TSgImageMetaData& aInfo )
+	{
+    VVHW_TRACE( "ReqHandlerExtension::CreateSgImagePbuffer ->" );
+	if ( !TheReqHandlerExtensionImpl )
+		{
+		__KTRACE_OPT(KPANIC, Kern::Printf("Error: The ReqHandlerExtension not ready"));
+		return KErrNotReady;
+		}
+	TRequestStatus status = KRequestPending;
+	TheReqHandlerExtensionImpl->CreateSgImagePbuffer( aInfo, &status, &Kern::CurrentThread() );
+	//Kern::WaitForRequest( status );
+	VVHW_TRACE( "ReqHandlerExtension::CreateSgImagePbuffer <-" );
+	return 0;
+	}
+
+EXPORT_C TInt ReqHandlerExtension::CreateSgImageVGImage( const TSgImageMetaData& aInfo )
+    {
+    VVHW_TRACE( "ReqHandlerExtension::CreateSgImageVGImage" );
+    if ( !TheReqHandlerExtensionImpl )
+        {
+        __KTRACE_OPT(KPANIC, Kern::Printf("Error: The ReqHandlerExtension not ready"));
+        return KErrNotReady;
+        }
+    TRequestStatus status;
+    TheReqHandlerExtensionImpl->CreateSgImageVGImage( aInfo, &status, &Kern::CurrentThread() );
+    //Kern::WaitForRequest( status );
+    return 0;
+    }
+
+
+EXPORT_C TInt ReqHandlerExtension::DestroySgImage( const TUint64 aId )
+	{
+    VVHW_TRACE( "ReqHandlerExtension::DestroySgImage" );
+	if ( !TheReqHandlerExtensionImpl )
+		{
+		__KTRACE_OPT(KPANIC, Kern::Printf("Error: The ReqHandlerExtension not ready"));
+		return KErrNotReady;
+		}
+	return TheReqHandlerExtensionImpl->DestroySgImage( aId );
+	}
+
+EXPORT_C TInt ReqHandlerExtension::SetReqHandler( MReqHandlerCallback* aHandler )
+	{
+	if ( !TheReqHandlerExtensionImpl )
+		{
+		__KTRACE_OPT(KPANIC, Kern::Printf("Error: The ReqHandlerExtension not ready"));
+		return KErrNotReady;
+		}
+	return TheReqHandlerExtensionImpl->SetReqHandler( aHandler );
+	}
+
+//Implementation
+
+TInt DReqHandlerExtensionImpl::Construct()
+	{
+	return Kern::MutexCreate(iMutex, KNullDesC8, KMutexOrdGeneral0);
+	}
+
+void DReqHandlerExtensionImpl::CreateSgImagePbuffer( const TSgImageMetaData& aInfo, TRequestStatus* aStatus, DThread* aThread )
+	{
+	if( iCallBackHandler )
+        {
+		return iCallBackHandler->CreateSgImagePbuffer( aInfo, aStatus, aThread );
+		}
+	}
+
+void DReqHandlerExtensionImpl::CreateSgImageVGImage( const TSgImageMetaData& aInfo, TRequestStatus* aStatus, DThread* aThread )
+    {
+    if( iCallBackHandler )
+        {
+        return iCallBackHandler->CreateSgImageVGImage( aInfo, aStatus, aThread );
+        }
+    }
+
+TInt DReqHandlerExtensionImpl::DestroySgImage( const TUint64 aId )
+	{
+	if( iCallBackHandler )
+        {
+        TRequestStatus status;
+	    TInt err = iCallBackHandler->DestroySgImage( aId );
+	    return err; 
+		}
+    return 0;
+	}
+
+TInt DReqHandlerExtensionImpl::SetReqHandler( MReqHandlerCallback* aHandler )
+	{
+	iCallBackHandler = aHandler;
+	return 1;
+	}
+
--- a/guestrendering/guestvideodriver/ldd/src/virtualvideohwchannel.cpp	Fri Aug 20 18:02:40 2010 +0100
+++ b/guestrendering/guestvideodriver/ldd/src/virtualvideohwchannel.cpp	Wed Aug 25 17:57:53 2010 +0100
@@ -1,284 +1,284 @@
-/*
- * =============================================================================
- *  Name        : virtualvideohwchannel.cpp
- *  Part of     : 
- *  Description : Implementation of the class DVirtualVideoHwChannel.
- *  Version     : %version:2 %
- *
- *  Copyright © 2002-2010 Nokia. All rights reserved.
- *  This material, including documentation and any related
- *  computer programs, is protected by copyright controlled by
- *  Nokia. All rights are reserved. Copying, including
- *  reproducing, storing, adapting or translating, any
- *  or all of this material requires the prior written consent of
- *  Nokia. This material also contains confidential
- *  information which may not be disclosed to others without the
- *  prior written consent of Nokia.
- * =============================================================================
- */
-
-// INCLUDE FILES
-#include <kernel/kernel.h>
-#include <assp.h>
-
-#include "virtualvideohwchannel.h"
-#include "virtualvideohwdeviceinterface.h"
-#include "platsimvideodriverprotocol.h"
-#include "platsimvideodrivercommon.h"
-#include "devicereqhandler.h"
-#include "serializedfunctioncall.h"
-
-
-// CONSTANTS
-// ============================ MEMBER FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// DVirtualVideoHwChannel::DVirtualVideoHwChannel
-// -----------------------------------------------------------------------------
-//
-DVirtualVideoHwChannel::DVirtualVideoHwChannel(
-    MVirtualVideoHwDeviceInterface& aDeviceInterface,
-    DVirtualVideoHwInterface& aHwInterface,
-    DDeviceReqHandler& aDeviceReqHandler,
-    TDfcQue* aQueue ) :
-    iDeviceInterface( aDeviceInterface ),
-    iHwInterface( aHwInterface ),
-    iReqHandler( aDeviceReqHandler )
-    {    
-    SetDfcQ( aQueue );
-    }
-
-// -----------------------------------------------------------------------------
-// DVirtualVideoHwChannel::~DVirtualVideoHwChannel
-// -----------------------------------------------------------------------------
-//
-DVirtualVideoHwChannel::~DVirtualVideoHwChannel()
-    {
-    // Enter critical section
-    NKern::ThreadEnterCS();
-    iMsgQ.CompleteAll( KErrAbort );
-    // Leave critical section
-    NKern::ThreadLeaveCS();
-    }
-
-// -----------------------------------------------------------------------------
-// DVirtualVideoHwChannel::Request
-// -----------------------------------------------------------------------------
-//
-TInt DVirtualVideoHwChannel::Request( TInt aReqNo, TAny *a1, TAny *a2 )
-    {
-    TInt result = DLogicalChannel::Request( aReqNo, a1, a2 );
-    return result;
-    }
-
-// -----------------------------------------------------------------------------
-// DVirtualVideoHwChannel::HandleMsg
-// -----------------------------------------------------------------------------
-//
-void DVirtualVideoHwChannel::HandleMsg( TMessageBase* aMsgRequest )
-    {
-    DThread* userThread = aMsgRequest->Client();
-    TThreadMessage& msg = *(TThreadMessage*)aMsgRequest;
-    // Default error condition
-    TInt err = KErrNone; 
-
-    if ( msg.iValue == ECloseMsg )
-        {
-        iReqHandler.HandleClientShutdown( userThread->iOwningProcess->iId, userThread->iId );
-        msg.Complete( KErrNone, EFalse );
-        return;
-        }
-    
-    if ( msg.iValue < 0 )
-        {
-        TRequestStatus* status = (TRequestStatus*)msg.Ptr0();
-        err = DoRequest( userThread, ~msg.iValue, status, msg.Ptr1(), msg.Ptr2() );
-        if( err != KErrNone )
-            {
-            Kern::RequestComplete( userThread, status, err );
-            }
-        err = KErrNone;
-        }
-    else
-        {
-        err = DoControl( userThread, msg.iValue, msg.Ptr0(), msg.Ptr1() );
-        }
-
-    msg.Complete( err, ETrue );
-    }
-
-// -----------------------------------------------------------------------------
-// DVirtualVideoHwChannel::DoCreate
-// -----------------------------------------------------------------------------
-//
-TInt DVirtualVideoHwChannel::DoCreate( TInt /*aUnit*/, const TDesC* /*aInfo*/, const TVersion& aVer )
-    {
-    using namespace PlatsimVideoDriver;
-    TInt err = KErrNone;
-    
-    if ( ! Kern::QueryVersionSupported(
-            TVersion(
-                    KMajorVer,
-                    KMinorVer,
-                    KBuildVer ),
-            aVer ) )
-        {
-        return KErrNotSupported; 
-        }
-
-    iMsgQ.Receive();
-    return err;
-    }
-
-// -----------------------------------------------------------------------------
-// DVirtualVideoHwChannel::DoRequest
-// -----------------------------------------------------------------------------
-//
-TInt DVirtualVideoHwChannel::DoRequest(
-        DThread*& aUserThread,
-        TInt aReqNo,
-        TRequestStatus* aStatus,
-        TAny* a1,
-        TAny* a2 )
-    {
-    using namespace PlatsimVideoDriver;
-
-    // Default error condition
-    TInt err = KErrNone; 
-
-    switch( aReqNo )
-        {
-        case ERequestExecuteCommand:
-            {
-            err = iReqHandler.HandleExecuteAsync(
-                    aUserThread,
-                    aStatus,
-                    a1);
-            break;
-            }
-        case ERequestLoadCommands:
-            {
-            err = iReqHandler.HandleLoadCommands(
-                    aUserThread, 
-                    aStatus,
-                    a1 );
-            break;
-            }
-        default:
-            {
-            // Other requests are not supported
-            err = KErrNotSupported;
-            }
-            break;
-        }
-    return err;
-    }
-
-
-
-TInt DVirtualVideoHwChannel::GetSgImageMetaData(TSgImageMetaData& aSgInfo, const TUint64 aId)
-	{
-	VVHW_TRACE("DVirtualVideoHwChannel::OpenSgImageMetaData 0x%lx", aId );
-	DSgResource* sgResource = NULL;
-	TInt metaDataErr = SgExtension::FindAndOpenResource( aId, sgResource );//Open the sgimage resource
-	
-	if ( metaDataErr == KErrNone )
-		{
-		TPckgBuf<TSgImageMetaData> metaDataPckg;
-		
-		metaDataErr = sgResource->GetMetaData( metaDataPckg );
-		if ( metaDataErr == KErrNone )
-			{
-			aSgInfo = metaDataPckg();
-			}
-
-		sgResource->Close();
-		}
-	return metaDataErr;
-	}
-
-
-// -----------------------------------------------------------------------------
-// DVirtualVideoHwChannel::DoControl
-// -----------------------------------------------------------------------------
-//
-TInt DVirtualVideoHwChannel::DoControl(
-        DThread*& aUserThread,
-        TInt aFunction,
-        TAny* a1,
-        TAny* a2 )
-    {
-    using namespace PlatsimVideoDriver;
-    
-    // Default error condition
-    TInt err = KErrNone; 
-
-    switch( aFunction )
-        {
-        case ERequestMapAddress:
-            {
-            TPckgBuf<TInt> handle;
-            err = Kern::ThreadDesRead( aUserThread, a1, handle, 0, 0 );
-            if ( KErrNone == err )
-                {
-                DChunk* chunk = Kern::OpenSharedChunk( aUserThread, handle(), EFalse );
-                if ( chunk )
-                    {
-                    TLinAddr kernelAddress;
-                    TUint32 mapAttr;
-                    TUint32 physicalAddress( 0 );
-                    TInt ret = Kern::ChunkPhysicalAddress( chunk, 0, chunk->Size(), 
-                            kernelAddress, mapAttr, physicalAddress );
-                    
-                    TPckgC<TUint32> address( physicalAddress );
-                    err = Kern::ThreadDesWrite( aUserThread, a2, address, 0, 0, aUserThread );
-                    Kern::ChunkClose( chunk );
-                    chunk = NULL;
-                    }
-                else
-                    {
-                    err = KErrGeneral;
-                    }
-                }
-            break;
-            }
-        case ERequestSgHandles:
-            {
-            VVHW_TRACE("DVirtualVideoHwChannel::DoControl - ERequestSgHandles" );
-            TPckgBuf<TUint64> sgId;
-            err = Kern::ThreadDesRead( aUserThread, a1, sgId, 0, 0 );
-            if( KErrNone == err )
-                {
-				TSgImageMetaData sgInfo;
-				err = GetSgImageMetaData( sgInfo, sgId());
-				if ( KErrNone == err )
-					{
-					// package the handles into 64-bit value, since there's only one parameter (a2) available
-					TUint64 sgHandles = (((TUint64)sgInfo.iPbufferHandle)&0xFFFFFFFF) + (((TUint64)sgInfo.iVGImageHandle)<<32);
-					TPckg<TUint64> handles(sgHandles);
-					err = Kern::ThreadDesWrite( aUserThread, a2, handles, 0, 0);
-					if(err)
-					    VVHW_TRACE("DVirtualVideoHwChannel::DoControl - ThreadDesWrite error=%d", err);
-					}
-				else
-					{
-					VVHW_TRACE("DVirtualVideoHwChannel::DoControl - OpenSgImageMetaData failed" );
-					}
-                }
-            else
-            	{
-				VVHW_TRACE("DVirtualVideoHwChannel::DoControl - ThreadDesRead err=%i", err );
-                }
-            break;
-            }
-        default:
-            {
-            // Other functions are not supported
-            err = KErrNotSupported;
-            }
-            break;
-        }
-
-    return err;
-    }
-
+/*
+ * =============================================================================
+ *  Name        : virtualvideohwchannel.cpp
+ *  Part of     : 
+ *  Description : Implementation of the class DVirtualVideoHwChannel.
+ *  Version     : %version:2 %
+ *
+ *  Copyright © 2002-2010 Nokia. All rights reserved.
+ *  This material, including documentation and any related
+ *  computer programs, is protected by copyright controlled by
+ *  Nokia. All rights are reserved. Copying, including
+ *  reproducing, storing, adapting or translating, any
+ *  or all of this material requires the prior written consent of
+ *  Nokia. This material also contains confidential
+ *  information which may not be disclosed to others without the
+ *  prior written consent of Nokia.
+ * =============================================================================
+ */
+
+#include <kernel/kernel.h>
+#include <assp.h>
+
+#include <graphics/virtualvideohwchannel.h>
+#include <graphics/virtualvideohwdeviceinterface.h>
+#include <graphics/guestvideodriverprotocol.h>
+#include <graphics/guestvideodrivercommon.h>
+#include <graphics/devicereqhandler.h>
+
+#include "serializedfunctioncall.h"
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwChannel::DVirtualVideoHwChannel
+// -----------------------------------------------------------------------------
+//
+DVirtualVideoHwChannel::DVirtualVideoHwChannel(
+    MVirtualVideoHwDeviceInterface& aDeviceInterface,
+    DVirtualVideoHwInterface& aHwInterface,
+    DDeviceReqHandler& aDeviceReqHandler,
+    TDfcQue* aQueue ) :
+    iDeviceInterface( aDeviceInterface ),
+    iHwInterface( aHwInterface ),
+    iReqHandler( aDeviceReqHandler )
+    {    
+    SetDfcQ( aQueue );
+    }
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwChannel::~DVirtualVideoHwChannel
+// -----------------------------------------------------------------------------
+//
+DVirtualVideoHwChannel::~DVirtualVideoHwChannel()
+    {
+    // Enter critical section
+    NKern::ThreadEnterCS();
+    iMsgQ.CompleteAll( KErrAbort );
+    // Leave critical section
+    NKern::ThreadLeaveCS();
+    }
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwChannel::Request
+// -----------------------------------------------------------------------------
+//
+TInt DVirtualVideoHwChannel::Request( TInt aReqNo, TAny *a1, TAny *a2 )
+    {
+    TInt result = DLogicalChannel::Request( aReqNo, a1, a2 );
+    return result;
+    }
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwChannel::HandleMsg
+// -----------------------------------------------------------------------------
+//
+void DVirtualVideoHwChannel::HandleMsg( TMessageBase* aMsgRequest )
+    {
+    DThread* userThread = aMsgRequest->Client();
+    TThreadMessage& msg = *(TThreadMessage*)aMsgRequest;
+    // Default error condition
+    TInt err = KErrNone; 
+
+    if ( msg.iValue == ECloseMsg )
+        {
+        iReqHandler.HandleClientShutdown( userThread->iOwningProcess->iId, userThread->iId );
+        msg.Complete( KErrNone, EFalse );
+        return;
+        }
+    
+    if ( msg.iValue < 0 )
+        {
+        TRequestStatus* status = (TRequestStatus*)msg.Ptr0();
+        err = DoRequest( userThread, ~msg.iValue, status, msg.Ptr1(), msg.Ptr2() );
+        if( err != KErrNone )
+            {
+            Kern::RequestComplete( userThread, status, err );
+            }
+        err = KErrNone;
+        }
+    else
+        {
+        err = DoControl( userThread, msg.iValue, msg.Ptr0(), msg.Ptr1() );
+        }
+
+    msg.Complete( err, ETrue );
+    }
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwChannel::DoCreate
+// -----------------------------------------------------------------------------
+//
+TInt DVirtualVideoHwChannel::DoCreate( TInt /*aUnit*/, const TDesC* /*aInfo*/, const TVersion& aVer )
+    {
+    using namespace GuestVideoDriver;
+    TInt err = KErrNone;
+    
+    if ( ! Kern::QueryVersionSupported(
+            TVersion(
+                    KMajorVer,
+                    KMinorVer,
+                    KBuildVer ),
+            aVer ) )
+        {
+        return KErrNotSupported; 
+        }
+
+    iMsgQ.Receive();
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwChannel::DoRequest
+// -----------------------------------------------------------------------------
+//
+TInt DVirtualVideoHwChannel::DoRequest(
+        DThread*& aUserThread,
+        TInt aReqNo,
+        TRequestStatus* aStatus,
+        TAny* a1,
+        TAny* a2 )
+    {
+    using namespace GuestVideoDriver;
+
+    // Default error condition
+    TInt err = KErrNone; 
+
+    switch( aReqNo )
+        {
+        case ERequestExecuteCommand:
+            {
+            err = iReqHandler.HandleExecuteAsync(
+                    aUserThread,
+                    aStatus,
+                    a1);
+            break;
+            }
+        case ERequestLoadCommands:
+            {
+            err = iReqHandler.HandleLoadCommands(
+                    aUserThread, 
+                    aStatus,
+                    a1 );
+            break;
+            }
+        default:
+            {
+            // Other requests are not supported
+            err = KErrNotSupported;
+            }
+            break;
+        }
+    return err;
+    }
+
+
+
+#ifdef FAISALMEMON_S4_SGIMAGE
+TInt DVirtualVideoHwChannel::GetSgImageMetaData(TSgImageMetaData& aSgInfo, const TUint64 aId)
+	{
+	VVHW_TRACE("DVirtualVideoHwChannel::OpenSgImageMetaData 0x%lx", aId );
+	DSgResource* sgResource = NULL;
+	TInt metaDataErr = SgExtension::FindAndOpenResource( aId, sgResource );//Open the sgimage resource
+	
+	if ( metaDataErr == KErrNone )
+		{
+		TPckgBuf<TSgImageMetaData> metaDataPckg;
+		
+		metaDataErr = sgResource->GetMetaData( metaDataPckg );
+		if ( metaDataErr == KErrNone )
+			{
+			aSgInfo = metaDataPckg();
+			}
+
+		sgResource->Close();
+		}
+	return metaDataErr;
+	}
+#endif
+
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwChannel::DoControl
+// -----------------------------------------------------------------------------
+//
+TInt DVirtualVideoHwChannel::DoControl(
+        DThread*& aUserThread,
+        TInt aFunction,
+        TAny* a1,
+        TAny* a2 )
+    {
+    using namespace GuestVideoDriver;
+    
+    // Default error condition
+    TInt err = KErrNone; 
+
+    switch( aFunction )
+        {
+        case ERequestMapAddress:
+            {
+            TPckgBuf<TInt> handle;
+            err = Kern::ThreadDesRead( aUserThread, a1, handle, 0, 0 );
+            if ( KErrNone == err )
+                {
+                DChunk* chunk = Kern::OpenSharedChunk( aUserThread, handle(), EFalse );
+                if ( chunk )
+                    {
+                    TLinAddr kernelAddress;
+                    TUint32 mapAttr;
+                    TUint32 physicalAddress( 0 );
+                    TInt ret = Kern::ChunkPhysicalAddress( chunk, 0, chunk->Size(), 
+                            kernelAddress, mapAttr, physicalAddress );
+                    
+                    TPckgC<TUint32> address( physicalAddress );
+                    err = Kern::ThreadDesWrite( aUserThread, a2, address, 0, 0, aUserThread );
+                    Kern::ChunkClose( chunk );
+                    chunk = NULL;
+                    }
+                else
+                    {
+                    err = KErrGeneral;
+                    }
+                }
+            break;
+            }
+#ifdef FAISALMEMON_S4_SGIMAGE
+        case ERequestSgHandles:
+            {
+            VVHW_TRACE("DVirtualVideoHwChannel::DoControl - ERequestSgHandles" );
+            TPckgBuf<TUint64> sgId;
+            err = Kern::ThreadDesRead( aUserThread, a1, sgId, 0, 0 );
+            if( KErrNone == err )
+                {
+				TSgImageMetaData sgInfo;
+				err = GetSgImageMetaData( sgInfo, sgId());
+				if ( KErrNone == err )
+					{
+					// package the handles into 64-bit value, since there's only one parameter (a2) available
+					TUint64 sgHandles = (((TUint64)sgInfo.iPbufferHandle)&0xFFFFFFFF) + (((TUint64)sgInfo.iVGImageHandle)<<32);
+					TPckg<TUint64> handles(sgHandles);
+					err = Kern::ThreadDesWrite( aUserThread, a2, handles, 0, 0);
+					if(err)
+					    VVHW_TRACE("DVirtualVideoHwChannel::DoControl - ThreadDesWrite error=%d", err);
+					}
+				else
+					{
+					VVHW_TRACE("DVirtualVideoHwChannel::DoControl - OpenSgImageMetaData failed" );
+					}
+                }
+            else
+            	{
+				VVHW_TRACE("DVirtualVideoHwChannel::DoControl - ThreadDesRead err=%i", err );
+                }
+            break;
+            }
+#endif
+        default:
+            {
+            // Other functions are not supported
+            err = KErrNotSupported;
+            }
+            break;
+        }
+
+    return err;
+    }
+
--- a/guestrendering/guestvideodriver/ldd/src/virtualvideohwdevice.cpp	Fri Aug 20 18:02:40 2010 +0100
+++ b/guestrendering/guestvideodriver/ldd/src/virtualvideohwdevice.cpp	Wed Aug 25 17:57:53 2010 +0100
@@ -1,169 +1,167 @@
-/*
- * =============================================================================
- *  Name        : virtualvideohwdevice.cpp
- *  Part of     : 
- *  Description : Implementation of the class DVirtualVideoHwDevice.
- *  Version     : %version:3 %
- *
- *  Copyright © 2002-2008 Nokia. All rights reserved.
- *  This material, including documentation and any related
- *  computer programs, is protected by copyright controlled by
- *  Nokia. All rights are reserved. Copying, including
- *  reproducing, storing, adapting or translating, any
- *  or all of this material requires the prior written consent of
- *  Nokia. This material also contains confidential
- *  information which may not be disclosed to others without the
- *  prior written consent of Nokia.
- * =============================================================================
- */
-
-
-// INCLUDE FILES
-#include <kernel/kernel.h>
-#include <assp.h>
-
-#include "virtualvideohwdevice.h"
-#include "virtualvideohwchannel.h"
-#include "platsimvideodriverprotocol.h"
-#include "platsimvideodrivercommon.h"
-#include "virtualvideohwinterface.h"
-#include "devicereqhandler.h"
-#include "virtualvideotracing.h"
-
-const TInt KPriority = 27; // DfcQue0 has same priority
-
-// a .LDD requires that the first exported function creates the device. By
-// returning a concrete DLogicalDevice-derived class, this implements
-// polymorphism using a named DLL.
-DECLARE_STANDARD_LDD()
-    {
-    return new DVirtualVideoHwDevice; 
-    }
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// DVirtualVideoHwDevice::DVirtualVideoHwDevice
-// -----------------------------------------------------------------------------
-//
-DVirtualVideoHwDevice::DVirtualVideoHwDevice()
-    {
-    // No need to set iParseMask as we don't have PDD.
-    // Just set the version.
-    using namespace PlatsimVideoDriver;
-    iVersion = TVersion( KMajorVer, KMinorVer, KBuildVer );
-    VVHW_TRACE("DVirtualVideoHwDevice::DVirtualVideoHwDevice");
-    }
-
-// -----------------------------------------------------------------------------
-// DVirtualVideoHwDevice::Install
-// -----------------------------------------------------------------------------
-//
-TInt DVirtualVideoHwDevice::Install()
-    {
-    // Our name, used by User::FreeLogicalDevice 
-    TInt err = SetName( &PlatsimVideoDriver::KDeviceName );
-    if ( err != KErrNone )
-        {
-        VVHW_TRACE("DVirtualVideoHwDevice::Install SetName %d", err);
-        return err;
-        }
-
-    // Enter critical section
-    NKern::ThreadEnterCS();
-    
-    err = Kern::DfcQCreate( iDfcQ, KPriority, &PlatsimVideoDriver::KDfcThreadName );
-
-    // Leave critical section
-    NKern::ThreadLeaveCS();
-
-    if ( err != KErrNone )
-        {
-        VVHW_TRACE("DVirtualVideoHwDevice::Install Kern::DfcQCreate %d", err);
-        return err;
-        }
-    
-    iHwInterface = new DVirtualVideoHwInterface;
-    if ( !iHwInterface )
-        {
-        return KErrNoMemory;
-        }
-
-    err = iHwInterface->InitRegisterMemory();
-    if ( err != KErrNone )
-        {
-        VVHW_TRACE("DVirtualVideoHwDevice::Install InitRegisterMemory %d", err);
-        return err;
-        }
-
-    err = iHwInterface->InitParametersInputMemory();
-    if ( err != KErrNone )
-        {
-        VVHW_TRACE("DVirtualVideoHwDevice::Install InitParametersInputMemory %d", err);
-        return err;
-        }
-
-    err = iHwInterface->InitParametersOutputMemory();
-    if ( err != KErrNone )
-        {
-        VVHW_TRACE("DVirtualVideoHwDevice::Install InitParametersOutputMemory %d", err);
-        return err;
-        }
-
-    iDeviceReqHandler = new DDeviceReqHandler( *iHwInterface, iDfcQ );
-    if ( !iDeviceReqHandler )
-        {
-        return KErrNoMemory;
-        }
-
-    VVHW_TRACE("DVirtualVideoHwDevice::Install return %d", err);
-    return err;
-    }
-
-// -----------------------------------------------------------------------------
-// DVirtualVideoHwDevice::~DVirtualVideoHwDevice
-// -----------------------------------------------------------------------------
-//
-DVirtualVideoHwDevice::~DVirtualVideoHwDevice()
-    {
-    delete iDeviceReqHandler;
-    delete iDfcQ;
-    delete iHwInterface;
-    VVHW_TRACE("DVirtualVideoHwDevice:~DVirtualVideoHwDevice");
-    }
-
-// -----------------------------------------------------------------------------
-// DVirtualVideoHwDevice::GetCaps
-// -----------------------------------------------------------------------------
-//
-void DVirtualVideoHwDevice::GetCaps( TDes8& aDes ) const
-    {
-    TVersion version; 
-
-    // fill it with information
-    version = iVersion; 
-
-    // copy as much of our information as will fit into this descriptor
-    aDes.Copy( (TUint8*)&version, Min( aDes.MaxLength(), sizeof( version ) ) );
-    }
-
-// -----------------------------------------------------------------------------
-// DVirtualVideoHwDevice::Create
-// -----------------------------------------------------------------------------
-//
-TInt DVirtualVideoHwDevice::Create( DLogicalChannelBase*& aChannel )
-    { 
-    aChannel = NULL;
-    TInt error = KErrNone;
-    aChannel = new DVirtualVideoHwChannel(
-            *this,
-            *iHwInterface,
-            *iDeviceReqHandler,
-            iDfcQ);
-    
-    if ( !aChannel )
-        {
-        error = KErrNoMemory;
-        }
-    return error;
-    }
+/*
+ * =============================================================================
+ *  Name        : virtualvideohwdevice.cpp
+ *  Part of     : 
+ *  Description : Implementation of the class DVirtualVideoHwDevice.
+ *  Version     : %version:3 %
+ *
+ *  Copyright © 2002-2008 Nokia. All rights reserved.
+ *  This material, including documentation and any related
+ *  computer programs, is protected by copyright controlled by
+ *  Nokia. All rights are reserved. Copying, including
+ *  reproducing, storing, adapting or translating, any
+ *  or all of this material requires the prior written consent of
+ *  Nokia. This material also contains confidential
+ *  information which may not be disclosed to others without the
+ *  prior written consent of Nokia.
+ * =============================================================================
+ */
+
+#include <kernel/kernel.h>
+#include <assp.h>
+
+#include <graphics/guestvideodriverprotocol.h>
+#include <graphics/virtualvideohwdevice.h>
+#include <graphics/virtualvideohwchannel.h>
+#include <graphics/virtualvideohwinterface.h>
+#include <graphics/virtualvideotracing.h>
+#include <graphics/guestvideodrivercommon.h>
+#include <graphics/devicereqhandler.h>
+
+const TInt KPriority = 27; // DfcQue0 has same priority
+
+// a .LDD requires that the first exported function creates the device. By
+// returning a concrete DLogicalDevice-derived class, this implements
+// polymorphism using a named DLL.
+DECLARE_STANDARD_LDD()
+    {
+    return new DVirtualVideoHwDevice; 
+    }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwDevice::DVirtualVideoHwDevice
+// -----------------------------------------------------------------------------
+//
+DVirtualVideoHwDevice::DVirtualVideoHwDevice()
+    {
+    // No need to set iParseMask as we don't have PDD.
+    // Just set the version.
+    using namespace GuestVideoDriver;
+    iVersion = TVersion( KMajorVer, KMinorVer, KBuildVer );
+    VVHW_TRACE("DVirtualVideoHwDevice::DVirtualVideoHwDevice");
+    }
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwDevice::Install
+// -----------------------------------------------------------------------------
+//
+TInt DVirtualVideoHwDevice::Install()
+    {
+    // Our name, used by User::FreeLogicalDevice 
+    TInt err = SetName( &GuestVideoDriver::KDeviceName );
+    if ( err != KErrNone )
+        {
+        VVHW_TRACE("DVirtualVideoHwDevice::Install SetName %d", err);
+        return err;
+        }
+
+    // Enter critical section
+    NKern::ThreadEnterCS();
+    
+    err = Kern::DfcQCreate( iDfcQ, KPriority, &GuestVideoDriver::KDfcThreadName );
+
+    // Leave critical section
+    NKern::ThreadLeaveCS();
+
+    if ( err != KErrNone )
+        {
+        VVHW_TRACE("DVirtualVideoHwDevice::Install Kern::DfcQCreate %d", err);
+        return err;
+        }
+    
+    iHwInterface = new DVirtualVideoHwInterface;
+    if ( !iHwInterface )
+        {
+        return KErrNoMemory;
+        }
+
+    err = iHwInterface->InitRegisterMemory();
+    if ( err != KErrNone )
+        {
+        VVHW_TRACE("DVirtualVideoHwDevice::Install InitRegisterMemory %d", err);
+        return err;
+        }
+
+    err = iHwInterface->InitParametersInputMemory();
+    if ( err != KErrNone )
+        {
+        VVHW_TRACE("DVirtualVideoHwDevice::Install InitParametersInputMemory %d", err);
+        return err;
+        }
+
+    err = iHwInterface->InitParametersOutputMemory();
+    if ( err != KErrNone )
+        {
+        VVHW_TRACE("DVirtualVideoHwDevice::Install InitParametersOutputMemory %d", err);
+        return err;
+        }
+
+    iDeviceReqHandler = new DDeviceReqHandler( *iHwInterface, iDfcQ );
+    if ( !iDeviceReqHandler )
+        {
+        return KErrNoMemory;
+        }
+
+    VVHW_TRACE("DVirtualVideoHwDevice::Install return %d", err);
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwDevice::~DVirtualVideoHwDevice
+// -----------------------------------------------------------------------------
+//
+DVirtualVideoHwDevice::~DVirtualVideoHwDevice()
+    {
+    delete iDeviceReqHandler;
+    delete iDfcQ;
+    delete iHwInterface;
+    VVHW_TRACE("DVirtualVideoHwDevice:~DVirtualVideoHwDevice");
+    }
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwDevice::GetCaps
+// -----------------------------------------------------------------------------
+//
+void DVirtualVideoHwDevice::GetCaps( TDes8& aDes ) const
+    {
+    TVersion version; 
+
+    // fill it with information
+    version = iVersion; 
+
+    // copy as much of our information as will fit into this descriptor
+    aDes.Copy( (TUint8*)&version, Min( aDes.MaxLength(), sizeof( version ) ) );
+    }
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwDevice::Create
+// -----------------------------------------------------------------------------
+//
+TInt DVirtualVideoHwDevice::Create( DLogicalChannelBase*& aChannel )
+    { 
+    aChannel = NULL;
+    TInt error = KErrNone;
+    aChannel = new DVirtualVideoHwChannel(
+            *this,
+            *iHwInterface,
+            *iDeviceReqHandler,
+            iDfcQ);
+    
+    if ( !aChannel )
+        {
+        error = KErrNoMemory;
+        }
+    return error;
+    }
--- a/guestrendering/guestvideodriver/ldd/src/virtualvideohwinterface.cpp	Fri Aug 20 18:02:40 2010 +0100
+++ b/guestrendering/guestvideodriver/ldd/src/virtualvideohwinterface.cpp	Wed Aug 25 17:57:53 2010 +0100
@@ -1,267 +1,267 @@
-/*
- * =============================================================================
- *  Name        : virtualvideohwinterface.cpp
- *  Part of     : 
- *  Description : Implementation file for the class DVirtualVideoHwInterface.
- *  Version     : %version:3 %
- *
- *  Copyright © 2002-2009 Nokia. All rights reserved.
- *  This material, including documentation and any related
- *  computer programs, is protected by copyright controlled by
- *  Nokia. All rights are reserved. Copying, including
- *  reproducing, storing, adapting or translating, any
- *  or all of this material requires the prior written consent of
- *  Nokia. This material also contains confidential
- *  information which may not be disclosed to others without the
- *  prior written consent of Nokia.
- * =============================================================================
- */
-
-
-// INCLUDE FILES
-#include <platform.h>
-#include <kern_priv.h>
-
-#include "virtualvideointerfaceconstants.h"
-#include "virtualvideohwinterface.h"
-#include "virtualvideotracing.h"
-
-
-// CONSTANTS
-
-_LIT( KVirtualVideoHwInterfacePanic, "DVirtualVideoHwInterface" );
-
-// ============================ LOCAL DATA TYPES ===============================
-
-// Register offsets for playback and recording channels
-// Note: The orders of these must match the order of enumarations
-const TLinAddr KRegisterOffsets[] =
-    {
-    VVI_R_ID,
-    VVI_R_IRQ_ENABLE,
-    VVI_R_IRQ_STATUS,
-    VVI_R_COMMAND,
-    VVI_R_PARAMETER_LOAD,
-    VVI_R_ERROR,
-    VVI_R_INPUT_BUFFER_TAIL,
-    VVI_R_INPUT_BUFFER_HEAD,
-    VVI_R_INPUT_BUFFER_READ_COUNT,
-    VVI_R_INPUT_BUFFER_WRITE_COUNT,
-    VVI_R_INPUT_BUFFER_MAX_TAIL,
-    VVI_R_REQUEST_ID
-    };
-#define ASSERT_PANIC(c,p) __ASSERT_DEBUG(c,Kern::PanicCurrentThread(KVirtualVideoHwInterfacePanic,p));
-
-// ============================ LOCAL FUNCTIONS ================================
-
-// Get register offset for certain register range and register
-inline TLinAddr RegisterOffset( DVirtualVideoHwInterface::TRegister aRegister )
-    {
-    return KRegisterOffsets[aRegister];
-    }
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// DVirtualVideoHwInterface::DVirtualVideoHwInterface
-// -----------------------------------------------------------------------------
-//
-DVirtualVideoHwInterface::DVirtualVideoHwInterface()
-    {
-    iInputParametersMemoryChunk = NULL;
-    iOutputParametersMemoryChunk = NULL;
-    iRegisterMemoryChunk = NULL;
-    }
-
-
-// -----------------------------------------------------------------------------
-// DVirtualVideoHwInterface::~DVirtualVideoHwInterface
-// -----------------------------------------------------------------------------
-//
-DVirtualVideoHwInterface::~DVirtualVideoHwInterface()
-    {
-    // Enter critical section
-    NKern::ThreadEnterCS();
-
-    if ( iInputParametersMemoryChunk )
-        {
-        Kern::ChunkClose( iInputParametersMemoryChunk );
-        }
-
-    if ( iOutputParametersMemoryChunk )
-        {
-        Kern::ChunkClose( iOutputParametersMemoryChunk );
-        }
-
-    if ( iRegisterMemoryChunk )
-        {
-        Kern::ChunkClose( iRegisterMemoryChunk );
-        }
-
-    iInputParametersMemoryChunk = NULL;
-    iOutputParametersMemoryChunk = NULL;
-    iRegisterMemoryChunk = NULL;
-
-    // Leave critical section
-    NKern::ThreadLeaveCS();
-    }
-
-TInt DVirtualVideoHwInterface::InitParametersInputMemory()
-    {
-    return InitPhysicalMemory( VVI_PARAMETERS_INPUT_BASE_ADDRESS, 
-            VVI_PARAMETERS_INPUT_MEMORY_SIZE, iInputParametersMemoryChunk, 
-            iInputParametersChunkKernelAddress );    
-    }
-
-TInt DVirtualVideoHwInterface::InitParametersOutputMemory()
-    {
-    return InitPhysicalMemory( VVI_PARAMETERS_OUTPUT_BASE_ADDRESS, 
-            VVI_PARAMETERS_OUTPUT_MEMORY_SIZE, iOutputParametersMemoryChunk, 
-            iOutputParametersChunkKernelAddress );    
-    }
-
-TInt DVirtualVideoHwInterface::InitRegisterMemory()
-    {
-    return InitPhysicalMemory( VVI_REGISTERS_BASE_ADDRESS, 
-            VVI_REGISTERS_MEMORY_SIZE, iRegisterMemoryChunk, 
-            iRegisterChunkKernelAddress );        
-    }
-
-// -----------------------------------------------------------------------------
-// DVirtualVideoHwInterface::InitPhysicalMemory
-// -----------------------------------------------------------------------------
-//
-TInt DVirtualVideoHwInterface::InitPhysicalMemory( TUint32 aPhysicalAddress, 
-        TInt aMaxSize, DChunk*& aChunk, TLinAddr& aLinAddr )
-    {
-    TInt error = KErrNoMemory;
-    TChunkCreateInfo info;
-    info.iType = TChunkCreateInfo::ESharedKernelSingle;
-    info.iMaxSize = aMaxSize;
-	info.iMapAttr = EMapAttrFullyBlocking;
-    info.iOwnsMemory = EFalse;
-    info.iDestroyedDfc = NULL;
-    DChunk* chunk = NULL;
-    TUint32 mapAttr = 0;
-    TLinAddr chunkKernelAddress = 0;
-    
-    // Enter critical section while creating the chunk and commiting memory
-    NKern::ThreadEnterCS();
-
-    error = Kern::ChunkCreate( info, chunk, chunkKernelAddress, mapAttr );
-    if ( !error )
-        {
-        error = Kern::ChunkCommitPhysical(
-            chunk, 0, aMaxSize, aPhysicalAddress );
-        if ( error )
-            {
-            Kern::ChunkClose( chunk );
-            }
-        else
-            {
-            // Physical memory has been successfully committed to chunk
-            aChunk = chunk; 
-            aLinAddr = chunkKernelAddress;
-            }
-        }
-    chunk = NULL;
-
-    // Leave critical section
-    NKern::ThreadLeaveCS();
-    
-    VVHW_TRACE("DVirtualVideoHwInterface::InitPhysicalMemory return %d", error);
-    return error;
-    }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-// DVirtualVideoHwInterface::EnableInterrupts
-// -----------------------------------------------------------------------------
-//
-void DVirtualVideoHwInterface::EnableInterrupts( TUint32 aInterruptBitField )
-    {
-    SetRegisterValue( ERegIrqEnable, aInterruptBitField );
-    }
-
-
-// -----------------------------------------------------------------------------
-// DVirtualVideoHwInterface::GetInterruptEnabledState
-// -----------------------------------------------------------------------------
-//
-void DVirtualVideoHwInterface::GetInterruptEnabledState( TUint32& aInterruptBitField )
-    {
-    GetRegisterValue( ERegIrqEnable, aInterruptBitField );
-    }
-
-
-// -----------------------------------------------------------------------------
-// DVirtualVideoHwInterface::GetInterruptStatus
-// -----------------------------------------------------------------------------
-//
-void DVirtualVideoHwInterface::GetInterruptStatus( TUint32& aInterruptBitField )
-    {
-    GetRegisterValue( ERegIrqStatus, aInterruptBitField );
-    }
-
-
-// -----------------------------------------------------------------------------
-// DVirtualVideoHwInterface::ResetInterruptStatus
-// -----------------------------------------------------------------------------
-//
-void DVirtualVideoHwInterface::ResetInterruptStatus( TUint32 aInterruptBitField )
-    {
-    SetRegisterValue( ERegIrqStatus, aInterruptBitField );
-    }
-
-
-// DVirtualVideoHwInterface::IssueCommand
-// -----------------------------------------------------------------------------
-//
-void DVirtualVideoHwInterface::IssueCommand( TUint32 aCommand )
-    {
-    SetRegisterValue( ERegCommand, aCommand );
-    }
-
-// -----------------------------------------------------------------------------
-// DVirtualVideoHwInterface::GetRegisterValue
-// -----------------------------------------------------------------------------
-//
-void DVirtualVideoHwInterface::GetRegisterValue(
-    TRegister aRegister,
-    TUint32& aValue )
-    {
-    if ( iRegisterMemoryChunk )
-        {
-        TLinAddr offset = RegisterOffset( aRegister );
-        TUint32* ptr = reinterpret_cast<TUint32*>( iRegisterChunkKernelAddress + offset );
-        aValue = *ptr;
-        }
-    else
-        {
-        Kern::PanicCurrentThread( KVirtualVideoHwInterfacePanic, KErrNotReady );
-        }
-    }
-
-
-// -----------------------------------------------------------------------------
-// DVirtualVideoHwInterface::SetRegisterValue
-// -----------------------------------------------------------------------------
-//
-void DVirtualVideoHwInterface::SetRegisterValue(
-    TRegister aRegister,
-    TUint32 aValue )
-    {
-    if ( iRegisterMemoryChunk )
-        {
-        TLinAddr offset = RegisterOffset( aRegister );
-        TUint32* ptr = reinterpret_cast<TUint32*>( iRegisterChunkKernelAddress + offset );
-        *ptr = aValue;
-        }
-    else
-        {
-        Kern::PanicCurrentThread( KVirtualVideoHwInterfacePanic, KErrNotReady );
-        }
-    }
-
-
-// End of file
+/*
+ * =============================================================================
+ *  Name        : virtualvideohwinterface.cpp
+ *  Part of     : 
+ *  Description : Implementation file for the class DVirtualVideoHwInterface.
+ *  Version     : %version:3 %
+ *
+ *  Copyright © 2002-2009 Nokia. All rights reserved.
+ *  This material, including documentation and any related
+ *  computer programs, is protected by copyright controlled by
+ *  Nokia. All rights are reserved. Copying, including
+ *  reproducing, storing, adapting or translating, any
+ *  or all of this material requires the prior written consent of
+ *  Nokia. This material also contains confidential
+ *  information which may not be disclosed to others without the
+ *  prior written consent of Nokia.
+ * =============================================================================
+ */
+
+
+// INCLUDE FILES
+#include <platform.h>
+#include <kern_priv.h>
+
+#include <graphics/guestvideodriverinterfaceconstants.h>
+#include <graphics/virtualvideohwinterface.h>
+#include <graphics/virtualvideotracing.h>
+
+
+// CONSTANTS
+
+_LIT( KVirtualVideoHwInterfacePanic, "DVirtualVideoHwInterface" );
+
+// ============================ LOCAL DATA TYPES ===============================
+
+// Register offsets for playback and recording channels
+// Note: The orders of these must match the order of enumarations
+const TLinAddr KRegisterOffsets[] =
+    {
+    VVI_R_ID,
+    VVI_R_IRQ_ENABLE,
+    VVI_R_IRQ_STATUS,
+    VVI_R_COMMAND,
+    VVI_R_PARAMETER_LOAD,
+    VVI_R_ERROR,
+    VVI_R_INPUT_BUFFER_TAIL,
+    VVI_R_INPUT_BUFFER_HEAD,
+    VVI_R_INPUT_BUFFER_READ_COUNT,
+    VVI_R_INPUT_BUFFER_WRITE_COUNT,
+    VVI_R_INPUT_BUFFER_MAX_TAIL,
+    VVI_R_REQUEST_ID
+    };
+#define ASSERT_PANIC(c,p) __ASSERT_DEBUG(c,Kern::PanicCurrentThread(KVirtualVideoHwInterfacePanic,p));
+
+// ============================ LOCAL FUNCTIONS ================================
+
+// Get register offset for certain register range and register
+inline TLinAddr RegisterOffset( DVirtualVideoHwInterface::TRegister aRegister )
+    {
+    return KRegisterOffsets[aRegister];
+    }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwInterface::DVirtualVideoHwInterface
+// -----------------------------------------------------------------------------
+//
+DVirtualVideoHwInterface::DVirtualVideoHwInterface()
+    {
+    iInputParametersMemoryChunk = NULL;
+    iOutputParametersMemoryChunk = NULL;
+    iRegisterMemoryChunk = NULL;
+    }
+
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwInterface::~DVirtualVideoHwInterface
+// -----------------------------------------------------------------------------
+//
+DVirtualVideoHwInterface::~DVirtualVideoHwInterface()
+    {
+    // Enter critical section
+    NKern::ThreadEnterCS();
+
+    if ( iInputParametersMemoryChunk )
+        {
+        Kern::ChunkClose( iInputParametersMemoryChunk );
+        }
+
+    if ( iOutputParametersMemoryChunk )
+        {
+        Kern::ChunkClose( iOutputParametersMemoryChunk );
+        }
+
+    if ( iRegisterMemoryChunk )
+        {
+        Kern::ChunkClose( iRegisterMemoryChunk );
+        }
+
+    iInputParametersMemoryChunk = NULL;
+    iOutputParametersMemoryChunk = NULL;
+    iRegisterMemoryChunk = NULL;
+
+    // Leave critical section
+    NKern::ThreadLeaveCS();
+    }
+
+TInt DVirtualVideoHwInterface::InitParametersInputMemory()
+    {
+    return InitPhysicalMemory( VVI_PARAMETERS_INPUT_BASE_ADDRESS, 
+            VVI_PARAMETERS_INPUT_MEMORY_SIZE, iInputParametersMemoryChunk, 
+            iInputParametersChunkKernelAddress );    
+    }
+
+TInt DVirtualVideoHwInterface::InitParametersOutputMemory()
+    {
+    return InitPhysicalMemory( VVI_PARAMETERS_OUTPUT_BASE_ADDRESS, 
+            VVI_PARAMETERS_OUTPUT_MEMORY_SIZE, iOutputParametersMemoryChunk, 
+            iOutputParametersChunkKernelAddress );    
+    }
+
+TInt DVirtualVideoHwInterface::InitRegisterMemory()
+    {
+    return InitPhysicalMemory( VVI_REGISTERS_BASE_ADDRESS, 
+            VVI_REGISTERS_MEMORY_SIZE, iRegisterMemoryChunk, 
+            iRegisterChunkKernelAddress );        
+    }
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwInterface::InitPhysicalMemory
+// -----------------------------------------------------------------------------
+//
+TInt DVirtualVideoHwInterface::InitPhysicalMemory( TUint32 aPhysicalAddress, 
+        TInt aMaxSize, DChunk*& aChunk, TLinAddr& aLinAddr )
+    {
+    TInt error = KErrNoMemory;
+    TChunkCreateInfo info;
+    info.iType = TChunkCreateInfo::ESharedKernelSingle;
+    info.iMaxSize = aMaxSize;
+	info.iMapAttr = EMapAttrFullyBlocking;
+    info.iOwnsMemory = EFalse;
+    info.iDestroyedDfc = NULL;
+    DChunk* chunk = NULL;
+    TUint32 mapAttr = 0;
+    TLinAddr chunkKernelAddress = 0;
+    
+    // Enter critical section while creating the chunk and commiting memory
+    NKern::ThreadEnterCS();
+
+    error = Kern::ChunkCreate( info, chunk, chunkKernelAddress, mapAttr );
+    if ( !error )
+        {
+        error = Kern::ChunkCommitPhysical(
+            chunk, 0, aMaxSize, aPhysicalAddress );
+        if ( error )
+            {
+            Kern::ChunkClose( chunk );
+            }
+        else
+            {
+            // Physical memory has been successfully committed to chunk
+            aChunk = chunk; 
+            aLinAddr = chunkKernelAddress;
+            }
+        }
+    chunk = NULL;
+
+    // Leave critical section
+    NKern::ThreadLeaveCS();
+    
+    VVHW_TRACE("DVirtualVideoHwInterface::InitPhysicalMemory return %d", error);
+    return error;
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwInterface::EnableInterrupts
+// -----------------------------------------------------------------------------
+//
+void DVirtualVideoHwInterface::EnableInterrupts( TUint32 aInterruptBitField )
+    {
+    SetRegisterValue( ERegIrqEnable, aInterruptBitField );
+    }
+
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwInterface::GetInterruptEnabledState
+// -----------------------------------------------------------------------------
+//
+void DVirtualVideoHwInterface::GetInterruptEnabledState( TUint32& aInterruptBitField )
+    {
+    GetRegisterValue( ERegIrqEnable, aInterruptBitField );
+    }
+
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwInterface::GetInterruptStatus
+// -----------------------------------------------------------------------------
+//
+void DVirtualVideoHwInterface::GetInterruptStatus( TUint32& aInterruptBitField )
+    {
+    GetRegisterValue( ERegIrqStatus, aInterruptBitField );
+    }
+
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwInterface::ResetInterruptStatus
+// -----------------------------------------------------------------------------
+//
+void DVirtualVideoHwInterface::ResetInterruptStatus( TUint32 aInterruptBitField )
+    {
+    SetRegisterValue( ERegIrqStatus, aInterruptBitField );
+    }
+
+
+// DVirtualVideoHwInterface::IssueCommand
+// -----------------------------------------------------------------------------
+//
+void DVirtualVideoHwInterface::IssueCommand( TUint32 aCommand )
+    {
+    SetRegisterValue( ERegCommand, aCommand );
+    }
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwInterface::GetRegisterValue
+// -----------------------------------------------------------------------------
+//
+void DVirtualVideoHwInterface::GetRegisterValue(
+    TRegister aRegister,
+    TUint32& aValue )
+    {
+    if ( iRegisterMemoryChunk )
+        {
+        TLinAddr offset = RegisterOffset( aRegister );
+        TUint32* ptr = reinterpret_cast<TUint32*>( iRegisterChunkKernelAddress + offset );
+        aValue = *ptr;
+        }
+    else
+        {
+        Kern::PanicCurrentThread( KVirtualVideoHwInterfacePanic, KErrNotReady );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwInterface::SetRegisterValue
+// -----------------------------------------------------------------------------
+//
+void DVirtualVideoHwInterface::SetRegisterValue(
+    TRegister aRegister,
+    TUint32 aValue )
+    {
+    if ( iRegisterMemoryChunk )
+        {
+        TLinAddr offset = RegisterOffset( aRegister );
+        TUint32* ptr = reinterpret_cast<TUint32*>( iRegisterChunkKernelAddress + offset );
+        *ptr = aValue;
+        }
+    else
+        {
+        Kern::PanicCurrentThread( KVirtualVideoHwInterfacePanic, KErrNotReady );
+        }
+    }
+
+
+// End of file
--- a/guestrendering/guestvideodriver/rom/guestvideodriver.iby	Fri Aug 20 18:02:40 2010 +0100
+++ b/guestrendering/guestvideodriver/rom/guestvideodriver.iby	Wed Aug 25 17:57:53 2010 +0100
@@ -1,27 +1,27 @@
-// Copyright (c) 2010 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:
-// ROM IBY file for Guest Video Driver
-
-#ifndef GUESTVIDEODRIVER_IBY
-#define GUESTVIDEODRIVER_IBY
-
-
-file=ABI_DIR\BUILD_DIR\guestvideohwapi.dll                SHARED_LIB_DIR\guestvideohwapi.dll
-
-extension[VARID]=KERNEL_DIR\BUILD_DIR\reqhandlerextension.dll   \sys\bin\reqhandlerextension.dll
-device[VARID]=KERNEL_DIR\BUILD_DIR\guestvideohw.ldd         \sys\bin\guestvideohw.ldd
-
-#endif // GUESTVIDEODRIVER_IBY
-
-//  End of File
+// Copyright (c) 2010 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:
+// ROM IBY file for Guest Video Driver
+
+#ifndef GUESTVIDEODRIVER_IBY
+#define GUESTVIDEODRIVER_IBY
+
+
+file=ABI_DIR\BUILD_DIR\guestvideohwapi.dll                SHARED_LIB_DIR\guestvideohwapi.dll
+
+extension[VARID]=KERNEL_DIR\BUILD_DIR\reqhandlerextension.dll   \sys\bin\reqhandlerextension.dll
+device[VARID]=KERNEL_DIR\BUILD_DIR\guestvideohw.ldd         \sys\bin\guestvideohw.ldd
+
+#endif // GUESTVIDEODRIVER_IBY
+
+//  End of File
--- a/guestrendering/vghwserialiser/eabi/vghwserialiseru.def	Fri Aug 20 18:02:40 2010 +0100
+++ b/guestrendering/vghwserialiser/eabi/vghwserialiseru.def	Wed Aug 25 17:57:53 2010 +0100
@@ -1,28 +1,28 @@
-EXPORTS
-	_ZN18RemoteFunctionCall11AppendParamElPKhN22RemoteFunctionCallData15TParamDirectionE @ 1 NONAME
-	_ZN18RemoteFunctionCall11ReturnValueEv @ 2 NONAME
-	_ZN18RemoteFunctionCall12AppendVectorElmPKhN22RemoteFunctionCallData15TParamDirectionE @ 3 NONAME
-	_ZN18RemoteFunctionCall12SetParamDataElPKhi @ 4 NONAME
-	_ZN18RemoteFunctionCall13SetVectorDataElPKhii @ 5 NONAME
-	_ZN18RemoteFunctionCall14SetReturnValueEm @ 6 NONAME
-	_ZN18RemoteFunctionCall4DataEv @ 7 NONAME
-	_ZN18RemoteFunctionCall4InitElN22RemoteFunctionCallData14TOperationTypeE @ 8 NONAME
-	_ZN18RemoteFunctionCallC2ER22RemoteFunctionCallData @ 9 NONAME
-	_ZN22RemoteFunctionCallData10AlignIndexEil @ 10 NONAME
-	_ZN22RemoteFunctionCallData10ParametersEv @ 11 NONAME
-	_ZN22RemoteFunctionCallData13GetParamValueElPhi @ 12 NONAME
-	_ZN22RemoteFunctionCallData13GetVectorDataElPPvRii @ 13 NONAME
-	_ZN22RemoteFunctionCallData14ParameterCountEv @ 14 NONAME
-	_ZN22RemoteFunctionCallData14SetReturnValueEm @ 15 NONAME
-	_ZN22RemoteFunctionCallData16SetOperationTypeEl @ 16 NONAME
-	_ZN22RemoteFunctionCallData16SetTransactionIdEm @ 17 NONAME
-	_ZN22RemoteFunctionCallData20SetThreadInformationEmm @ 18 NONAME
-	_ZN22RemoteFunctionCallData8CopyDataEPhPKhl @ 19 NONAME
-	_ZN22SerializedFunctionCall11ParseBufferEPKhi @ 20 NONAME
-	_ZN22SerializedFunctionCall13SetDataCopierEP11MDataCopier @ 21 NONAME
-	_ZN22SerializedFunctionCall13WriteToBufferEPhii @ 22 NONAME
-	_ZN22SerializedFunctionCallC1ER22RemoteFunctionCallDataP11MDataCopier @ 23 NONAME
-	_ZN22SerializedFunctionCallC2ER22RemoteFunctionCallDataP11MDataCopier @ 24 NONAME
-	_ZNK22RemoteFunctionCallData16SerialisedLengthEv @ 25 NONAME
-	_ZNK22RemoteFunctionCallData6HeaderEv @ 26 NONAME
-
+EXPORTS
+	_ZN18RemoteFunctionCall11AppendParamElPKhN22RemoteFunctionCallData15TParamDirectionE @ 1 NONAME
+	_ZN18RemoteFunctionCall11ReturnValueEv @ 2 NONAME
+	_ZN18RemoteFunctionCall12AppendVectorElmPKhN22RemoteFunctionCallData15TParamDirectionE @ 3 NONAME
+	_ZN18RemoteFunctionCall12SetParamDataElPKhi @ 4 NONAME
+	_ZN18RemoteFunctionCall13SetVectorDataElPKhii @ 5 NONAME
+	_ZN18RemoteFunctionCall14SetReturnValueEm @ 6 NONAME
+	_ZN18RemoteFunctionCall4DataEv @ 7 NONAME
+	_ZN18RemoteFunctionCall4InitElN22RemoteFunctionCallData14TOperationTypeE @ 8 NONAME
+	_ZN18RemoteFunctionCallC2ER22RemoteFunctionCallData @ 9 NONAME
+	_ZN22RemoteFunctionCallData10AlignIndexEil @ 10 NONAME
+	_ZN22RemoteFunctionCallData10ParametersEv @ 11 NONAME
+	_ZN22RemoteFunctionCallData13GetParamValueElPhi @ 12 NONAME
+	_ZN22RemoteFunctionCallData13GetVectorDataElPPvRii @ 13 NONAME
+	_ZN22RemoteFunctionCallData14ParameterCountEv @ 14 NONAME
+	_ZN22RemoteFunctionCallData14SetReturnValueEm @ 15 NONAME
+	_ZN22RemoteFunctionCallData16SetOperationTypeEl @ 16 NONAME
+	_ZN22RemoteFunctionCallData16SetTransactionIdEm @ 17 NONAME
+	_ZN22RemoteFunctionCallData20SetThreadInformationEmm @ 18 NONAME
+	_ZN22RemoteFunctionCallData8CopyDataEPhPKhl @ 19 NONAME
+	_ZN22SerializedFunctionCall11ParseBufferEPKhi @ 20 NONAME
+	_ZN22SerializedFunctionCall13SetDataCopierEP11MDataCopier @ 21 NONAME
+	_ZN22SerializedFunctionCall13WriteToBufferEPhii @ 22 NONAME
+	_ZN22SerializedFunctionCallC1ER22RemoteFunctionCallDataP11MDataCopier @ 23 NONAME
+	_ZN22SerializedFunctionCallC2ER22RemoteFunctionCallDataP11MDataCopier @ 24 NONAME
+	_ZNK22RemoteFunctionCallData16SerialisedLengthEv @ 25 NONAME
+	_ZNK22RemoteFunctionCallData6HeaderEv @ 26 NONAME
+
--- a/guestrendering/vghwserialiser/group/vghwserialiser.mmp	Fri Aug 20 18:02:40 2010 +0100
+++ b/guestrendering/vghwserialiser/group/vghwserialiser.mmp	Wed Aug 25 17:57:53 2010 +0100
@@ -1,39 +1,39 @@
-// Copyright (c) 2010 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:
-
-
-TARGET		  	vghwserialiser.dll
-TARGETTYPE	  	dll
-UID				0x1000008d 0x2002B6E2
-capability      CAP_GENERAL_DLL //All-Tcb
-vendorid        VID_DEFAULT //0x101FB657 //Nokia vendor id 
-
-OS_LAYER_SYSTEMINCLUDE
-OS_LAYER_ESTLIB_SYSTEMINCLUDE
-
-USERINCLUDE     ../inc
-SOURCEPATH      ../src
-
-SOURCE remotefunctioncall.cpp
-SOURCE serializedfunctioncall.cpp
-
-DEFFILE ../eabi/vghwserialiser.def
-
-LIBRARY euser.lib
-
-#ifdef ENABLE_ABIV2_MODE
-  DEBUGGABLE_UDEBONLY
-#endif
-
-//EPOCALLOWDLLDATA
+// Copyright (c) 2010 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:
+
+
+TARGET		  	vghwserialiser.dll
+TARGETTYPE	  	dll
+UID				0x1000008d 0x2002B6E2
+capability      CAP_GENERAL_DLL //All-Tcb
+vendorid        VID_DEFAULT //0x101FB657 //Nokia vendor id 
+
+OS_LAYER_SYSTEMINCLUDE
+OS_LAYER_ESTLIB_SYSTEMINCLUDE
+
+USERINCLUDE     ../inc
+SOURCEPATH      ../src
+
+SOURCE remotefunctioncall.cpp
+SOURCE serializedfunctioncall.cpp
+
+DEFFILE ../eabi/vghwserialiser.def
+
+LIBRARY euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+  DEBUGGABLE_UDEBONLY
+#endif
+
+//EPOCALLOWDLLDATA