graphicshwdrivers/surfacemgr/src/surfacemanager_dev.h
author Faisal Memon <faisal.memon@nokia.com>
Thu, 06 May 2010 11:31:11 +0100
branchNewGraphicsArchitecture
changeset 47 48b924ae7197
parent 0 5d03bc08d59c
permissions -rw-r--r--
Applied patch 1, to provide a syborg specific minigui oby file. Need to compare this with the "stripped" version currently in the tree. This supplied version applies for Nokia builds, but need to repeat the test for SF builds to see if pruning is needed, or if the file needs to be device-specific.

// Copyright (c) 2006-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 __SURFACEMANAGER_DEV_H__
#define __SURFACEMANAGER_DEV_H__

#include <graphics/surface.h>
#include "surfacemanagerdriver.h"

#if 0
#define TRACE(x) x
#else
#define TRACE(x)
#endif

/** Maximum number of HintPairs per surface */
const TInt KMaxHintsPerSurface = 16;

/** Maximum number of elements in the table. This value must be a power of 2 */
#define KMaxLists 16

/**
  Logical Device (factory class) for Surface manager
*/
class DSurfaceManagerFactory : public DLogicalDevice
	{
public:
	DSurfaceManagerFactory();
	TInt Install();
	void GetCaps(TDes8& aDes) const;
	TInt Create(DLogicalChannelBase*& aChannel);
	};


/**
  Logical Channel class for SurfaceManager
*/
class DSurfaceManagerChannel : public DLogicalChannelBase
	{
public:
	DSurfaceManagerChannel();
	~DSurfaceManagerChannel();

	// Inherited from DLogicalChannelBase
	TInt DoCreate(TInt aUnit, const TDesC8* aInfo, const TVersion& aVer);
	TInt Request(TInt aReqNo, TAny* a1, TAny* a2);
private:
	// Implementation for the different kinds of messages sent through RBusLogicalChannel
	TInt DoControl(TInt aFunction, TAny* a1, TAny* a2);

private:
	DProcess* iOwner;
	};


/**
Class to hold a reference count and process pointer. 
Each surface has a linked list of these owning processes.
The surface manager has a linked list of these to track connections.
@internalTechnology
*/
class TProcessListItem
	{
public:
	TProcessListItem* iNext;	//pointer to next one in list
	DProcess* iOwningProcess;	//pointer to the process object which is being reference counted
	TInt iCount;				//reference count
	};
	

/**
Class to hold the information about a surface.
Each surface has a linked list of owners.  The surfaces are arranged in a linked list,
with these objects being elements in the list.
@internalTechnology
*/
class TSurface					//one of these per surface
	{
public:
	TSurface* iNext;			//singly linked list, points to next surface
	TSurfaceId	iId;			//the surface id
	TSize iSize;				//pixel width/height
	TInt iBuffers;				//number of buffers
	TUidPixelFormat iPixelFormat;			//pixel format
	TInt iStride;				//offset from start of one line to the next, in bytes
	TInt iOffsetToFirstBuffer;	//offset between the start of the surface memory and the start of the first pixel buffer
	TInt iOffsetBetweenBuffers;	//offset between pixel buffers
	TInt  iAlignment;			//byte alignment of the pixel buffers
	TBool iContiguous;			//if it is in contiguous physical memory
	DChunk* iChunk;				//ptr to the shared chunk
	RSurfaceManager::TCacheAttribute iCacheAttrib;			//Caching attribute to create chunks memory
	RSurfaceManager::THintPair iSurfaceHints[KMaxHintsPerSurface];	//Arbitrary key-value pairs associated with a surface
	TBool iMappable;			//Is the Surface Mappable
	TProcessListItem* iOwners;	//owner list. Singly linked list, points to next surface owner

public:	
	TProcessListItem* ProcessOwnerInfo(const DProcess* aProcess);
	};
	



/**
Surface manager extension object.
There is one static instance of this in the kernel extension.
@internalTechnology
*/
class DSurfaceManager : public DBase
	{
public:
	TInt CreateSurface(const TDesC8* aConfig, TSurfaceId* aId);
	TInt SurfaceInfo(const TSurfaceId* aId, TDes8* aInfo);
	TInt OpenSurface(const TSurfaceId* aId);
	TInt CloseSurface(const TSurfaceId* aId);
	TInt MapSurface(const TSurfaceId* aId);
	TInt AddConnection(const DProcess* iProcess);
	void RemoveConnection(const DProcess* iProcess);
	TInt CreateSurface(RSurfaceManagerDriver::TDeviceParam* aParam, TInt aChunkHandle);
	TInt SynchronizeCache(RSurfaceManagerDriver::TDeviceParam* aId, RSurfaceManager::TSyncOperation aOperation);
	TInt GetSurfaceHint(const TSurfaceId* aSurfaceId, RSurfaceManager::THintPair* aHintPair);
	TInt SetSurfaceHint(const TSurfaceId* aSurfaceId, const RSurfaceManager::THintPair* aHintPair);
	TInt AddSurfaceHint(const TSurfaceId* aSurfaceId, const RSurfaceManager::THintPair* aHintPair);
	TInt GetBufferOffset(RSurfaceManagerDriver::TDeviceParam* aParam,TUint* aOffset);
	TInt GetSurfaceManagerAttrib(RSurfaceManager::TSurfaceManagerAttrib* aAttrib,TInt* aValue);
private:
	void GenerateSurfaceId(TSurfaceId& aId);
	TInt  CreateSurfaceChunk(const RSurfaceManager::TSurfaceCreationAttributes& attribs);
	TInt ValidateAndCalculateChunkSize(RSurfaceManager::TSurfaceCreationAttributes& aAttribs, TInt& aOffset, 
			TUint& aActualBufferSize, const TBool aNewChunk = EFalse);
	TInt ValidatePhysicalMemory(DChunk* aChunk, const RSurfaceManager::TSurfaceCreationAttributes& aAttribs, 
			TUint aBuffersize, TUint32& aMapAttr, TBool &aIsContiguous); 
	TSurface* FindSurfaceById(const TSurfaceId& aId);
	void CloseSurfaceHandlesForProcess(const DProcess* iProcess);
	TProcessListItem* FindConnectedProcess(const DProcess* aProcess);
	TInt FindHintKey(const RSurfaceManager::THintPair* aHints, TUint32 aKey) const;
	TBool SortHints(RSurfaceManager::THintPair* aHints, TInt aNumberOfHints) const;
	TInt InsertHintKey(RSurfaceManager::THintPair* aHints, const RSurfaceManager::THintPair& aHintPair) const;

private:
	TSurface* iSurfacesIndex[KMaxLists]; 			// A table with elements pointing to the head of each singly linked list
	NFastMutex iMutex;						// Mutex to protect access to surface lists
	TProcessListItem* iConnectedProcesses;	//reference counted list of processes connected to the driver
	};


#endif