diff -r 000000000000 -r cec860690d41 emulator/emulatorbsp/inc/display_chan.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emulator/emulatorbsp/inc/display_chan.h Tue Feb 02 01:39:10 2010 +0200 @@ -0,0 +1,242 @@ +// Copyright (c) 2007-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: +// + +/** + @file + @publishedPartner + @prototype +*/ + +#ifndef __DISPLAY_CHAN_H__ +#define __DISPLAY_CHAN_H__ + +#include "nk_priv.h" +#include +#include +#include "displayhandler.h" + +struct TBufferAddressA; +class TScreenBuffer; +/** +Logical Channel kernel side class for Display +*/ + + +class DDisplayChannel : public DLogicalChannel + { +public: + // constants + enum { KDisplayChMajorVersionNumber = 1 }; + enum { KDisplayChMinorVersionNumber = 2 }; + enum { KDisplayChBuildVersionNumber = 1 }; +public: + // Duplicate of RDisplayChannel structure, as the header file cannot be used. + class TCaps + { + public: + TVersion iVersion; + }; + + class TRequest + { + public: + inline TRequest(void) : iThread(0), iStatus(0) {} + TBool SetStatus(TThreadMessage& aMsg); + void Complete(TInt aResult); + public: + DThread* iThread; + TRequestStatus* iStatus; + }; + + class TBufferInfo + { + public: + TAny* iAddress; + DChunk* iChunk; + TRequest iRequest; + }; + + enum TDisplayPanic + { + EDisplayPanicNullThreadOnSet = 1, + EDisplayPanicInUse = 2, + EDisplayPanicThreadAlreadySet = 3, + EDisplayPanicNullThreadOnComplete = 4, + EDisplayPanicThreadOpenFailed = 5, + EDisplayPanicWaitForPostMissed = 6, + EDisplayPanicNullArgument = 7, + EDisplayPanicNotYetImplemented = 8, + EDisplayPanicInvalidDimensions = 9, + EDisplayPanicInvalidRotation = 10, + EDisplayPanicInvalidBitDepth = 11, + EDisplayPanicInvalidStride = 12, + EDisplayPanicInvalidWindowHandle = 13, + EDisplayPanicInvalidFrameBuffers = 14, + EDisplayPanicInvalidRefreshRate = 15, + EDisplayPanicInvalidOffset = 16, + EDisplayPanicNoLegacyBuffer = 17 + }; + +public: + DDisplayChannel(void); + ~DDisplayChannel(void); + + // DLogicalChannel implementation + virtual TInt DoCreate(TInt aUnit, const TDesC8* aInfo, const TVersion& aVer); + virtual void HandleMsg(TMessageBase* aMsg); + + // Function used by the UI code to set up the buffers. + virtual TInt Initialize(RDisplayChannel::TDisplayInfo& aInfo, + RDisplayChannel::TDisplayRotation aRotation, + HWND aHwnd, RPointerArray& aFrameBuffers, + RPointerArray& aChunks, + TScreenBuffer& aDsaBuffer, + TSize aResolution, + TSize aTwips, + const RDisplayChannel::TPixelFormat aPixelFormatArray[], + const TInt aPixelFormatArraySize, + const RDisplayChannel::TBufferFormat& aBufferFormat); + virtual void SetLegacyBuffer(void *aAddress); + +private: + DDisplayChannel(const DDisplayChannel&); + + // Handlers for the three classes of channel message sent + TInt DoControl(TInt aFunction); + void DoRequest(TInt aFunction); + TInt DoCancel(TInt aRequestMask); + TInt NumberOfResolutions(); + TInt SafePut(TAny* aDst, TAny* aSrc, TInt aBytes); + + void ValidateSpecificInfo(TInt aBytesPerPixel, RDisplayChannel::TOrientationSpecificInfo& aInfo); + static void Panic(TDisplayPanic aPanic); + void ClientPanic(RDisplayChannel::TPanic aPanic); + + inline TBool IsCompositionBuffer(RDisplayChannel::TBufferId aId); + static inline TBool IsLegacyBuffer(RDisplayChannel::TBufferId aId); + static inline TBool IsUserBuffer(RDisplayChannel::TBufferId aId); + inline TBool IsValidBuffer(RDisplayChannel::TBufferId aId); + inline RDisplayChannel::TBufferId NextCompositionBuffer(RDisplayChannel::TBufferId aId); + + static inline TBool IsFlipped(RDisplayChannel::TDisplayRotation aRotation); + + static void VSyncTimerFn(TAny* aDisplayChannel); + void DoVSyncTimer(void); + static void VSyncDfcFn(TAny* aDisplayChannel); + void DoVSync(void); + + TInt PostCompositionBuffer(TAny* aRegion, RDisplayChannel::TPostCount* aPostCount); + TInt PostLegacyBuffer(TAny* aRegion, RDisplayChannel::TPostCount* aPostCount); + TInt GetCompositionBuffer(TAny** aAddress); + TInt PostUserBuffer(RDisplayChannel::TBufferId* aBufferId, TAny* aRegion, RDisplayChannel::TPostCount* aPostCount); + TInt WaitForPost(RDisplayChannel::TPostCount* aPostCount); + TInt WaitForDisplayConnect(); + TInt SetRotation(RDisplayChannel::TDisplayRotation* aNewRotation, TBool* aIsBufferPreserved); + TInt RegisterUserBuffer(TInt aChunkHandle, TInt aOffset, RDisplayChannel::TBufferId* aBufferId); + TInt DeregisterUserBuffer(RDisplayChannel::TBufferId* aBufferId); + TInt GetResolutions(); + TInt SetResolution(TSize* aSize); + TInt GetResolution(TSize* aSize); + TInt GetTwips(TSize* aSize); + TInt GetIndexForSize(const TSize& aSize,TInt& aSpinnerOut); + TInt GetPixelFormats(); + TInt SetBufferFormat(RDisplayChannel::TBufferFormat* aBufferFormat); + TInt NextPlaneOffset(RDisplayChannel::TBufferFormat* aBufferFormat, + RDisplayChannel::TBufferFormatContext* aContext); + TInt NextLineOffset(RDisplayChannel::TBufferFormat* aBufferFormat, + RDisplayChannel::TBufferFormatContext* aContext); + TInt ValidateBufferFormat(const RDisplayChannel::TBufferFormat& aBufferFormat, + const RDisplayChannel::TResolution& aResolution); +private: + // Constants + enum {KDfcPriority = 6}; + + enum {KBufferNotSet = -1}; + + // Buffer index points. The legacy buffer is first, followed by the user + // buffers, followed by a variable number of composition buffers. + enum { KLegacyBuffer = 0}; + enum { KFirstUserBuffer = KLegacyBuffer + 1}; + enum { KFirstCompositionBuffer = KFirstUserBuffer + RDisplayChannel::TDisplayInfo::KMaxUserBuffers}; + enum { KMaxBufferSizeHeightAndWidth = KMaxTInt16 }; + +private: + TInt iScreenNumber; + TThreadMessage* iMsg; + TInt iVSyncTicks; // Number of nanokernel ticks between frames + TUint iNumCompositionBuffers; // Number of composition buffers + TUint iTotalBuffers; // KFirstCompositionBuffer + iNumCompositionBuffers + RDisplayChannel::TDisplayInfo iChannelInfo; + RDisplayChannel::TPostCount iPostCount; // Count of Post... calls + RDisplayChannel::TPostCount iLastPostCount; // Value of iPostCount when last buffer was actually posted + TBufferInfo* iBuffer; // Allocated to contain iTotalBuffers + TBufferAddressA* iChunks; + DThread* iClient; + + // Posting support + NTimer iVSync; // Emulated VSync signal using a timer + TDfc iVSyncDfc; // DFC queued on DfcQue0 when iVSync triggers + RDisplayChannel::TBufferId iPostedBuffer; // Index of buffer to be posted on next frame + RDisplayChannel::TDisplayRotation iCurrentRotation; // Rotation of buffer being posted + RDisplayChannel::TDisplayRotation iNewRotation; // Rotation of buffer being posted + TSize iCurrentResolution; // Display resolution (normal rotation) to be posted + TSize iNewResolution; // Display resolution (normal rotation) for buffer being posted + TSize iCurrentTwips; + TInt iPostedRectCount; // Number of rectangles defined in region + RECT iPostedRect[RDisplayChannel::TDisplayInfo::KMaxRectangles]; // + + // Paint support + HWND iHwnd; // Window to be painted + RDisplayChannel::TBufferId iDisplayBuffer; // Index of buffer to be painted + RDisplayChannel::TDisplayRotation iDisplayRotation; // Rotation of buffer to be painted + TSize iDisplayResolution; // Display resolution (normal rotation) on screen + + // GetCompositionBuffer support + TUint iGetBuffer; // Index of next composition buffer + + // WaitForPost support + RDisplayChannel::TPostCount iWaitForPost; // Post count being awaited + TRequest iWaitForPostRequest; // Request to complete when post count reached + + // WaitForDisplayConnect support + TRequest iWaitForDisplayConnect; // Request to complete when display connection state changes + + TInt iDisplayStateSpinner; + + TVersion iVersion; + const RDisplayChannel::TPixelFormat* iPixelFormatArray; + TInt iPixelFormatArraySize; + RDisplayChannel::TBufferFormat iInitialBufferFormat; + RDisplayChannel::TBufferFormat iCurrentBufferFormat; + RDisplayChannel::TBufferFormat iDisplayBufferFormat; + RDisplayChannel::TBufferFormat iNewBufferFormat; + }; + +inline TBool DDisplayChannel::IsCompositionBuffer(RDisplayChannel::TBufferId aId) + { return (aId >= KFirstCompositionBuffer && aId < iTotalBuffers); } +inline TBool DDisplayChannel::IsLegacyBuffer(RDisplayChannel::TBufferId aId) + { return (aId == KLegacyBuffer); } +inline TBool DDisplayChannel::IsUserBuffer(RDisplayChannel::TBufferId aId) + { return (aId >= KFirstUserBuffer && aId < (KFirstUserBuffer + RDisplayChannel::TDisplayInfo::KMaxUserBuffers)); } +inline TBool DDisplayChannel::IsValidBuffer(RDisplayChannel::TBufferId aId) + { return (aId >= 0 && aId < iTotalBuffers); } +inline RDisplayChannel::TBufferId DDisplayChannel::NextCompositionBuffer(RDisplayChannel::TBufferId aId) + { TUint r = (aId + 1); return (r >= iTotalBuffers) ? KFirstCompositionBuffer : r; } + +inline TBool DDisplayChannel::IsFlipped(RDisplayChannel::TDisplayRotation aRotation) + { return !(aRotation & (RDisplayChannel::ERotationNormal | RDisplayChannel::ERotation180)); } + +#endif +