uiacceltk/hitchcock/plugins/openwfcrs/inc/openwfcjobmanager.h
changeset 0 15bf7259bb7c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/plugins/openwfcrs/inc/openwfcjobmanager.h	Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,262 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef OPENWFCJOBMANAGER_H_
+#define OPENWFCJOBMANAGER_H_
+
+#include <e32std.h>
+#include <e32base.h>
+#include <e32debug.h>
+
+#include <EGL/egl.h>
+#include <graphics/eglsynchelper.h>
+#include <WF/wfc.h>
+
+class COpenWfcWrapper;
+class COpenWfcMonitorThread;
+class TOpenWfcJob;
+
+#if defined(ENABLE_JQ_LOGGING)
+#define JQLOG(X)  RDebug::Printf X
+#else
+#define JQLOG(X)
+#endif
+
+/**
+ * Controls the OpenWF composition
+ */
+class COpenWfcJobManger : public CBase
+	{
+private:
+
+    enum EOpenWfcJobId
+        {
+            EOpenWfcInvalidJobId = 0,
+            EOpenWfcComposeJobId,
+            EOpenWfcPauseCompositionJobId,
+            EOpenWfcResumeCompositionJobId,
+        };
+    
+	/**
+	 * Stores the parameters associated with a composition
+	 */
+	struct TComposeRequestDetails
+		{
+		TComposeRequestDetails();
+		void Set(TRequestStatus* aCommitRequest, TThreadId aCallingThread);
+		void Reset();
+		TRequestStatus* iCommitRequest;
+		TThreadId iCallingThread;
+		TDblQueLink iDlink;
+		};
+	
+	/**
+	 * Auxilliary class to insure the release of a lock
+	 */
+	class Guard
+		{
+		public:
+		Guard(RMutex& aLock);
+		~Guard();
+		private:
+		    RMutex& iLock;
+		};
+	
+public:
+	/**
+	 * Two-phased constructor.
+	 */
+	static COpenWfcJobManger* NewL(COpenWfcWrapper& aOpenWfcWrapper, 
+                                    WFCDevice aDevice, 
+                                    WFCContext aContext,
+                                    TInt aManagerId);
+	
+	/**
+	 * Two-phased constructor.
+	 */
+	static COpenWfcJobManger* NewLC(COpenWfcWrapper& aOpenWfcWrapper, 
+                                    WFCDevice aDevice, 
+                                    WFCContext aContext,
+                                    TInt aManagerId);
+	/**
+	 * Destructor.
+	 */
+	virtual ~COpenWfcJobManger();
+	
+	/**
+	 * Request to compose the specified scene 
+	 * 
+	 * @param aCompleted The notification to be returned when the composition completes
+	 * @param aUpdatePolicy Update policy to be used
+	 * @param the Pointer to the first element from the element list containing the scene to be used by the next commit
+	 * 
+	 */
+	void ComposeRequest(TRequestStatus* aCompleted);
+	
+	/**
+	 * Request to pause the composition
+	 */
+	void CompositionPauseRequest();
+	/**
+	 * Request to resume the composition
+	 */
+	void CompositionResumeRequest();
+	
+    /**
+     * Appends to the compose details list the first detail object from the compose detail list
+     * 
+     * @return NULL if the compose detail pool is empty or a pointer to the appended detail object
+     */
+	TComposeRequestDetails* AppendDetailsFromPool();
+
+    /**
+     * Executes an outstanding command, if any.
+     * 
+     */
+    void DoExecuteJob();
+    
+private:
+    /**
+     * Executes a compose request.
+     * Intended to be invoked by a job
+     * 
+     * @param Reference to the invoking job
+     */
+    void DoComposeJob();
+    
+    /**
+     * Executes a pause composition request
+     * Intended to be invoked by a job
+     * 
+     * @param Reference to the invoking job
+     */
+    void DoPauseCompositionJob();
+    
+    /**
+     * Executes a resume composition request.
+     * Intended to be invoked by a job
+     * 
+     * @param Reference to the invoking job
+     */
+    void DoResumeCompositionJob();
+        
+	/**
+	 * Private constructor
+	 */
+	COpenWfcJobManger(COpenWfcWrapper& aOpenWfcWrapper, 
+						 WFCDevice aDevice, 
+						 WFCContext aContext,
+						 TInt aManagerId);
+	
+	/**
+	 * Symbian constructor used with the two stage construction pattern
+	 */
+	void ConstructL();
+	
+	/**
+	 * Implements a fence operation
+	 */
+	void Fence();
+	
+	/**
+	 * Waits until the sync is signalled
+	 */
+	void WaitForSync();
+	
+	/**
+	 * Activates the composition on the current context
+	 */
+	void Activate();
+	
+	/**
+	 * Deactivates the composition on the current context
+	 */
+	void Deactivate();
+	
+	/**
+	 * Execute a composition on the current context
+	 */
+	void Compose();
+	
+	/**
+	 * Execute a commit on the current context
+	 */
+	void Commit();
+	
+	/**
+	 * Completes all the outstanding requests stored locally
+	 */
+	void CompleteComposeRequests(TInt aResult);
+	
+    /**
+     * Completes all the outstanding pause/resumerequests requests
+     */
+    void CompletePauseResumeRequest(TInt aResult);
+    
+private:
+	// 
+	TDblQue<TComposeRequestDetails> iComposeDetailsPool;
+	TDblQueIter<TComposeRequestDetails> iComposeDetailsPoolIter;
+	TDblQue<TComposeRequestDetails> iComposeDetailsList;
+	TDblQueIter<TComposeRequestDetails> iComposeDetailsListIter;
+    RMutex iJobLock;
+    RMutex iCommandLock;
+    COpenWfcWrapper& iOpenWfcWrapper;
+	WFCDevice iDevice;
+	WFCContext iContext;
+	volatile TBool iCompositionPaused;
+	volatile TBool iPausedComposePending;
+	COpenWfcMonitorThread*	iThreadManager;
+	TInt iManagerId;
+	EGLSyncKHR iSync;
+	EGLDisplay iEglDisplay;
+    TRequestStatus iPauseResumeRequestStatus;
+    TThreadId iPauseResumeThread;
+    EOpenWfcJobId iOutstandingJob;
+    static const TInt KComposeDetailsPoolSize = 16;
+	};
+
+inline void COpenWfcJobManger::Fence()
+	{
+    wfcFence(iDevice, iContext, iEglDisplay, iSync);
+	}
+
+inline void COpenWfcJobManger::WaitForSync()
+	{
+	EGLTimeKHR timeout = (EGLTimeKHR) EGL_FOREVER_KHR;
+	eglClientWaitSyncKHR(iEglDisplay, iSync, 0, timeout);
+	}
+
+inline void COpenWfcJobManger::Activate()
+	{
+	wfcActivate(iDevice, iContext);
+	}
+
+inline void COpenWfcJobManger::Deactivate()
+	{
+	wfcDeactivate(iDevice, iContext);
+	}
+
+inline void COpenWfcJobManger::Compose()
+	{
+	wfcCompose(iDevice, iContext, WFC_TRUE);
+	}
+
+inline void COpenWfcJobManger::Commit()
+	{
+	wfcCommit(iDevice, iContext, WFC_TRUE);
+	}
+
+#endif /* OPENWFCJOBMANAGER_H_ */