diff -r 4122176ea935 -r 56f325a607ea kernel/eka/include/drivers/display.h --- a/kernel/eka/include/drivers/display.h Mon Dec 21 16:14:42 2009 +0000 +++ b/kernel/eka/include/drivers/display.h Wed Dec 23 11:43:31 2009 +0000 @@ -11,10 +11,9 @@ // Contributors: // // Description: -// e32\include\drivers\display.h +// os\kernelhwsrv\kernel\eka\include\drivers\display.h // Interface to LDD of the Display GCE driver // Kernel side definitions for the GCE driver -// // /** @@ -41,6 +40,7 @@ const TInt KPendingReqArraySize = RDisplayChannel::EReqWaitForPost +1; +const TInt KMaxQueuedRequests = 3; class DDisplayChannel; @@ -84,9 +84,10 @@ */ typedef struct { - /** The request status associated with the request - used to signal completion of the request and pass back a + + /** The TClientRequest object associated with the request - used to signal completion of the request and pass back a completion code. */ - TRequestStatus* iStatus; + TClientRequest* iTClientReq; /** The thread which issued the request and which supplied the request status. */ DThread* iOwningThread; @@ -144,15 +145,18 @@ private: // Implementation for the differnt kinds of messages sent through RBusLogicalChannel TInt DoControl(TInt aFunction, TAny* a1, TAny* a2, DThread* aClient); - TInt DoRequest(TInt aReqNo, TRequestStatus* aStatus, TAny* a1, TAny* a2, DThread* aClient); + TInt DoRequest(TInt aReqNo, TAny* a1, TAny* a2, TInt index, DThread* aClient); void DoCancel(TUint aMask); - + + TInt SendRequest(TMessageBase* aMsg); + TInt SendControl(TMessageBase* aMsg); + TInt SendMsg(TMessageBase* aMsg); TBufferNode* FindUserBufferNode(TInt aBufferId); TInt CheckAndOpenUserBuffer(TBufferNode* aNode, TInt aHandle, TInt aOffset, DThread* aClient); TInt FreeUserBufferNode(TBufferNode* aNode); - void CompleteRequest(DThread* aThread,TRequestStatus*& aStatus,TInt aReason); + void CompleteRequest(DThread* aThread, TClientRequest*& aTClientReq, TInt aReason); DDisplayPdd * Pdd(); @@ -180,22 +184,41 @@ TBufferNode iUserBuffer[KDisplayUBMax]; //pending queue for asynchronous requests - TRequestNode iPendingReq[KPendingReqArraySize]; + TRequestNode iPendingReq[KPendingReqArraySize][KMaxQueuedRequests]; + + //Queue of TClientRequest objects, one for each type of asynchronous request. + TClientRequest* iClientRequest[KPendingReqArraySize][KMaxQueuedRequests]; + + //The index in structures iPendingReq and iClientRequest that identifies the active TClientRequest object. + //For each type of asynchronous request, iPendingIndex is the index of the active TClientRequest object + //in iPendingReq + TInt iPendingIndex[KPendingReqArraySize]; + + // Protect access of iClientRequest + DMutex * iClientRequestMutex; + // current index TInt iLegacyBuffIdx; TInt iCompositionBuffIdx; TInt iUserBuffIdx; - // rotations - TInt iLegacyRotation; - TInt iCurrentRotation; + + RDisplayChannel::TDisplayRotation iLegacyRotation; + RDisplayChannel::TDisplayRotation iCurrentRotation; + TBool iReady; /** Used in debug builds to track that all calls to DThread::Open() are balanced with a close before the driver closes. */ TInt iThreadOpenCount; - + + /** Used in debug builds to track the number of asynchronous requests that are queued is equal to the number of + requests that are completed, before the driver closes.*/ + TInt iAsyncReqCount; + + /** Chunk used in UDEB only for testing user buffers. */ + DChunk* iChunk; }; @@ -227,7 +250,7 @@ @return KErrNone if successful; or one of the other system wide error codes. */ - virtual TInt SetRotation(TInt aRotation)=0; + virtual TInt SetRotation(RDisplayChannel::TDisplayRotation aRotation)=0; /** Called by the LDD to handle the device specific part of posting a User Buffer. @@ -316,17 +339,23 @@ + //#define _GCE_DISPLAY_DEBUG #ifdef _GCE_DISPLAY_DEBUG -#define __DEBUG_PRINT(a) Kern::Printf(a) -#define __DEBUG_PRINT2(a,b) Kern::Printf(a,b) +#define __DEBUG_PRINT(a) Kern::Printf(a) +#define __DEBUG_PRINT2(a,b) Kern::Printf(a,b) +#define __DEBUG_PRINT3(a,b,c) Kern::Printf(a,b,c) +#define __DEBUG_PRINT4(a,b,c,d) Kern::Printf(a,b,c,d) +#define __DEBUG_PRINT5(a,b,c,d,e) Kern::Printf(a,b,c,d,e) #else - #define __DEBUG_PRINT(a) #define __DEBUG_PRINT2(a,b) +#define __DEBUG_PRINT3(a,b,c) +#define __DEBUG_PRINT4(a,b,c,d) +#define __DEBUG_PRINT5(a,b,c,d,e) #endif