graphicsresourceservices/graphicsresourceadaptation/inc/sgimageimpl.h
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsresourceservices/graphicsresourceadaptation/inc/sgimageimpl.h	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,374 @@
+// 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
+ @internalComponent
+*/
+
+#ifndef SGIMAGEIMPL_H
+#define SGIMAGEIMPL_H
+
+#include "sgimageadapter.h"
+#include "sgdriverimpl.h"
+#include "sgimage_sw.h"
+#include "sgimage_chunk.h"
+
+
+/**
+@internalComponent
+
+This class encapsulates the adapter-specific metadata associated with an image.
+User attributes are excluded.
+*/
+class TSgImageMetaData
+	{
+public:
+	TSgImageMetaData(const TSgImageInfo& aInfo, TArray<TSgPixelFormatTableEntry> aPixelFormatTable, TBool aIsCached = ETrue);
+	void GetInfo(TSgImageInfo& aInfo, TBool aGetPotentialUsage = EFalse) const;
+public:
+	/**
+	The identifier of the process that created the image.
+	*/
+	TProcessId iCreatorProcess;
+	/**
+	The size of the image in pixels.
+	*/
+	TSize iSizeInPixels;
+	/**
+	The pixel format of the image.
+	*/
+	TUidPixelFormat iPixelFormat;
+	/**
+	The intended usage of the image as requested during creation.
+	*/
+	TUint32 iRequestedUsage;
+	/**
+	The potential usage of the image as allowed by the implementation of the Graphics
+	subsystem. This is calculated from the image attributes, excluding the requested
+	usage, and the pixel format support table.
+	*/
+	TUint32 iPotentialUsage;
+	/**
+	Whether the image is shareable between processes.
+	*/
+	TBool iShareable;
+	/**
+	Whether and how the image is mappable for CPU access.
+	*/
+	TSgCpuAccess iCpuAccess;
+	/**
+	The identifier of the screen on which the image is usable or -1 if the image
+	is usable on all screens.
+	*/
+	TInt iScreenId;
+	/**
+	Whether the image is CPU-cached.
+	*/
+	TBool iIsCached;
+	};
+
+
+/**
+@internalComponent
+
+Base class for all classes representing image state. The state of an image consists
+of the following items:
+	- The situation in memory of the pixel data. In platforms with Unified Memory
+	  Architecture this is simply the address and stride of the pixel data in system
+	  memory, since the image is always located in system memory. In other memory
+	  architectures the image might change location between specialised graphics
+	  memory and system memory, for example.
+	- The situation in memory of the metadata and the user attributes. In the current
+	  image implementation based on the Surface Manager the metadata is stored in
+	  the same memory chunk as the pixel data and the user attributes are stored
+	  as surface hints.
+	- Whether and how the pixel data is being accessed by the CPU.
+
+@see XSgImageImplBase
+*/
+class XSgImageStateBase: public XSgBase
+	{
+public:
+	virtual const TSgImageMetaData& MetaData() const = 0;
+	virtual TInt GetUserAttributes(TSgUserAttribute* aUserAttributes, TInt aUserAttributeCount) const = 0;
+	virtual TAny* DataAddress() const = 0;
+	inline TInt DataStride() const;
+	virtual TInt BeginDataAccess(TSgCpuAccess aCpuAccess, TBool aIsUserAccess);
+	virtual TInt EndDataAccess(TBool aIsUserAccess);
+protected:
+	inline XSgImageStateBase(XSgDriverImpl& aDriverImpl);
+	inline XSgImageStateBase(XSgDriverImpl& aDriverImpl, TInt aDataStride);
+protected:
+	/**
+	The number of bytes between rows of the pixel data.
+	*/
+	TInt iDataStride;
+	/**
+	Whether the pixel data is being accessed by the CPU for reading only, for
+	writing only, for reading and writing or not at all.
+	*/
+	TSgCpuAccess iCpuAccess;
+	/**
+	The level of CPU access, if any:
+	- If ETrue the pixel data is being accessed by the CPU from the application
+	  level through a call to RSgImage::MapReadOnly(), RSgImage::MapWriteOnly()
+	  or RSgImage::MapReadWrite().
+	- If EFalse the pixel data is being accessed by the CPU from the Graphics
+	  subsystem level through the MSgImage_Sw extension interface.
+	*/
+	TBool iIsUserAccess;
+	};
+
+
+/**
+@internalComponent
+
+Base class for all image adapter objects. This class currently implements the
+MSgImage_Sw extension interface, since it assumes a platform with Unified Memory
+Architecture and therefore availability of the extension interface on all images.
+
+@see XSgImageStateBase
+*/
+class XSgImageImplBase: public XSgBase, public MSgImageAdapter, public MSgImage_Sw
+	{
+public:
+	~XSgImageImplBase();
+	inline const TSgImageMetaData& MetaData() const;
+	static TInt Compare(const TSgDrawableId* aId, const XSgImageImplBase& aImage);
+	static TInt Compare(const XSgImageImplBase& aImage1, const XSgImageImplBase& aImage2);
+	static TInt CompareIgnoringFlags(const TSgDrawableId* aId, const XSgImageImplBase& aImage);
+	// From MSgResourceAdapter
+	void Close();
+	// From MSgDrawableAdapter
+	const TSgDrawableId& Id() const;
+	TUid DrawableType() const;
+	TInt GetInterface(TUid aInterfaceUid, TAny*& aInterfacePtr);
+	// From MSgImageAdapter
+	TInt GetInfo(TSgImageInfo& aInfo) const;
+	TInt MapReadOnly(const TAny*& aDataAddress, TInt& aDataStride);
+	TInt MapWriteOnly(TAny*& aDataAddress, TInt& aDataStride);
+	TInt MapReadWrite(TAny*& aDataAddress, TInt& aDataStride);
+	TInt Unmap();
+	// From MSgImage_Sw
+	TAny* DataAddress() const;
+	TInt DataStride() const;
+	TInt BeginDataAccess(TSgCpuAccess aCpuAccess);
+	TInt EndDataAccess();
+protected:
+	inline XSgImageImplBase(XSgDriverImpl& aDriverImpl);
+	inline XSgImageImplBase(XSgDriverImpl& aDriverImpl, const TSgDrawableId& aId);
+	XSgImageImplBase(const XSgImageImplBase& aImage, TUint32 aFlags);
+	TInt SetData(const TAny* aDataAddress, TInt aDataStride);
+protected:
+	/** The unique identifier of the image. */
+	TSgDrawableId iId;
+	/** The state of the image. */
+	XSgImageStateBase* iState;
+	};
+
+
+/**
+@internalComponent
+
+The position, as index into an array of 32-bit words, of the 32 bits reserved
+for flags in the unique identifier of an image.
+*/
+const TInt KSgImageIdFlagsIndex = 5;
+
+
+#ifndef SYMBIAN_GRAPHICS_USE_GPU
+
+/**
+@internalComponent
+
+The structure of the unique identifier of an image allocated in memory that is
+accessible only from the user-side of the creator process.
+
+@see XSgImageImpl_SwLocal
+*/
+class TSgImageId_SwLocal
+	{
+public:
+	inline static TBool IsMatch(const TSgDrawableId& aId);
+public:
+	/** 64 bits reserved for the identifier of the creator process. */
+	TUint64 iProcessId;
+	/** 64 random bits. */
+	TUint32 iRandom[2];
+	/** 32 bits set to "1". */
+	TInt32 iMinusOne;
+	/** 32 bits reserved for flags. */
+	TUint32 iFlags;
+	};
+
+
+/**
+@internalComponent
+
+This class represents the state of an image allocated in memory that is accessible
+only from the user-side of the creator process.
+
+@see XSgImageImpl_SwLocal
+*/
+class XSgImageState_SwLocal: public XSgImageStateBase
+	{
+public:
+	static TInt New(XSgImageState_SwLocal*& aPtr, XSgDriverImpl& aDriverImpl, const TSgImageInfo& aInfo);
+	const TSgImageMetaData& MetaData() const;
+	TInt GetUserAttributes(TSgUserAttribute* aUserAttributes, TInt aUserAttributeCount) const;
+	TAny* DataAddress() const;
+private:
+	XSgImageState_SwLocal(XSgDriverImpl& aDriverImpl, const TSgImageInfo& aInfo, TInt aDataStride);
+private:
+	/**
+	The metadata of the image.
+	*/
+	TSgImageMetaData iMetaData;
+	/**
+	The number of user attributes.
+	*/
+	TInt iUserAttributeCount;
+	/**
+	The user attributes of the image. The pixel data of the image is stored after
+	them in the same heap cell.
+	*/
+	TSgUserAttribute iUserAttributes[1];
+	};
+
+
+/**
+@internalComponent
+
+An adapter object representing an image allocated in memory that is accessible only
+from the user-side of the creator process. Non-shareable images are allocated in
+this way on platforms without hardware acceleration. The pixel data, the metadata
+and the user attributes of such an image are stored in the same heap cell.
+
+@see XSgImageState_SwLocal
+*/
+class XSgImageImpl_SwLocal: public XSgImageImplBase
+	{
+public:
+	static TInt New(XSgImageImpl_SwLocal*& aPtr, XSgDriverImpl& aDriverImpl, const TSgDrawableId& aId,
+	                const TSgImageInfo& aInfo, const TAny* aDataAddress, TInt aDataStride);
+	static TInt New(XSgImageImpl_SwLocal*& aPtr, const XSgImageImpl_SwLocal& aImage, TUint32 aFlags);
+private:
+	inline XSgImageImpl_SwLocal(XSgDriverImpl& aDriverImpl, const TSgDrawableId& aId);
+	inline XSgImageImpl_SwLocal(const XSgImageImpl_SwLocal& aImage, TUint32 aFlags);
+	TInt Construct(const TSgImageInfo& aInfo, const TAny* aDataAddress, TInt aDataStride);
+	};
+
+#endif
+
+
+/**
+@internalComponent
+
+The structure of the unique identifier of an image stored in a surface buffer.
+
+@see XSgImageImpl_SurfaceManager
+*/
+class TSgImageId_SurfaceManager
+	{
+public:
+	inline static TBool IsMatch(const TSgDrawableId& aId);
+public:
+	/** 128 bits reserved for the surface identifier. */
+	TSurfaceId iSurfaceId;
+	/** 16 bits reserved for the index to the surface buffer. */
+	TInt16 iBufferIndex;
+	/** 16 bits reserved for the index to the metadata. */
+	TInt16 iMetaDataIndex;
+	/** 32 bits reserved for flags. */
+	TUint32 iFlags;
+	};
+
+
+/**
+@internalComponent
+
+This class represents the state of an image stored in a surface buffer.
+
+@see XSgImageImpl_SurfaceManager
+*/
+class XSgImageState_SurfaceManager: public XSgImageStateBase
+	{
+public:
+	static TInt New(XSgImageState_SurfaceManager*& aPtr, XSgDriverImpl& aDriverImpl, const TSgImageInfo& aInfo, TBool aIsCached);
+	static TInt New(XSgImageState_SurfaceManager*& aPtr, XSgDriverImpl& aDriverImpl, const TSgDrawableId& aId);
+	~XSgImageState_SurfaceManager();
+	const TSgImageMetaData& MetaData() const;
+	TInt GetUserAttributes(TSgUserAttribute* aUserAttributes, TInt aUserAttributeCount) const;
+	TAny* DataAddress() const;
+#ifdef SYMBIAN_GRAPHICS_AUTOFLUSH_CACHE
+	TInt BeginDataAccess(TSgCpuAccess aCpuAccess, TBool aIsUserAccess);
+	TInt EndDataAccess(TBool aIsUserAccess);
+#endif
+	inline const TSurfaceId& SurfaceId() const;
+	inline const RChunk& DataChunk() const;
+	inline TInt DataOffset() const;
+private:
+	inline XSgImageState_SurfaceManager(XSgDriverImpl& aDriverImpl);
+	TInt Construct(const TSgImageInfo& aInfo, TBool aIsCached);
+	TInt Construct(const TSgDrawableId& aId);
+private:
+	/** The identifier of the surface in which the image is stored. */
+	TSurfaceId iSurfaceId;
+	/** Index to the surface buffer in which the image is stored. */
+	TInt iBufferIndex;
+	/** Offset to the metadata from the base of the underlying memory chunk. */
+	TInt iMetaDataOffset;
+	/** Handle to the underlying memory chunk. */
+	RChunk iDataChunk;
+	/** Offset to the pixel data from the base of the underlying memory chunk. */
+	TInt iDataOffset;
+	};
+
+
+/**
+@internalComponent
+
+An adapter object representing an image stored in a surface buffer. The metadata
+of such an image is stored at the beginning of the underlying memory chunk.
+
+@see XSgImageState_SurfaceManager
+*/
+class XSgImageImpl_SurfaceManager: public XSgImageImplBase, public MSgImage_Chunk
+	{
+public:
+	static TInt New(XSgImageImpl_SurfaceManager*& aPtr, XSgDriverImpl& aDriverImpl,
+	                const TSgImageInfo& aInfo, TBool aIsCached, const TAny* aDataAddress, TInt aDataStride);
+	static TInt New(XSgImageImpl_SurfaceManager*& aPtr, XSgDriverImpl& aDriverImpl, const TSgDrawableId& aId);
+	static TInt New(XSgImageImpl_SurfaceManager*& aPtr, const XSgImageImpl_SurfaceManager& aImage, TUint32 aFlags);
+	// From MSgDrawableAdapter
+	TInt GetInterface(TUid aInterfaceUid, TAny*& aInterfacePtr);
+	// From MSgImage_Chunk
+	const RChunk& DataChunk() const;
+	TInt DataOffset() const;
+	TInt DataStride() const;
+private:
+	inline XSgImageImpl_SurfaceManager(XSgDriverImpl& aDriverImpl);
+	inline XSgImageImpl_SurfaceManager(XSgDriverImpl& aDriverImpl, const TSgDrawableId& aId);
+	inline XSgImageImpl_SurfaceManager(const XSgImageImpl_SurfaceManager& aImage, TUint32 aFlags);
+	TInt Construct(const TSgImageInfo& aInfo, TBool aIsCached, const TAny* aDataAddress, TInt aDataStride);
+	TInt Construct(const TSgDrawableId& aId);
+	};
+
+
+#include "sgimageimpl.inl"
+
+
+#endif // SGIMAGEIMPL_H