diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/plugins/openwfcrs/inc/openwfcjobmanager.h --- /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 +#include +#include + +#include +#include +#include + +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 iComposeDetailsPool; + TDblQueIter iComposeDetailsPoolIter; + TDblQue iComposeDetailsList; + TDblQueIter 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_ */