Fix link errors and resolve bug235_bringup_0
authorFaisal Memon <faisal.memon@nokia.com>
Fri, 24 Sep 2010 13:15:40 +0100
branchbug235_bringup_0
changeset 42 2865e884ac3b
parent 41 2110890eb027 (diff)
parent 32 b23067389fdf (current diff)
child 43 36992771cbb1
Fix link errors and resolve
guestrendering/guestegl/src/guestegl.cpp
guestrendering/guestvideodriver/ldd/group/virtualvideohwdevice.mmp
guestrendering/vghwutils/eabi/vghwutilsu.def
--- a/guestrendering/guestegl/inc/guestegl.h	Thu Sep 23 15:54:53 2010 +0100
+++ b/guestrendering/guestegl/inc/guestegl.h	Fri Sep 24 13:15:40 2010 +0100
@@ -16,6 +16,7 @@
 #ifndef __GUEST__EGL_H
 #define __GUEST__EGL_H
 
+#include <graphics/surfacemanager.h>
 
 // CLASS DECLARATION
 typedef enum
@@ -52,13 +53,15 @@
     EGLSurface              iHostSurfaceId;
 	// Note: most member data is only used by Window surfaces
     TSurfaceId              iSurfaceId;        /*<! Target system surface allocated by EGL.                                              */
-    // FAISALMEMON HOLE 0                                                   
+    // FAISALMEMON HOLE 0
+    RSurfaceManager			iSurfaceManager;
+    RSurfaceUpdateSession	iSurfaceUpdateSession;
     void*                   iBuffer0;          /*<! Pointer to the first buffer pixels                                                   */
     void*                   iBuffer1;          /*<! Pointer to the second buffer pixels                                                  */
     TInt                    iBuffer0Index;          /*<! Pointer to the first buffer pixels                                                   */
     TInt                    iBuffer1Index;          /*<! Pointer to the second buffer pixels                                                  */
-    RChunk*                 iChunk;            /*<! chunk of the backbuffer surface memory                                               */
-    // FAISALMEMON HOLE 1
+    RChunk                  iChunk;            /*<! chunk of the backbuffer surface memory                                               */
+    TInt					iFrontBuffer;		// We assume zero based index, 0 -> iBuffer0, 1 -> iBuffer1 should be display
     RWindow*                iNativeWindow;
     EGLint                  iRedBits;
     EGLint                  iGreenBits;
--- a/guestrendering/guestegl/src/guestegl.cpp	Thu Sep 23 15:54:53 2010 +0100
+++ b/guestrendering/guestegl/src/guestegl.cpp	Fri Sep 24 13:15:40 2010 +0100
@@ -199,10 +199,97 @@
         }
 	}
 
-EGLSurface CGuestEGL::eglCreateWindowSurface(TEglThreadState&, int, int, void*, const int*)
+EGLSurface CGuestEGL::eglCreateWindowSurface(TEglThreadState& aThreadState, EGLDisplay aDisplay, EGLConfig aConfig, 
+		EGLNativeWindowType aNativeWindow, const EGLint *aAttribList)
 	{
-	return 0; // stub code
+
+	// FAISALMEMON NEW
+	/**
+	 * pseudo code:
+	 * 
+	 * surfacemamanger.
+	 * 	open()
+	 *   createsurface(2 buffers, width, height, pixel format,...)
+	 *   map surface -> get chunk
+	 * serialization.eglCreateWindowSurface(..)
+	 * eglinternalfunctioncreatesurface(chunk, width, height, ..)
+	 * egl.... setwindowsurfacebuffers(...)
+	 * surfaceupdatesession.connect()
+	 * wnd.setbackgroundsurface()
+	 */
+	EGL_TRACE( "CGuestEGL::eglCreateWindowSurface");
+	EGL_TRACE_ATTRIB_LIST(aAttribList);
+
+	RWindow* window;
+	window = (RWindow*) aNativeWindow;
+	TSize size = window->Size();
+	
+	TSurfaceInfo* surfaceInfo = NULL;
+	TSurfaceId surfaceId;
+
+    RSurfaceManager::TSurfaceCreationAttributesBuf buf;
+    RSurfaceManager::TSurfaceCreationAttributes& attributes = buf();
+
+    attributes.iSize = size;
+    attributes.iBuffers = 2;           // REQUIREMENT because host side assumes exactly two buffers
+    attributes.iPixelFormat = EUidPixelFormatARGB_8888;  // this is a guess; either query or hardcode to match syborg
+    attributes.iStride = 4 * size.iWidth;          // Number of bytes between start of one line and start of next
+    attributes.iOffsetToFirstBuffer = 0;
+    attributes.iAlignment = RSurfaceManager::EPageAligned;                      // alignment, 1,2,4,8,16,32,64 byte aligned or EPageAligned
+    attributes.iHintCount=0;  
+    attributes.iSurfaceHints = NULL;
+    attributes.iOffsetBetweenBuffers = 0;
+    attributes.iContiguous = ETrue;
+    attributes.iCacheAttrib = RSurfaceManager::ENotCached;      // Cache attributes
+
+	iDisplayMapLock.WriteLock();
+	CEglDisplayInfo** pDispInfo;
+	pDispInfo = iDisplayMap.Find(aDisplay);
+	
+	if (pDispInfo && *pDispInfo)
+			{
+			RHeap* threadHeap = CVghwUtils::SwitchToVghwHeap();
+	
+			surfaceInfo = new TSurfaceInfo();
+			if (surfaceInfo)
+				{
+				surfaceInfo->iNativeWindow = (RWindow*)aNativeWindow;
+				surfaceInfo->iConfigId = aConfig;
+				surfaceInfo->iSurfaceManager.Open();
+				surfaceInfo->iSurfaceManager.CreateSurface(buf, surfaceId);
+				(void) surfaceInfo->iSurfaceManager.MapSurface(surfaceId, surfaceInfo->iChunk);
+				RemoteFunctionCallData rfcdata;
+				EglRFC eglApiData( rfcdata );
+				eglApiData.Init( EglRFC::EeglCreateWindowSurface);
+				eglApiData.AppendEGLDisplay(aDisplay);
+				eglApiData.AppendEGLConfig(aConfig);
+				eglApiData.AppendEGLNativeWindowType(aNativeWindow);				
+				eglApiData.AppendEGLintVector(aAttribList, TAttribUtils::AttribListLength(aAttribList) );
+				eglApiData.AppendEGLint(size.iWidth);
+				eglApiData.AppendEGLint(size.iHeight);
+				eglApiData.AppendEGLint(1000); // horizontalPitch arbitrary
+				eglApiData.AppendEGLint(1000); // verticalPitch arbitrary
+				surfaceInfo->iHostSurfaceId = aThreadState.ExecEglSurfaceCmd(eglApiData); // todo check if is valid
+				(*pDispInfo)->iSurfaceMap.Insert(surfaceInfo->iHostSurfaceId, surfaceInfo);
+				EglInternalFunction_CreateSurface(aThreadState, aDisplay, surfaceInfo->iHostSurfaceId, aConfig, window, *surfaceInfo);
+				surfaceInfo->iSurfaceUpdateSession.Connect();
+				TSurfaceConfiguration surfaceConfig;
+				surfaceConfig.SetSurfaceId(surfaceId);
+				window->SetBackgroundSurface(surfaceConfig, ETrue);
+				}
+			CVghwUtils::SwitchFromVghwHeap(threadHeap);
+			}
+	
+		iDisplayMapLock.Unlock();
+		
+	aThreadState.SetEglError(EGL_SUCCESS);
+
+	return surfaceInfo->iHostSurfaceId;
+	
+	// FAISALMEMON END OF NEW
+	
 	}
+
 const char* CGuestEGL::eglQueryString(EGLDisplay aDisplay, EGLint aName)
 	{
 	return NULL; // stub code
@@ -902,22 +989,56 @@
 
 EGLBoolean CGuestEGL::eglSwapBuffers(TEglThreadState& aThreadState, EGLDisplay aDisplay, EGLSurface aSurface)
     {
-    EglInternalFunction_SwapWindowSurface(aThreadState, aDisplay, aSurface);
-
-    // ToDo when all surfaces are recorded in client validate BEFORE sending cmd to host
+	/**
+	 * PSEUDO CODE
+	 * serialization.eglSwapBuffers
+	 * (maybe finish currently bound api)
+	 * surfaceupdatesession.notifywhenavailable
+	 *   .whendisplayed()  (alternative choice from above)
+	 * surfaceupdatesession.submitupdated()
+	 * user:waitforrequestl
+	 */
+	
+	RHeap* threadHeap = CVghwUtils::SwitchToVghwHeap();
     TSurfaceInfo* surfaceInfo = EglInternalFunction_GetPlatformSurface( aDisplay, aSurface );
-    EGL_CHECK_ERROR( surfaceInfo, EGL_BAD_SURFACE, EGL_FALSE );
+	RemoteFunctionCallData rfcdata;
+	EglRFC eglApiData( rfcdata );
+	eglApiData.Init(EglRFC::EeglSwapBuffers);
+	TSize size = surfaceInfo->iNativeWindow->Size();
+	
+	eglApiData.AppendEGLDisplay(aDisplay);
+	eglApiData.AppendEGLSurface(surfaceInfo->iHostSurfaceId);
+	eglApiData.AppendEGLint(size.iWidth);
+	eglApiData.AppendEGLint(size.iHeight);
 
-    //Check if surface size has changed
-    TSize size = surfaceInfo->iNativeWindow->Size();
-
+	EGLBoolean result = aThreadState.ExecEglBooleanCmd(eglApiData);
+	TRequestStatus status;
+	TTimeStamp timestampLocalToThread;
+	surfaceInfo->iSurfaceUpdateSession.NotifyWhenDisplayed(status, timestampLocalToThread);
+	surfaceInfo->iSurfaceUpdateSession.SubmitUpdate(surfaceInfo->iNativeWindow->ScreenNumber(),surfaceInfo->iSurfaceId, surfaceInfo->iFrontBuffer);
+	User::WaitForRequest(status);
+	
+	if (surfaceInfo->iFrontBuffer == 0)
+		{
+		surfaceInfo->iFrontBuffer = 1;
+		}
+	else
+		{
+		surfaceInfo->iFrontBuffer = 0;
+		}
+	
     if (size != surfaceInfo->iSize)
         {
 		EGL_TRACE("CGuestEGL::eglSwapBuffers Surface Resized size=%d,%d, surfaceInfo->iSize=%d,%d",
 				size.iHeight, size.iWidth, surfaceInfo->iSize.iHeight, surfaceInfo->iSize.iWidth);
-        return EglInternalFunction_SurfaceResized(aThreadState, *surfaceInfo, aDisplay, aSurface);
+		
+		CVghwUtils::SwitchFromVghwHeap(threadHeap);
+        return EglInternalFunction_SurfaceResized(aThreadState, *surfaceInfo, aDisplay, aSurface); // TODO handling of resize
         }
-    return EGL_TRUE;
+    
+	CVghwUtils::SwitchFromVghwHeap(threadHeap);
+
+	return result;
     }
 
 EGLBoolean CGuestEGL::eglMakeCurrent(TEglThreadState& aThreadState, EGLDisplay aDisplay, EGLSurface aDraw, EGLSurface aRead, EGLContext aContext)
@@ -1080,20 +1201,22 @@
     // FAISALMEMON END OF STUB CODE
     
     TUint32 chunkHWBase = 0;
-    (void)CVghwUtils::MapToHWAddress(aSurfaceInfo.iChunk->Handle(), chunkHWBase);
+    (void)CVghwUtils::MapToHWAddress(aSurfaceInfo.iChunk.Handle(), chunkHWBase);
     // FAISALMEMON write code to handle errors in the above function
     EGL_TRACE("CGuestEGL::EglInternalFunction_CreateSurface AFTER VGHWUtils::MapToHWAddress");
 
 	TUint32 surfaceBufferBaseAddress(0);
 	(void)CVghwUtils::GetSurfaceBufferBaseAddress(surfaceBufferBaseAddress);
-	EGL_TRACE("CGuestEGL::egliCreateSurface AFTER VGHWUtils::MapToHWAddress");
+	EGL_TRACE("CPlatsimEGL::egliCreateSurface AFTER VGHWUtils::MapToHWAddress");
 
     /* Store the pointer to the pixel data */
-    aSurfaceInfo.iBuffer0 = aSurfaceInfo.iChunk->Base() + offsetToFirstBuffer;
-    aSurfaceInfo.iBuffer1 = aSurfaceInfo.iChunk->Base() + offsetToSecondBuffer;
+    aSurfaceInfo.iBuffer0 = aSurfaceInfo.iChunk.Base() + offsetToFirstBuffer;
+    aSurfaceInfo.iBuffer1 = aSurfaceInfo.iChunk.Base() + offsetToSecondBuffer;
 
     aSurfaceInfo.iBuffer0Index = (chunkHWBase + offsetToFirstBuffer) -  surfaceBufferBaseAddress;
     aSurfaceInfo.iBuffer1Index = (chunkHWBase + offsetToSecondBuffer) - surfaceBufferBaseAddress;
+    
+    aSurfaceInfo.iFrontBuffer = 0; // Assume host peer also starts rendering buffer 0 as its front buffer
     EGL_TRACE("CGuestEGL::EglInternalFunction_CreateSurface %u %x %x %x %x",chunkHWBase, offsetToFirstBuffer, offsetToSecondBuffer,
     		aSurfaceInfo.iBuffer0Index,
     		aSurfaceInfo.iBuffer1Index);
--- a/guestrendering/guestopenvg/rom/guestopenvg.iby	Thu Sep 23 15:54:53 2010 +0100
+++ b/guestrendering/guestopenvg/rom/guestopenvg.iby	Fri Sep 24 13:15:40 2010 +0100
@@ -18,6 +18,5 @@
 
 file=ABI_DIR\BUILD_DIR\guestopenvg.dll   sys\bin\libopenvg.dll
 file=ABI_DIR\BUILD_DIR\guestopenvgu.dll  sys\bin\libopenvgu.dll
-file=ABI_DIR\BUILD_DIR\vghwutils.dll  sys\bin\vghwutils.dll
 file=ABI_DIR\BUILD_DIR\vghwserialiser.dll sys\bin\vghwserialiser.dll
 #endif
--- a/guestrendering/guestvideodriver/ldd/group/virtualvideohwdevice.mmp	Thu Sep 23 15:54:53 2010 +0100
+++ b/guestrendering/guestvideodriver/ldd/group/virtualvideohwdevice.mmp	Fri Sep 24 13:15:40 2010 +0100
@@ -33,8 +33,11 @@
 USERINCLUDE     ../inc
 USERINCLUDE     ../../commoninc
 
-#include <../../../../../../adaptation/qemu/baseport/syborg/variant.mmh>
-USERINCLUDE ../../../../../../adaptation/qemu/baseport/syborg/specific
+// NOTE the old name was "adaptation".  The new layer name is "adapt".
+// If your repository is off ...adaptation, re-sync it from its new home
+// for example http://developer.symbian.org/oss/FCL/sf/adapt/qemu
+#include <../../../../../../adapt/qemu/baseport/syborg/variant.mmh>
+USERINCLUDE ../../../../../../adapt/qemu/baseport/syborg/specific
 
 SYSTEMINCLUDE   /epoc32/include/drivers
 
--- a/guestrendering/vghwutils/eabi/vghwutilsu.def	Thu Sep 23 15:54:53 2010 +0100
+++ b/guestrendering/vghwutils/eabi/vghwutilsu.def	Fri Sep 24 13:15:40 2010 +0100
@@ -1,36 +1,32 @@
-EXPORTS
-	_Z9VghwPanic10TVghwPanicPcS0_S0_i @ 1 NONAME
-	_ZN10CVghwUtils14MapToHWAddressEiRm @ 2 NONAME
-	_ZN10CVghwUtils20DriverExecuteCommandER22RemoteFunctionCallData @ 3 NONAME
-	_ZN10CVghwUtils11InitStaticsEv @ 4 NONAME
-	_ZN10CVghwUtils5AllocEi @ 5 NONAME
-	_ZN10CVghwUtils4FreeEPv @ 6 NONAME
-	_ZN10CVghwUtils7GetHeapEv @ 7 NONAME
-	_ZN10CVghwUtils16SwitchToVghwHeapEv @ 8 NONAME
-	_ZN10CVghwUtils18SwitchFromVghwHeapEP5RHeap @ 9 NONAME
-	Reserved10 @ 10 NONAME ABSENT
-	Reserved11 @ 11 NONAME ABSENT
-	_ZN10CVghwUtils17CreateThreadStateEv @ 12 NONAME
-	_ZN10CVghwUtils18ReleaseThreadStateEv @ 13 NONAME
-	_ZN10CVghwUtils14EglThreadStateEv @ 14 NONAME
-	_ZN10CVghwUtils9VgContextEv @ 15 NONAME
-	_ZN10CVghwUtils11GlesContextEv @ 16 NONAME
-	_ZN15TEglThreadState8EglErrorEv @ 17 NONAME
-	_ZN15TEglThreadState17ExecEglBooleanCmdER6EglRFC @ 18 NONAME
-	_ZN15TEglThreadState17ExecEglContextCmdER6EglRFC @ 19 NONAME
-	_ZN15TEglThreadState17ExecEglSurfaceCmdER6EglRFC @ 20 NONAME
-	_ZN10CVghwUtils16EglManagementApiEv @ 21 NONAME
-	_ZN10CVghwUtils15EglGetSgHandlesEyPy @ 22 NONAME
-	_ZN10CVghwUtils14DestroyStaticsEv @ 23 NONAME
-	_ZN10CVghwUtils19SetEglManagementApiEP17MEglManagementApi @ 24 NONAME
-	_ZN10CVghwUtils14SetVgApiForEglEP12MVgApiForEgl @ 25 NONAME
-	_ZN10CVghwUtils18SetGles11ApiForEglEP16MGles11ApiForEgl @ 26 NONAME
-	_ZN10CVghwUtils17SetGles2ApiForEglEP15MGles2ApiForEgl @ 27 NONAME
-	_ZN10CVghwUtils11VgApiForEglEv @ 28 NONAME
-	_ZN10CVghwUtils15Gles11ApiForEglEv @ 29 NONAME
-	_ZN10CVghwUtils14Gles2ApiForEglEv @ 30 NONAME
-        _ZN10CVghwUtils27GetSurfaceBufferBaseAddressERm @ 31 NONAME
-
-
-
-
+EXPORTS
+	_Z9VghwPanic10TVghwPanicPcS0_S0_i @ 1 NONAME
+	_ZN10CVghwUtils14MapToHWAddressEiRm @ 2 NONAME
+	_ZN10CVghwUtils20DriverExecuteCommandER22RemoteFunctionCallData @ 3 NONAME
+	_ZN10CVghwUtils11InitStaticsEv @ 4 NONAME
+	_ZN10CVghwUtils5AllocEi @ 5 NONAME
+	_ZN10CVghwUtils4FreeEPv @ 6 NONAME
+	_ZN10CVghwUtils7GetHeapEv @ 7 NONAME
+	_ZN10CVghwUtils16SwitchToVghwHeapEv @ 8 NONAME
+	_ZN10CVghwUtils18SwitchFromVghwHeapEP5RHeap @ 9 NONAME
+	Reserved10 @ 10 NONAME ABSENT
+	Reserved11 @ 11 NONAME ABSENT
+	_ZN10CVghwUtils17CreateThreadStateEv @ 12 NONAME
+	_ZN10CVghwUtils18ReleaseThreadStateEv @ 13 NONAME
+	_ZN10CVghwUtils14EglThreadStateEv @ 14 NONAME
+	_ZN10CVghwUtils9VgContextEv @ 15 NONAME
+	_ZN10CVghwUtils11GlesContextEv @ 16 NONAME
+	_ZN15TEglThreadState8EglErrorEv @ 17 NONAME
+	_ZN15TEglThreadState17ExecEglBooleanCmdER6EglRFC @ 18 NONAME
+	_ZN15TEglThreadState17ExecEglContextCmdER6EglRFC @ 19 NONAME
+	_ZN15TEglThreadState17ExecEglSurfaceCmdER6EglRFC @ 20 NONAME
+	_ZN10CVghwUtils16EglManagementApiEv @ 21 NONAME
+	_ZN10CVghwUtils15EglGetSgHandlesEyPy @ 22 NONAME
+	_ZN10CVghwUtils14DestroyStaticsEv @ 23 NONAME
+	_ZN10CVghwUtils19SetEglManagementApiEP17MEglManagementApi @ 24 NONAME
+	_ZN10CVghwUtils14SetVgApiForEglEP12MVgApiForEgl @ 25 NONAME
+	_ZN10CVghwUtils18SetGles11ApiForEglEP16MGles11ApiForEgl @ 26 NONAME
+	_ZN10CVghwUtils17SetGles2ApiForEglEP15MGles2ApiForEgl @ 27 NONAME
+	_ZN10CVghwUtils11VgApiForEglEv @ 28 NONAME
+	_ZN10CVghwUtils15Gles11ApiForEglEv @ 29 NONAME
+	_ZN10CVghwUtils14Gles2ApiForEglEv @ 30 NONAME
+	_ZN10CVghwUtils27GetSurfaceBufferBaseAddressERm @ 31 NONAME
--- a/guestrendering/vghwutils/rom/vghwutils.iby	Thu Sep 23 15:54:53 2010 +0100
+++ b/guestrendering/vghwutils/rom/vghwutils.iby	Fri Sep 24 13:15:40 2010 +0100
@@ -13,13 +13,13 @@
 // Description:
 
 
-#ifndef PLATSIMVGHWUTILS_IBY
-#define PLATSIMVGHWUTILS_IBY
+#ifndef GUESTRENDERING_VGHWUTILS_IBY
+#define GUESTRENDERING_VGHWUTILS_IBY
 
 
 file=ABI_DIR\BUILD_DIR\vghwutils.dll           \sys\bin\vghwutils.dll
 
 
-#endif // PLATSIMVGHWUTILS_IBY
+#endif // GUESTRENDERING_VGHWUTILS_IBY
 
 //  End of File