windowing/windowserver/nga/CLIENT/CLIENT.H
author Faisal Memon <faisal.memon@nokia.com>
Fri, 14 May 2010 15:41:33 +0100
branchNewGraphicsArchitecture
changeset 64 5c983aa672ea
parent 26 15986eb6c500
child 163 bbf46f59e123
permissions -rw-r--r--
Merge 1. Pull in cpp files in the performance enhanced Khronos RI OVG files which are newly added. I've ignored platform-specific cpp files for linux, macosx, and null operating systems because this local solution has its own platform glue (i.e. facility to target Bitmaps but no full windowing support). I've ignored sfEGLInterface.cpp because this is used as a bridge to go from EGL to Nokia's Platsim which offers an EGL service. That's not relevant to this implementation because this is ARM side code, not Intel side. I just left a comment to sfEGLInterface.cpp in case we need to pick up this later on. The current code compiles on winscw. Prior to this fix, the code works on winscw, and can launch the SVG tiger (tiger.exe). That takes about 20 seconds to render. I hope to always be able to show this icon on each commit, and the plan is for the render time to reduce with this series of submissions. On this commit, the tiger renders ok in 20 seconds.

// Copyright (c) 1999-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:
// Window server client side local header file
// 
//

#ifndef __CLIENT_H__
#define __CLIENT_H__

#include <e32hashtab.h>

#if defined(_DEBUG) && defined(__WINS__)
//#define __AUTO_FLUSH		//Define this for test purposes only, it hard codes auto flushing
#endif

/** Panics the client. This will result in the client thread being destroyed. */ 
GLREF_C void Panic(TW32Panic aPanic); 
GLREF_C void Assert(TW32Assert aPanic); 

class TReadDescriptorType;
class TWriteDescriptorType;

class RWsBuffer
	{
	friend class RWsSession;
public:
	enum bufferSizes
		{
		EDefBufferSize=EClientBufferSize,
		EMinBufferSize=EClientBufferSize,
		EMaxBufferSize=EClientBufferMaxSize
		};
public:
	RWsBuffer(RWsSession *aSession);
	void Close();
	void Destroy();
	TInt Open();
	TInt Connect(TUint32 handle);
	TInt WriteReplyWs(TUint opcode);
	TInt WriteReplyWs(const TAny *pData, TInt length,TUint opcode);
	TInt WriteReplyWs(const TAny *pData, TInt length, const TAny *pData2, TInt length2, TUint opcode);
	void SetBufferSizeL(TInt aBufSize);
	void SetMaxBufferSizeL(TInt aMaxBufSize);
	TInt Flush(const TIpcArgs* aIpcArgs=NULL,TBool aRequestFinish=EFalse);
	TBool SetAutoFlush(TBool aState);
	void Write(TInt handle,TUint opcode,const TAny *pData, TInt length,const TAny *pData2, TInt length2);
	void Write(TInt handle,TUint opcode,const TAny *buf, TInt bufLen);
	void Write(TInt handle,TUint opcode);
	TInt WriteReply(TInt handle,TUint opcode, const TIpcArgs* aIpcArgs=NULL);
	TInt WriteReply(TInt handle,TUint opcode,const TAny *buf, TInt bufLen, const TIpcArgs* aIpcArgs=NULL);
	TInt WriteReply(TInt handle,TUint opcode,const TAny *buf, TInt bufLen,const TAny *buf2, TInt buflen2, const TIpcArgs* aIpcArgs=NULL);
	TInt WriteReplyP(TInt aHandle,TUint aOpcode,const TWriteDescriptorType& aReplyBuffer);
	TInt WriteReplyP(TInt aHandle,TUint aOpcode,const TAny *aData,TInt aLength,const TWriteDescriptorType& aReplyBuffer);
	TInt WriteReplyP(TInt aHandle,TUint aOpcode,const TAny *aData1,TInt aLengthData1,const TAny *aData2,TInt aLengthData2,const TWriteDescriptorType& aReplyBuffer);
	TInt WriteReplyByProvidingRemoteReadAccess(TInt aHandle,TUint aOpcode,const TAny *aData, TInt aLength,const TReadDescriptorType& aRemoteReadBuffer);

	inline TInt BufferSize() const;
	inline TBool IsEmpty() const;
	inline RWsSession* Session() {return iSession;}
	static void FlushAllBuffers(TInt aBitmapHandle);
	void SetCallBack();
	void CancelCallBack();
	void AddToBitmapArray(TInt aBitmapHandle);
	
	void SetWsGraphicManager(CWsGraphic::CManager* aManager);
	static CWsGraphic::CManager* WsGraphicManager();

	void AsyncRequest(TInt aHandle, TUint aOpcode, TRequestStatus& aStatus);

	void EnableWindowSizeCacheL();
	inline TBool WindowSizeCacheEnabled() const;
	inline void MarkWindowSizeCacheDirty(TInt aHandle);
	inline void RefreshWindowSizeCache(TInt aHandle, const TSize& aNewSize);
	inline TInt CachedWindowSize(TInt aHandle, TSize& aSize);
	inline void DestroyWindowSizeCacheEntry(TInt aHandle);	
#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
	void EnableWindowNativeSizeCacheL();
	inline TBool WindowNativeSizeCacheEnabled() const;
	inline TInt SetWindowNativeSize(TInt aHandle, const TSize& aNativeSize);
	inline TInt WindowNativeSize(TInt aHandle, TSize& aSize);
	inline void DestroyWindowNativeSizeCacheEntry(TInt aHandle);
#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
    
private:
	TInt DoWrite(TInt aHandle, TUint aOpcode, TBool aFlush, const TIpcArgs* aIpcArgs, const TAny* aData1=NULL, TInt aLength1=0, const TAny* aData2=NULL, TInt aLength2=0);
	inline void SetAndLimitMaxBufSize(TInt aMaxBufSize);
	void ReAllocBufferL(TInt aNewSize);
	TBool ReAllocBuffer(TInt aNewSize);
	void GrowBuffer(TInt aRequiredSpace, TInt aMsgSize);

private:
	RWsSession *iSession;
	CWsGraphic::CManager* iManager;
	TBool iAutoFlush;
	TPtr8 iBuf;
	RWsBuffer *iNext;
	TInt iPreviousHandle;
	TInt iBufSize;				// current buffer size, DoWrite can expand this up to iMaxBufize
	TInt iMaxBufSize;			// maximum buffer size, set by SetBufferSizeL or SetMaxBufferSizeL
private:		//Added here as adding it to RWsSession breaks BC.
	TInt iDirectAcessCount;
	RArray<TInt> iBitmapArray;
	TBool iInvalidBitmapArray;

	class TWindowSizeCacheEntry
	    {
	public:
	    inline TWindowSizeCacheEntry(const TSize& aSize);
	public:
	    TSize iSize;
	    TBool iDirty;
	    };
	
	RHashMap<TInt, TWindowSizeCacheEntry>* iWindowSizeCache;
#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
	RHashMap<TInt, TWindowSizeCacheEntry>* iWindowNativeSizeCache;
#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
	};


inline TInt RWsBuffer::BufferSize() const
	{return(iBuf.MaxLength());}

inline TBool RWsBuffer::IsEmpty() const
	{return iBuf.Length()==0;}

inline RWsBuffer::TWindowSizeCacheEntry::TWindowSizeCacheEntry(const TSize& aSize)
    : iSize(aSize), iDirty(EFalse)
    {
    }

inline TBool RWsBuffer::WindowSizeCacheEnabled() const
    {
    return iWindowSizeCache ? ETrue : EFalse;
    }

inline void RWsBuffer::MarkWindowSizeCacheDirty(TInt aHandle)
    {
    __ASSERT_ALWAYS(iWindowSizeCache != NULL, Assert(EW32AssertWindowSizeCacheFailure));
    RWsBuffer::TWindowSizeCacheEntry* entry = iWindowSizeCache->Find(aHandle);
    if (entry != NULL)
        {
        entry->iDirty = ETrue;
        }
    }

inline void RWsBuffer::RefreshWindowSizeCache(TInt aHandle, const TSize& aNewSize)
    {
    __ASSERT_ALWAYS(iWindowSizeCache != NULL, Assert(EW32AssertWindowSizeCacheFailure));
    RWsBuffer::TWindowSizeCacheEntry* entry = iWindowSizeCache->Find(aHandle);
    if (entry == NULL)
        {
        iWindowSizeCache->Insert(aHandle, RWsBuffer::TWindowSizeCacheEntry(aNewSize));
        }
    else
        {
        entry->iSize = aNewSize;
        entry->iDirty = EFalse;
        }
    }

inline TInt RWsBuffer::CachedWindowSize(TInt aHandle, TSize& aSize)
    {
    __ASSERT_ALWAYS(iWindowSizeCache != NULL, Assert(EW32AssertWindowSizeCacheFailure));
    RWsBuffer::TWindowSizeCacheEntry* entry = iWindowSizeCache->Find(aHandle);
    if ( entry && !(entry->iDirty) )
        {
        aSize = entry->iSize;
        return KErrNone;
        }
    else
        {
        // return KErrNotFound when either entry not found for aHandle, or entry is dirty
        return KErrNotFound;
        }
    }

inline void RWsBuffer::DestroyWindowSizeCacheEntry(TInt aHandle)
    {
    __ASSERT_ALWAYS(iWindowSizeCache != NULL, Assert(EW32AssertWindowSizeCacheFailure));
    TInt err = iWindowSizeCache->Remove(aHandle);
    // If there is a window size cache entry, then err == KErrNone.
    // Otherwise, there isn't a size cache entry, and err == KErrNotFound.
    __ASSERT_DEBUG(err == KErrNone || err == KErrNotFound, Assert(EW32AssertWindowSizeCacheFailure));
    }

#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
inline TBool RWsBuffer::WindowNativeSizeCacheEnabled() const
    {
    return iWindowNativeSizeCache ? ETrue : EFalse;
    }

inline TInt RWsBuffer::SetWindowNativeSize(TInt aHandle, const TSize& aNativeSize)
    {
    __ASSERT_ALWAYS(iWindowNativeSizeCache != NULL, Assert(EW32AssertWindowNativeSizeCacheFailure));
    RWsBuffer::TWindowSizeCacheEntry* entry = iWindowNativeSizeCache->Find(aHandle);
	__ASSERT_ALWAYS(!entry, Assert(EW32AssertWindowNativeSizeCacheFailure));
    return iWindowNativeSizeCache->Insert(aHandle, RWsBuffer::TWindowSizeCacheEntry(aNativeSize));
    }

inline TInt RWsBuffer::WindowNativeSize(TInt aHandle, TSize& aSize)
    {
    __ASSERT_ALWAYS(iWindowNativeSizeCache != NULL, Assert(EW32AssertWindowNativeSizeCacheFailure));
    RWsBuffer::TWindowSizeCacheEntry* entry = iWindowNativeSizeCache->Find(aHandle);
    if (entry)
        {
        aSize = entry->iSize;
        return KErrNone;
        }
    else
        {
        return KErrNotFound;
        }
    }

inline void RWsBuffer::DestroyWindowNativeSizeCacheEntry(TInt aHandle)
    {
    __ASSERT_ALWAYS(iWindowNativeSizeCache != NULL, Assert(EW32AssertWindowNativeSizeCacheFailure));
    TInt err = iWindowNativeSizeCache->Remove(aHandle);
    // If there is a window size cache entry, then err == KErrNone.
    // Otherwise, there isn't a size cache entry, and err == KErrNotFound.
    __ASSERT_DEBUG(err == KErrNone || err == KErrNotFound, Assert(EW32AssertWindowNativeSizeCacheFailure));
    }

#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION


#endif