os/graphics/graphicsresourceservices/graphicsresourceadaptation/src/sgimageimpl.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
#include "sgimageimpl.h"
sl@0
    17
#include "sgresourceinternal.h"
sl@0
    18
sl@0
    19
sl@0
    20
// TSgImageMetaData
sl@0
    21
sl@0
    22
TSgImageMetaData::TSgImageMetaData(const TSgImageInfo& aInfo, TArray<TSgPixelFormatTableEntry> aPixelFormatTable, TBool aIsCached)
sl@0
    23
	: iCreatorProcess(RProcess().Id()),
sl@0
    24
	  iSizeInPixels(aInfo.iSizeInPixels),
sl@0
    25
	  iPixelFormat(aInfo.iPixelFormat),
sl@0
    26
	  iRequestedUsage(aInfo.iUsage),
sl@0
    27
	  iPotentialUsage(0),
sl@0
    28
	  iShareable(aInfo.iShareable),
sl@0
    29
	  iCpuAccess(aInfo.iCpuAccess),
sl@0
    30
	  iScreenId(aInfo.iScreenId),
sl@0
    31
	  iIsCached(aIsCached)
sl@0
    32
	{
sl@0
    33
	TUint32 usageMask = (aInfo.iUsage & KSgUsageAllSources ? KSgUsageAllSources : 0)
sl@0
    34
	                    | (aInfo.iUsage & KSgUsageAllTargets ? KSgUsageAllTargets : 0);
sl@0
    35
	TInt n = aPixelFormatTable.Count();
sl@0
    36
	for (TInt i = 0; i < n; ++i)
sl@0
    37
		{
sl@0
    38
		const TSgPixelFormatTableEntry& entry = aPixelFormatTable[i];
sl@0
    39
		if (entry.IsMatchIgnoringUsage(aInfo))
sl@0
    40
			{
sl@0
    41
			iPotentialUsage |= entry.iUsage & usageMask;
sl@0
    42
			}
sl@0
    43
		}
sl@0
    44
	}
sl@0
    45
sl@0
    46
sl@0
    47
void TSgImageMetaData::GetInfo(TSgImageInfo& aInfo, TBool aGetPotentialUsage) const
sl@0
    48
	{
sl@0
    49
	aInfo.iSizeInPixels = iSizeInPixels;
sl@0
    50
	aInfo.iPixelFormat = iPixelFormat;
sl@0
    51
	aInfo.iUsage = aGetPotentialUsage ? iPotentialUsage : iRequestedUsage;
sl@0
    52
	aInfo.iShareable = iShareable;
sl@0
    53
	aInfo.iCpuAccess = iCpuAccess;
sl@0
    54
	aInfo.iScreenId = iScreenId;
sl@0
    55
	}
sl@0
    56
sl@0
    57
sl@0
    58
// XSgImageImplBase
sl@0
    59
sl@0
    60
XSgImageImplBase::XSgImageImplBase(const XSgImageImplBase& aImage, TUint32 aFlags)
sl@0
    61
	: XSgBase(aImage.iDriverImpl)
sl@0
    62
	{
sl@0
    63
	__ASSERT_DEBUG(iDriverImpl.IsMutexHeld(), Panic(ESgPanicMutexNotHeld));
sl@0
    64
	iId = aImage.iId;
sl@0
    65
	iId.iId[KSgImageIdFlagsIndex] = aFlags;
sl@0
    66
	aImage.iState->IncRefCount();
sl@0
    67
	iState = aImage.iState;
sl@0
    68
	}
sl@0
    69
sl@0
    70
sl@0
    71
XSgImageImplBase::~XSgImageImplBase()
sl@0
    72
	{
sl@0
    73
	__ASSERT_DEBUG(iDriverImpl.IsMutexHeld(), Panic(ESgPanicMutexNotHeld));
sl@0
    74
	if (iState && iState->DecRefCount() == 0)
sl@0
    75
		{
sl@0
    76
		Unmap();
sl@0
    77
		iState->Delete();
sl@0
    78
		}
sl@0
    79
	}
sl@0
    80
sl@0
    81
sl@0
    82
TInt XSgImageImplBase::Compare(const TSgDrawableId* aId, const XSgImageImplBase& aImage)
sl@0
    83
	{
sl@0
    84
	return Mem::Compare(reinterpret_cast<const TUint8*>(aId), sizeof(TSgDrawableId),
sl@0
    85
	                    reinterpret_cast<const TUint8*>(&aImage.Id()), sizeof(TSgDrawableId));
sl@0
    86
	}
sl@0
    87
sl@0
    88
sl@0
    89
TInt XSgImageImplBase::Compare(const XSgImageImplBase& aImage1, const XSgImageImplBase& aImage2)
sl@0
    90
	{
sl@0
    91
	return Compare(&aImage1.Id(), aImage2);
sl@0
    92
	}
sl@0
    93
sl@0
    94
sl@0
    95
TInt XSgImageImplBase::CompareIgnoringFlags(const TSgDrawableId* aId, const XSgImageImplBase& aImage)
sl@0
    96
	{
sl@0
    97
	return Mem::Compare(reinterpret_cast<const TUint8*>(aId), sizeof(TSgDrawableId) - sizeof(TUint32),
sl@0
    98
	                    reinterpret_cast<const TUint8*>(&aImage.Id()), sizeof(TSgDrawableId) - sizeof(TUint32));
sl@0
    99
	}
sl@0
   100
sl@0
   101
sl@0
   102
void XSgImageImplBase::Close()
sl@0
   103
	{
sl@0
   104
	XSgDriverImpl& driverImpl = iDriverImpl;
sl@0
   105
	driverImpl.Wait();
sl@0
   106
	if (DecRefCount() == 0)
sl@0
   107
		{
sl@0
   108
		driverImpl.DeleteImage(this);
sl@0
   109
		}
sl@0
   110
	driverImpl.Signal();
sl@0
   111
	}
sl@0
   112
sl@0
   113
sl@0
   114
const TSgDrawableId& XSgImageImplBase::Id() const
sl@0
   115
	{
sl@0
   116
	return iId;
sl@0
   117
	}
sl@0
   118
sl@0
   119
sl@0
   120
TUid XSgImageImplBase::DrawableType() const
sl@0
   121
	{
sl@0
   122
	return KSgImageTypeUid;
sl@0
   123
	}
sl@0
   124
sl@0
   125
sl@0
   126
TInt XSgImageImplBase::GetInterface(TUid aInterfaceUid, TAny*& aInterfacePtr)
sl@0
   127
	{
sl@0
   128
	if (aInterfaceUid.iUid == MSgImage_Sw::EInterfaceUid)
sl@0
   129
		{
sl@0
   130
		aInterfacePtr = static_cast<MSgImage_Sw*>(this);
sl@0
   131
		return KErrNone;
sl@0
   132
		}
sl@0
   133
	return KErrExtensionNotSupported;
sl@0
   134
	}
sl@0
   135
sl@0
   136
sl@0
   137
TInt XSgImageImplBase::GetInfo(TSgImageInfo& aInfo) const
sl@0
   138
	{
sl@0
   139
	iState->MetaData().GetInfo(aInfo, iId.iId[KSgImageIdFlagsIndex] & ESgDoNotRestrictUsage);
sl@0
   140
	return iState->GetUserAttributes(aInfo.iUserAttributes, aInfo.iUserAttributeCount);
sl@0
   141
	}
sl@0
   142
sl@0
   143
sl@0
   144
TInt XSgImageImplBase::MapReadOnly(const TAny*& aDataAddress, TInt& aDataStride)
sl@0
   145
	{
sl@0
   146
	TInt err = iState->BeginDataAccess(ESgCpuAccessReadOnly, ETrue);
sl@0
   147
	if (err != KErrNone)
sl@0
   148
		{
sl@0
   149
		return err;
sl@0
   150
		}
sl@0
   151
	aDataAddress = iState->DataAddress();
sl@0
   152
	aDataStride = iState->DataStride();
sl@0
   153
	return KErrNone;
sl@0
   154
	}
sl@0
   155
sl@0
   156
sl@0
   157
TInt XSgImageImplBase::MapWriteOnly(TAny*& aDataAddress, TInt& aDataStride)
sl@0
   158
	{
sl@0
   159
	TInt err = iState->BeginDataAccess(ESgCpuAccessWriteOnly, ETrue);
sl@0
   160
	if (err != KErrNone)
sl@0
   161
		{
sl@0
   162
		return err;
sl@0
   163
		}
sl@0
   164
	aDataAddress = iState->DataAddress();
sl@0
   165
	aDataStride = iState->DataStride();
sl@0
   166
	return KErrNone;
sl@0
   167
	}
sl@0
   168
sl@0
   169
sl@0
   170
TInt XSgImageImplBase::MapReadWrite(TAny*& aDataAddress, TInt& aDataStride)
sl@0
   171
	{
sl@0
   172
	TInt err = iState->BeginDataAccess(ESgCpuAccessReadWrite, ETrue);
sl@0
   173
	if (err != KErrNone)
sl@0
   174
		{
sl@0
   175
		return err;
sl@0
   176
		}
sl@0
   177
	aDataAddress = iState->DataAddress();
sl@0
   178
	aDataStride = iState->DataStride();
sl@0
   179
	return KErrNone;
sl@0
   180
	}
sl@0
   181
sl@0
   182
sl@0
   183
TInt XSgImageImplBase::Unmap()
sl@0
   184
	{
sl@0
   185
	return iState->EndDataAccess(ETrue);
sl@0
   186
	}
sl@0
   187
sl@0
   188
sl@0
   189
TAny* XSgImageImplBase::DataAddress() const
sl@0
   190
	{
sl@0
   191
	return iState->DataAddress();
sl@0
   192
	}
sl@0
   193
sl@0
   194
sl@0
   195
TInt XSgImageImplBase::DataStride() const
sl@0
   196
	{
sl@0
   197
	return iState->DataStride();
sl@0
   198
	}
sl@0
   199
sl@0
   200
sl@0
   201
TInt XSgImageImplBase::BeginDataAccess(TSgCpuAccess aCpuAccess)
sl@0
   202
	{
sl@0
   203
	return iState->BeginDataAccess(aCpuAccess, EFalse);
sl@0
   204
	}
sl@0
   205
sl@0
   206
sl@0
   207
TInt XSgImageImplBase::EndDataAccess()
sl@0
   208
	{
sl@0
   209
	return iState->EndDataAccess(EFalse);
sl@0
   210
	}
sl@0
   211
sl@0
   212
sl@0
   213
TInt XSgImageImplBase::SetData(const TAny* aDataAddress, TInt aDataStride)
sl@0
   214
	{
sl@0
   215
	if (aDataAddress)
sl@0
   216
		{
sl@0
   217
		TInt err = BeginDataAccess(ESgCpuAccessWriteOnly);
sl@0
   218
		if (err != KErrNone)
sl@0
   219
			{
sl@0
   220
			return err;
sl@0
   221
			}
sl@0
   222
		const TSgImageMetaData& metaData = iState->MetaData();
sl@0
   223
		const TAny* src = aDataAddress;
sl@0
   224
		TAny* trg = iState->DataAddress();
sl@0
   225
		TInt dataStride = iState->DataStride();
sl@0
   226
		TInt minDataStride = SgMinDataStride(metaData.iSizeInPixels.iWidth, metaData.iPixelFormat);
sl@0
   227
		__ASSERT_DEBUG(minDataStride > 0, Panic(ESgPanicResourceAdapterGeneral));
sl@0
   228
		for (TInt y = 0; y < metaData.iSizeInPixels.iHeight; ++y)
sl@0
   229
			{
sl@0
   230
			Mem::Copy(trg, src, minDataStride);
sl@0
   231
			src = PtrAdd(src, aDataStride);
sl@0
   232
			trg = PtrAdd(trg, dataStride);
sl@0
   233
			}
sl@0
   234
		EndDataAccess();
sl@0
   235
		}
sl@0
   236
	return KErrNone;
sl@0
   237
	}
sl@0
   238
sl@0
   239
sl@0
   240
TInt XSgImageStateBase::BeginDataAccess(TSgCpuAccess aCpuAccess, TBool aIsUserAccess)
sl@0
   241
	{
sl@0
   242
	if (aCpuAccess == ESgCpuAccessNone)
sl@0
   243
		{
sl@0
   244
		return KErrArgument;
sl@0
   245
		}
sl@0
   246
	const TSgImageMetaData& metaData = MetaData();
sl@0
   247
	if (aIsUserAccess && (~metaData.iCpuAccess & aCpuAccess))
sl@0
   248
		{
sl@0
   249
		return KErrAccessDenied;
sl@0
   250
		}
sl@0
   251
	if (aIsUserAccess && metaData.iCreatorProcess != RProcess().Id())
sl@0
   252
		{
sl@0
   253
		return KErrPermissionDenied;
sl@0
   254
		}
sl@0
   255
	iDriverImpl.Wait();
sl@0
   256
	if (iCpuAccess != ESgCpuAccessNone)
sl@0
   257
		{
sl@0
   258
		iDriverImpl.Signal();
sl@0
   259
		return KErrInUse;
sl@0
   260
		}
sl@0
   261
	iCpuAccess = aCpuAccess;
sl@0
   262
	iIsUserAccess = aIsUserAccess;
sl@0
   263
	iDriverImpl.Signal();
sl@0
   264
	return KErrNone;
sl@0
   265
	}
sl@0
   266
sl@0
   267
sl@0
   268
TInt XSgImageStateBase::EndDataAccess(TBool aIsUserAccess)
sl@0
   269
	{
sl@0
   270
	iDriverImpl.Wait();
sl@0
   271
	if (iCpuAccess == ESgCpuAccessNone || iIsUserAccess != aIsUserAccess)
sl@0
   272
		{
sl@0
   273
		iDriverImpl.Signal();
sl@0
   274
		return KErrGeneral;
sl@0
   275
		}
sl@0
   276
	iCpuAccess = ESgCpuAccessNone;
sl@0
   277
	iIsUserAccess = EFalse;
sl@0
   278
	iDriverImpl.Signal();
sl@0
   279
	return KErrNone;
sl@0
   280
	}
sl@0
   281
sl@0
   282
sl@0
   283
#ifndef SYMBIAN_GRAPHICS_USE_GPU
sl@0
   284
sl@0
   285
// XSgImageImpl_SwLocal
sl@0
   286
sl@0
   287
TInt XSgImageImpl_SwLocal::New(XSgImageImpl_SwLocal*& aPtr, XSgDriverImpl& aDriverImpl, const TSgDrawableId& aId,
sl@0
   288
	                           const TSgImageInfo& aInfo, const TAny* aDataAddress, TInt aDataStride)
sl@0
   289
	{
sl@0
   290
	aPtr = static_cast<XSgImageImpl_SwLocal*>(aDriverImpl.Alloc(sizeof(XSgImageImpl_SwLocal)));
sl@0
   291
	if (!aPtr)
sl@0
   292
		{
sl@0
   293
		return KErrNoMemory;
sl@0
   294
		}
sl@0
   295
	new(aPtr) XSgImageImpl_SwLocal(aDriverImpl, aId);
sl@0
   296
	TInt err = aPtr->Construct(aInfo, aDataAddress, aDataStride);
sl@0
   297
	if (err != KErrNone)
sl@0
   298
		{
sl@0
   299
		aPtr->Delete();
sl@0
   300
		aPtr = NULL;
sl@0
   301
		}
sl@0
   302
	return err;
sl@0
   303
	}
sl@0
   304
sl@0
   305
sl@0
   306
TInt XSgImageImpl_SwLocal::New(XSgImageImpl_SwLocal*& aPtr, const XSgImageImpl_SwLocal& aImage, TUint32 aFlags)
sl@0
   307
	{
sl@0
   308
	aPtr = static_cast<XSgImageImpl_SwLocal*>(aImage.iDriverImpl.Alloc(sizeof(XSgImageImpl_SwLocal)));
sl@0
   309
	if (!aPtr)
sl@0
   310
		{
sl@0
   311
		return KErrNoMemory;
sl@0
   312
		}
sl@0
   313
	new(aPtr) XSgImageImpl_SwLocal(aImage, aFlags);
sl@0
   314
	return KErrNone;
sl@0
   315
	}
sl@0
   316
sl@0
   317
sl@0
   318
TInt XSgImageImpl_SwLocal::Construct(const TSgImageInfo& aInfo, const TAny* aDataAddress, TInt aDataStride)
sl@0
   319
	{
sl@0
   320
	XSgImageState_SwLocal* state;
sl@0
   321
	TInt err = XSgImageState_SwLocal::New(state, iDriverImpl, aInfo);
sl@0
   322
	if (err != KErrNone)
sl@0
   323
		{
sl@0
   324
		return err;
sl@0
   325
		}
sl@0
   326
	state->IncRefCount();
sl@0
   327
	iState = state;
sl@0
   328
	return SetData(aDataAddress, aDataStride);
sl@0
   329
	}
sl@0
   330
sl@0
   331
sl@0
   332
// XSgImageState_SwLocal
sl@0
   333
sl@0
   334
TInt XSgImageState_SwLocal::New(XSgImageState_SwLocal*& aPtr, XSgDriverImpl& aDriverImpl, const TSgImageInfo& aInfo)
sl@0
   335
	{
sl@0
   336
	TInt dataStride = Align4(SgMinDataStride(aInfo.iSizeInPixels.iWidth, aInfo.iPixelFormat));
sl@0
   337
	TInt size = _FOFF(XSgImageState_SwLocal, iUserAttributes) + aInfo.iUserAttributeCount * sizeof(TSgUserAttribute) + dataStride * aInfo.iSizeInPixels.iHeight;
sl@0
   338
	aPtr = static_cast<XSgImageState_SwLocal*>(aDriverImpl.Alloc(size));
sl@0
   339
	if (!aPtr)
sl@0
   340
		{
sl@0
   341
		return KErrNoMemory;
sl@0
   342
		}
sl@0
   343
	new(aPtr) XSgImageState_SwLocal(aDriverImpl, aInfo, dataStride);
sl@0
   344
	return KErrNone;
sl@0
   345
	}
sl@0
   346
sl@0
   347
sl@0
   348
XSgImageState_SwLocal::XSgImageState_SwLocal(XSgDriverImpl& aDriverImpl, const TSgImageInfo& aInfo, TInt aDataStride)
sl@0
   349
	: XSgImageStateBase(aDriverImpl, aDataStride), iMetaData(aInfo, aDriverImpl.PixelFormatTable())
sl@0
   350
	{
sl@0
   351
	iUserAttributeCount = aInfo.iUserAttributeCount;
sl@0
   352
	Mem::Copy(iUserAttributes, aInfo.iUserAttributes, aInfo.iUserAttributeCount * sizeof(TSgUserAttribute));
sl@0
   353
	}
sl@0
   354
sl@0
   355
sl@0
   356
const TSgImageMetaData& XSgImageState_SwLocal::MetaData() const
sl@0
   357
	{
sl@0
   358
	return iMetaData;
sl@0
   359
	}
sl@0
   360
sl@0
   361
sl@0
   362
TInt XSgImageState_SwLocal::GetUserAttributes(TSgUserAttribute* aUserAttributes, TInt aUserAttributeCount) const
sl@0
   363
	{
sl@0
   364
	for (TInt i = 0; i < aUserAttributeCount; ++i)
sl@0
   365
		{
sl@0
   366
		TBool found = EFalse;
sl@0
   367
		for (TInt j = 0; j < iUserAttributeCount; ++j)
sl@0
   368
			{
sl@0
   369
			if (aUserAttributes[i].iUid == iUserAttributes[j].iUid)
sl@0
   370
				{
sl@0
   371
				aUserAttributes[i].iValue = iUserAttributes[j].iValue;
sl@0
   372
				found = ETrue;
sl@0
   373
				break;
sl@0
   374
				}
sl@0
   375
			}
sl@0
   376
		if (!found)
sl@0
   377
			{
sl@0
   378
			return KErrNotFound;
sl@0
   379
			}
sl@0
   380
		}
sl@0
   381
	return KErrNone;
sl@0
   382
	}
sl@0
   383
sl@0
   384
sl@0
   385
TAny* XSgImageState_SwLocal::DataAddress() const
sl@0
   386
	{
sl@0
   387
	//__ASSERT_DEBUG(iCpuAccess != ESgCpuAccessNone, ::Panic(ESgPanicNoCpuAccess));
sl@0
   388
	return (TAny*)PtrAdd(iUserAttributes, iUserAttributeCount * sizeof(TSgUserAttribute));
sl@0
   389
	}
sl@0
   390
sl@0
   391
#endif
sl@0
   392
sl@0
   393
sl@0
   394
// XSgImageImpl_SurfaceManager
sl@0
   395
sl@0
   396
sl@0
   397
TInt XSgImageImpl_SurfaceManager::New(XSgImageImpl_SurfaceManager*& aPtr, XSgDriverImpl& aDriverImpl,
sl@0
   398
                                      const TSgImageInfo& aInfo, TBool aIsCached, const TAny* aDataAddress, TInt aDataStride)
sl@0
   399
	{
sl@0
   400
	aPtr = static_cast<XSgImageImpl_SurfaceManager*>(aDriverImpl.Alloc(sizeof(XSgImageImpl_SurfaceManager)));
sl@0
   401
	if (!aPtr)
sl@0
   402
		{
sl@0
   403
		return KErrNoMemory;
sl@0
   404
		}
sl@0
   405
	new(aPtr) XSgImageImpl_SurfaceManager(aDriverImpl);
sl@0
   406
	TInt err = aPtr->Construct(aInfo, aIsCached, aDataAddress, aDataStride);
sl@0
   407
	if (err != KErrNone)
sl@0
   408
		{
sl@0
   409
		aPtr->Delete();
sl@0
   410
		aPtr = NULL;
sl@0
   411
		}
sl@0
   412
	return err;
sl@0
   413
	}
sl@0
   414
sl@0
   415
sl@0
   416
TInt XSgImageImpl_SurfaceManager::New(XSgImageImpl_SurfaceManager*& aPtr, XSgDriverImpl& aDriverImpl, const TSgDrawableId& aId)
sl@0
   417
	{
sl@0
   418
	aPtr = static_cast<XSgImageImpl_SurfaceManager*>(aDriverImpl.Alloc(sizeof(XSgImageImpl_SurfaceManager)));
sl@0
   419
	if (!aPtr)
sl@0
   420
		{
sl@0
   421
		return KErrNoMemory;
sl@0
   422
		}
sl@0
   423
	new(aPtr) XSgImageImpl_SurfaceManager(aDriverImpl, aId);
sl@0
   424
	TInt err = aPtr->Construct(aId);
sl@0
   425
	if (err != KErrNone)
sl@0
   426
		{
sl@0
   427
		aPtr->Delete();
sl@0
   428
		aPtr = NULL;
sl@0
   429
		}
sl@0
   430
	return err;
sl@0
   431
	}
sl@0
   432
sl@0
   433
sl@0
   434
TInt XSgImageImpl_SurfaceManager::New(XSgImageImpl_SurfaceManager*& aPtr, const XSgImageImpl_SurfaceManager& aImage, TUint32 aFlags)
sl@0
   435
	{
sl@0
   436
	aPtr = static_cast<XSgImageImpl_SurfaceManager*>(aImage.iDriverImpl.Alloc(sizeof(XSgImageImpl_SurfaceManager)));
sl@0
   437
	if (!aPtr)
sl@0
   438
		{
sl@0
   439
		return KErrNoMemory;
sl@0
   440
		}
sl@0
   441
	new(aPtr) XSgImageImpl_SurfaceManager(aImage, aFlags);
sl@0
   442
	return KErrNone;
sl@0
   443
	}
sl@0
   444
sl@0
   445
sl@0
   446
TInt XSgImageImpl_SurfaceManager::Construct(const TSgImageInfo& aInfo, TBool aIsCached, const TAny* aDataAddress, TInt aDataStride)
sl@0
   447
	{
sl@0
   448
	XSgImageState_SurfaceManager* state;
sl@0
   449
	TInt err = XSgImageState_SurfaceManager::New(state, iDriverImpl, aInfo, aIsCached);
sl@0
   450
	if (err != KErrNone)
sl@0
   451
		{
sl@0
   452
		return err;
sl@0
   453
		}
sl@0
   454
	Mem::Copy(&iId, &state->SurfaceId(), sizeof(TSurfaceId));
sl@0
   455
	state->IncRefCount();
sl@0
   456
	iState = state;
sl@0
   457
	return SetData(aDataAddress, aDataStride);
sl@0
   458
	}
sl@0
   459
sl@0
   460
sl@0
   461
TInt XSgImageImpl_SurfaceManager::Construct(const TSgDrawableId& aId)
sl@0
   462
	{
sl@0
   463
	XSgImageState_SurfaceManager* state;
sl@0
   464
	TInt err = XSgImageState_SurfaceManager::New(state, iDriverImpl, aId);
sl@0
   465
	if (err != KErrNone)
sl@0
   466
		{
sl@0
   467
		return err;
sl@0
   468
		}
sl@0
   469
	state->IncRefCount();
sl@0
   470
	iState = state;
sl@0
   471
	return KErrNone;
sl@0
   472
	}
sl@0
   473
sl@0
   474
sl@0
   475
TInt XSgImageImpl_SurfaceManager::GetInterface(TUid aInterfaceUid, TAny*& aInterfacePtr)
sl@0
   476
	{
sl@0
   477
	if (aInterfaceUid.iUid == MSgImage_Chunk::EInterfaceUid)
sl@0
   478
		{
sl@0
   479
		aInterfacePtr = static_cast<MSgImage_Chunk*>(this);
sl@0
   480
		return KErrNone;
sl@0
   481
		}
sl@0
   482
	return XSgImageImplBase::GetInterface(aInterfaceUid, aInterfacePtr);
sl@0
   483
	}
sl@0
   484
sl@0
   485
sl@0
   486
const RChunk& XSgImageImpl_SurfaceManager::DataChunk() const
sl@0
   487
	{
sl@0
   488
	return static_cast<XSgImageState_SurfaceManager*>(iState)->DataChunk();
sl@0
   489
	}
sl@0
   490
sl@0
   491
sl@0
   492
TInt XSgImageImpl_SurfaceManager::DataOffset() const
sl@0
   493
	{
sl@0
   494
	return static_cast<XSgImageState_SurfaceManager*>(iState)->DataOffset();
sl@0
   495
	}
sl@0
   496
sl@0
   497
sl@0
   498
TInt XSgImageImpl_SurfaceManager::DataStride() const
sl@0
   499
	{
sl@0
   500
	return iState->DataStride();
sl@0
   501
	}
sl@0
   502
sl@0
   503
sl@0
   504
// XSgImageState_SurfaceManager
sl@0
   505
sl@0
   506
TInt XSgImageState_SurfaceManager::New(XSgImageState_SurfaceManager*& aPtr, XSgDriverImpl& aDriverImpl, const TSgImageInfo& aInfo, TBool aIsCached)
sl@0
   507
	{
sl@0
   508
	aPtr = static_cast<XSgImageState_SurfaceManager*>(aDriverImpl.Alloc(sizeof(XSgImageState_SurfaceManager)));
sl@0
   509
	if (!aPtr)
sl@0
   510
		{
sl@0
   511
		return KErrNoMemory;
sl@0
   512
		}
sl@0
   513
	new(aPtr) XSgImageState_SurfaceManager(aDriverImpl);
sl@0
   514
	TInt err = aPtr->Construct(aInfo, aIsCached);
sl@0
   515
	if (err != KErrNone)
sl@0
   516
		{
sl@0
   517
		aPtr->Delete();
sl@0
   518
		aPtr = NULL;
sl@0
   519
		}
sl@0
   520
	return err;
sl@0
   521
	}
sl@0
   522
sl@0
   523
sl@0
   524
TInt XSgImageState_SurfaceManager::New(XSgImageState_SurfaceManager*& aPtr, XSgDriverImpl& aDriverImpl, const TSgDrawableId& aId)
sl@0
   525
	{
sl@0
   526
	aPtr = static_cast<XSgImageState_SurfaceManager*>(aDriverImpl.Alloc(sizeof(XSgImageState_SurfaceManager)));
sl@0
   527
	if (!aPtr)
sl@0
   528
		{
sl@0
   529
		return KErrNoMemory;
sl@0
   530
		}
sl@0
   531
	new(aPtr) XSgImageState_SurfaceManager(aDriverImpl);
sl@0
   532
	TInt err = aPtr->Construct(aId);
sl@0
   533
	if (err != KErrNone)
sl@0
   534
		{
sl@0
   535
		aPtr->Delete();
sl@0
   536
		aPtr = NULL;
sl@0
   537
		}
sl@0
   538
	return err;
sl@0
   539
	}
sl@0
   540
sl@0
   541
sl@0
   542
TInt XSgImageState_SurfaceManager::Construct(const TSgImageInfo& aInfo, TBool aIsCached)
sl@0
   543
	{
sl@0
   544
	TInt maxNumberOfHints;
sl@0
   545
	TInt err;
sl@0
   546
	err=iDriverImpl.GetSurfaceManagerAttrib(RSurfaceManager::EMaxNumberOfHints,maxNumberOfHints);
sl@0
   547
	if (err!=KErrNone)
sl@0
   548
		{
sl@0
   549
		return err;
sl@0
   550
		}
sl@0
   551
	
sl@0
   552
	if (aInfo.iUserAttributeCount > maxNumberOfHints)
sl@0
   553
		{
sl@0
   554
		return KErrOverflow;
sl@0
   555
		}
sl@0
   556
	RSurfaceManager::THintPair* hints = new RSurfaceManager::THintPair[aInfo.iUserAttributeCount];
sl@0
   557
	if(!hints)
sl@0
   558
		{
sl@0
   559
		return KErrNoMemory;
sl@0
   560
		}
sl@0
   561
	RSurfaceManager::TSurfaceCreationAttributesBuf reqs;
sl@0
   562
	reqs().iSurfaceHints = hints;
sl@0
   563
	reqs().iHintCount = aInfo.iUserAttributeCount;
sl@0
   564
	reqs().iSize = aInfo.iSizeInPixels;
sl@0
   565
	reqs().iBuffers = 1;
sl@0
   566
	reqs().iPixelFormat = aInfo.iPixelFormat;
sl@0
   567
	reqs().iStride = SgAlignedDataStride(aInfo.iSizeInPixels.iWidth, aInfo.iPixelFormat);
sl@0
   568
	reqs().iOffsetToFirstBuffer = SgOffsetToFirstBuffer(sizeof(TSgImageMetaData));
sl@0
   569
	reqs().iAlignment = 4;
sl@0
   570
	reqs().iContiguous = EFalse;
sl@0
   571
	reqs().iCacheAttrib = aIsCached ? RSurfaceManager::ECached : RSurfaceManager::ENotCached;
sl@0
   572
	reqs().iOffsetBetweenBuffers = SgOffsetBetweenBuffers(reqs().iStride, aInfo.iSizeInPixels.iHeight);
sl@0
   573
	reqs().iMappable = ETrue;
sl@0
   574
	for (TInt i = 0; i < aInfo.iUserAttributeCount; ++i)
sl@0
   575
		{
sl@0
   576
		reqs().iSurfaceHints[i].iKey = aInfo.iUserAttributes[i].iUid;
sl@0
   577
		reqs().iSurfaceHints[i].iValue = aInfo.iUserAttributes[i].iValue;
sl@0
   578
		reqs().iSurfaceHints[i].iMutable = EFalse;
sl@0
   579
		}
sl@0
   580
	TSurfaceId surfaceId;
sl@0
   581
	err = iDriverImpl.CreateSurface(reqs, surfaceId);
sl@0
   582
	delete[] hints;
sl@0
   583
	hints = NULL;
sl@0
   584
	reqs().iSurfaceHints = NULL;
sl@0
   585
	if (err != KErrNone)
sl@0
   586
		{
sl@0
   587
		return err;
sl@0
   588
		}
sl@0
   589
	iSurfaceId = surfaceId;
sl@0
   590
	RSurfaceManager::TInfoBuf info;
sl@0
   591
	err = iDriverImpl.SurfaceInfo(surfaceId, info);
sl@0
   592
	if (err != KErrNone)
sl@0
   593
		{
sl@0
   594
		return err;
sl@0
   595
		}
sl@0
   596
	err=iDriverImpl.GetBufferOffset(surfaceId,0,iDataOffset);	
sl@0
   597
	if (err != KErrNone)
sl@0
   598
		{
sl@0
   599
		return err;
sl@0
   600
		}	
sl@0
   601
	iDataStride = info().iStride;
sl@0
   602
	RChunk chunk;
sl@0
   603
	err = iDriverImpl.MapSurface(surfaceId, chunk);
sl@0
   604
	if (err != KErrNone)
sl@0
   605
		{
sl@0
   606
		return err;
sl@0
   607
		}
sl@0
   608
	iDataChunk = chunk;
sl@0
   609
	new(chunk.Base()) TSgImageMetaData(aInfo, iDriverImpl.PixelFormatTable(), aIsCached);
sl@0
   610
	return err;
sl@0
   611
	}
sl@0
   612
sl@0
   613
sl@0
   614
TInt XSgImageState_SurfaceManager::Construct(const TSgDrawableId& aId)
sl@0
   615
	{
sl@0
   616
	const TSgImageId_SurfaceManager& id_SurfaceManager = reinterpret_cast<const TSgImageId_SurfaceManager&>(aId);
sl@0
   617
	if (id_SurfaceManager.iBufferIndex < 0)
sl@0
   618
		{
sl@0
   619
		return KErrNotFound;
sl@0
   620
		}
sl@0
   621
	if (id_SurfaceManager.iMetaDataIndex < 0)
sl@0
   622
		{
sl@0
   623
		return KErrNotFound;
sl@0
   624
		}
sl@0
   625
	TInt err = iDriverImpl.OpenSurface(id_SurfaceManager.iSurfaceId);
sl@0
   626
	if (err != KErrNone)
sl@0
   627
		{
sl@0
   628
		return err;
sl@0
   629
		}
sl@0
   630
	iSurfaceId = id_SurfaceManager.iSurfaceId;
sl@0
   631
	RSurfaceManager::TInfoBuf info;
sl@0
   632
	err = iDriverImpl.SurfaceInfo(id_SurfaceManager.iSurfaceId, info);
sl@0
   633
	if (err != KErrNone)
sl@0
   634
		{
sl@0
   635
		return err;
sl@0
   636
		}
sl@0
   637
	iDataStride = info().iStride;
sl@0
   638
	if (id_SurfaceManager.iBufferIndex >= info().iBuffers)
sl@0
   639
		{
sl@0
   640
		return KErrNotFound;
sl@0
   641
		}
sl@0
   642
	iBufferIndex = id_SurfaceManager.iBufferIndex;
sl@0
   643
	TInt offsetToFirstBuffer;
sl@0
   644
	err=iDriverImpl.GetBufferOffset(id_SurfaceManager.iSurfaceId,0,offsetToFirstBuffer);
sl@0
   645
	if (err != KErrNone)
sl@0
   646
		{
sl@0
   647
		return err;
sl@0
   648
		}	
sl@0
   649
	if ((id_SurfaceManager.iMetaDataIndex + 1) * sizeof(TSgImageMetaData) > offsetToFirstBuffer)
sl@0
   650
		{
sl@0
   651
		return KErrNotFound;
sl@0
   652
		}
sl@0
   653
	iMetaDataOffset = id_SurfaceManager.iMetaDataIndex * sizeof(TSgImageMetaData);
sl@0
   654
	RChunk chunk;
sl@0
   655
	err = iDriverImpl.MapSurface(id_SurfaceManager.iSurfaceId, chunk);
sl@0
   656
	if (err != KErrNone)
sl@0
   657
		{
sl@0
   658
		return err;
sl@0
   659
		}
sl@0
   660
	iDataChunk = chunk;
sl@0
   661
	err=iDriverImpl.GetBufferOffset(id_SurfaceManager.iSurfaceId,id_SurfaceManager.iBufferIndex,iDataOffset);	
sl@0
   662
	return err;
sl@0
   663
	}
sl@0
   664
sl@0
   665
sl@0
   666
XSgImageState_SurfaceManager::~XSgImageState_SurfaceManager()
sl@0
   667
	{
sl@0
   668
	if (!iSurfaceId.IsNull())
sl@0
   669
		{
sl@0
   670
		iDriverImpl.CloseSurface(iSurfaceId);
sl@0
   671
		iDataChunk.Close();
sl@0
   672
		}
sl@0
   673
	}
sl@0
   674
sl@0
   675
sl@0
   676
const TSgImageMetaData& XSgImageState_SurfaceManager::MetaData() const
sl@0
   677
	{
sl@0
   678
	return *reinterpret_cast<TSgImageMetaData*>(iDataChunk.Base() + iMetaDataOffset);
sl@0
   679
	}
sl@0
   680
sl@0
   681
sl@0
   682
TInt XSgImageState_SurfaceManager::GetUserAttributes(TSgUserAttribute* aUserAttributes, TInt aUserAttributeCount) const
sl@0
   683
	{
sl@0
   684
	for (TInt i = 0; i < aUserAttributeCount; ++i)
sl@0
   685
		{
sl@0
   686
		RSurfaceManager::THintPair hint;
sl@0
   687
		hint.iKey = aUserAttributes[i].iUid;
sl@0
   688
		TInt err = iDriverImpl.GetSurfaceHint(iSurfaceId, hint);
sl@0
   689
		if (err != KErrNone)
sl@0
   690
			{
sl@0
   691
			return err;
sl@0
   692
			}
sl@0
   693
		aUserAttributes[i].iValue = hint.iValue;
sl@0
   694
		}
sl@0
   695
	return KErrNone;
sl@0
   696
	}
sl@0
   697
sl@0
   698
sl@0
   699
TAny* XSgImageState_SurfaceManager::DataAddress() const
sl@0
   700
	{
sl@0
   701
#ifdef SYMBIAN_GRAPHICS_AUTOFLUSH_CACHE
sl@0
   702
	__ASSERT_DEBUG(iCpuAccess != ESgCpuAccessNone, ::Panic(ESgPanicNoCpuAccess));
sl@0
   703
#endif
sl@0
   704
	return iDataChunk.Base() + iDataOffset;
sl@0
   705
	}
sl@0
   706
sl@0
   707
sl@0
   708
#ifdef SYMBIAN_GRAPHICS_AUTOFLUSH_CACHE
sl@0
   709
sl@0
   710
TInt XSgImageState_SurfaceManager::BeginDataAccess(TSgCpuAccess aCpuAccess, TBool aIsUserAccess)
sl@0
   711
	{
sl@0
   712
	TInt err = XSgImageStateBase::BeginDataAccess(aCpuAccess, aIsUserAccess);
sl@0
   713
	if (err != KErrNone)
sl@0
   714
		{
sl@0
   715
		return err;
sl@0
   716
		}
sl@0
   717
	if (aCpuAccess != ESgCpuAccessWriteOnly && MetaData().iIsCached && (MetaData().iPotentialUsage & KSgUsageAllTargets))
sl@0
   718
		{
sl@0
   719
		// Cache::SyncMemoryAfterDmaRead() cannot fail so the following should not fail if the arguments are correct
sl@0
   720
		err = iDriverImpl.SynchronizeCache(iSurfaceId, iBufferIndex, RSurfaceManager::ESyncAfterNonCPUWrite);
sl@0
   721
		__ASSERT_DEBUG(err == KErrNone, Panic(ESgPanicResourceAdapterGeneral));
sl@0
   722
		}
sl@0
   723
	return KErrNone;
sl@0
   724
	}
sl@0
   725
sl@0
   726
sl@0
   727
TInt XSgImageState_SurfaceManager::EndDataAccess(TBool aIsUserAccess)
sl@0
   728
	{
sl@0
   729
	TSgCpuAccess prevCpuAccess = iCpuAccess;
sl@0
   730
	TInt err = XSgImageStateBase::EndDataAccess(aIsUserAccess);
sl@0
   731
	if (err != KErrNone)
sl@0
   732
		{
sl@0
   733
		return err;
sl@0
   734
		}
sl@0
   735
	if (prevCpuAccess != ESgCpuAccessReadOnly && MetaData().iIsCached)
sl@0
   736
		{
sl@0
   737
		// Cache::SyncMemoryBeforeDmaWrite() cannot fail so the following should not fail if the arguments are correct
sl@0
   738
		err = iDriverImpl.SynchronizeCache(iSurfaceId, iBufferIndex, RSurfaceManager::ESyncBeforeNonCPURead);
sl@0
   739
		__ASSERT_DEBUG(err == KErrNone, Panic(ESgPanicResourceAdapterGeneral));
sl@0
   740
		}
sl@0
   741
	return KErrNone;
sl@0
   742
	}
sl@0
   743
sl@0
   744
#endif