os/graphics/graphicsresourceservices/graphicsresourceadaptation/src/sgimageimpl.cpp
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/graphics/graphicsresourceservices/graphicsresourceadaptation/src/sgimageimpl.cpp Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,744 @@
1.4 +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
1.5 +// All rights reserved.
1.6 +// This component and the accompanying materials are made available
1.7 +// under the terms of "Eclipse Public License v1.0"
1.8 +// which accompanies this distribution, and is available
1.9 +// at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.10 +//
1.11 +// Initial Contributors:
1.12 +// Nokia Corporation - initial contribution.
1.13 +//
1.14 +// Contributors:
1.15 +//
1.16 +// Description:
1.17 +//
1.18 +
1.19 +#include "sgimageimpl.h"
1.20 +#include "sgresourceinternal.h"
1.21 +
1.22 +
1.23 +// TSgImageMetaData
1.24 +
1.25 +TSgImageMetaData::TSgImageMetaData(const TSgImageInfo& aInfo, TArray<TSgPixelFormatTableEntry> aPixelFormatTable, TBool aIsCached)
1.26 + : iCreatorProcess(RProcess().Id()),
1.27 + iSizeInPixels(aInfo.iSizeInPixels),
1.28 + iPixelFormat(aInfo.iPixelFormat),
1.29 + iRequestedUsage(aInfo.iUsage),
1.30 + iPotentialUsage(0),
1.31 + iShareable(aInfo.iShareable),
1.32 + iCpuAccess(aInfo.iCpuAccess),
1.33 + iScreenId(aInfo.iScreenId),
1.34 + iIsCached(aIsCached)
1.35 + {
1.36 + TUint32 usageMask = (aInfo.iUsage & KSgUsageAllSources ? KSgUsageAllSources : 0)
1.37 + | (aInfo.iUsage & KSgUsageAllTargets ? KSgUsageAllTargets : 0);
1.38 + TInt n = aPixelFormatTable.Count();
1.39 + for (TInt i = 0; i < n; ++i)
1.40 + {
1.41 + const TSgPixelFormatTableEntry& entry = aPixelFormatTable[i];
1.42 + if (entry.IsMatchIgnoringUsage(aInfo))
1.43 + {
1.44 + iPotentialUsage |= entry.iUsage & usageMask;
1.45 + }
1.46 + }
1.47 + }
1.48 +
1.49 +
1.50 +void TSgImageMetaData::GetInfo(TSgImageInfo& aInfo, TBool aGetPotentialUsage) const
1.51 + {
1.52 + aInfo.iSizeInPixels = iSizeInPixels;
1.53 + aInfo.iPixelFormat = iPixelFormat;
1.54 + aInfo.iUsage = aGetPotentialUsage ? iPotentialUsage : iRequestedUsage;
1.55 + aInfo.iShareable = iShareable;
1.56 + aInfo.iCpuAccess = iCpuAccess;
1.57 + aInfo.iScreenId = iScreenId;
1.58 + }
1.59 +
1.60 +
1.61 +// XSgImageImplBase
1.62 +
1.63 +XSgImageImplBase::XSgImageImplBase(const XSgImageImplBase& aImage, TUint32 aFlags)
1.64 + : XSgBase(aImage.iDriverImpl)
1.65 + {
1.66 + __ASSERT_DEBUG(iDriverImpl.IsMutexHeld(), Panic(ESgPanicMutexNotHeld));
1.67 + iId = aImage.iId;
1.68 + iId.iId[KSgImageIdFlagsIndex] = aFlags;
1.69 + aImage.iState->IncRefCount();
1.70 + iState = aImage.iState;
1.71 + }
1.72 +
1.73 +
1.74 +XSgImageImplBase::~XSgImageImplBase()
1.75 + {
1.76 + __ASSERT_DEBUG(iDriverImpl.IsMutexHeld(), Panic(ESgPanicMutexNotHeld));
1.77 + if (iState && iState->DecRefCount() == 0)
1.78 + {
1.79 + Unmap();
1.80 + iState->Delete();
1.81 + }
1.82 + }
1.83 +
1.84 +
1.85 +TInt XSgImageImplBase::Compare(const TSgDrawableId* aId, const XSgImageImplBase& aImage)
1.86 + {
1.87 + return Mem::Compare(reinterpret_cast<const TUint8*>(aId), sizeof(TSgDrawableId),
1.88 + reinterpret_cast<const TUint8*>(&aImage.Id()), sizeof(TSgDrawableId));
1.89 + }
1.90 +
1.91 +
1.92 +TInt XSgImageImplBase::Compare(const XSgImageImplBase& aImage1, const XSgImageImplBase& aImage2)
1.93 + {
1.94 + return Compare(&aImage1.Id(), aImage2);
1.95 + }
1.96 +
1.97 +
1.98 +TInt XSgImageImplBase::CompareIgnoringFlags(const TSgDrawableId* aId, const XSgImageImplBase& aImage)
1.99 + {
1.100 + return Mem::Compare(reinterpret_cast<const TUint8*>(aId), sizeof(TSgDrawableId) - sizeof(TUint32),
1.101 + reinterpret_cast<const TUint8*>(&aImage.Id()), sizeof(TSgDrawableId) - sizeof(TUint32));
1.102 + }
1.103 +
1.104 +
1.105 +void XSgImageImplBase::Close()
1.106 + {
1.107 + XSgDriverImpl& driverImpl = iDriverImpl;
1.108 + driverImpl.Wait();
1.109 + if (DecRefCount() == 0)
1.110 + {
1.111 + driverImpl.DeleteImage(this);
1.112 + }
1.113 + driverImpl.Signal();
1.114 + }
1.115 +
1.116 +
1.117 +const TSgDrawableId& XSgImageImplBase::Id() const
1.118 + {
1.119 + return iId;
1.120 + }
1.121 +
1.122 +
1.123 +TUid XSgImageImplBase::DrawableType() const
1.124 + {
1.125 + return KSgImageTypeUid;
1.126 + }
1.127 +
1.128 +
1.129 +TInt XSgImageImplBase::GetInterface(TUid aInterfaceUid, TAny*& aInterfacePtr)
1.130 + {
1.131 + if (aInterfaceUid.iUid == MSgImage_Sw::EInterfaceUid)
1.132 + {
1.133 + aInterfacePtr = static_cast<MSgImage_Sw*>(this);
1.134 + return KErrNone;
1.135 + }
1.136 + return KErrExtensionNotSupported;
1.137 + }
1.138 +
1.139 +
1.140 +TInt XSgImageImplBase::GetInfo(TSgImageInfo& aInfo) const
1.141 + {
1.142 + iState->MetaData().GetInfo(aInfo, iId.iId[KSgImageIdFlagsIndex] & ESgDoNotRestrictUsage);
1.143 + return iState->GetUserAttributes(aInfo.iUserAttributes, aInfo.iUserAttributeCount);
1.144 + }
1.145 +
1.146 +
1.147 +TInt XSgImageImplBase::MapReadOnly(const TAny*& aDataAddress, TInt& aDataStride)
1.148 + {
1.149 + TInt err = iState->BeginDataAccess(ESgCpuAccessReadOnly, ETrue);
1.150 + if (err != KErrNone)
1.151 + {
1.152 + return err;
1.153 + }
1.154 + aDataAddress = iState->DataAddress();
1.155 + aDataStride = iState->DataStride();
1.156 + return KErrNone;
1.157 + }
1.158 +
1.159 +
1.160 +TInt XSgImageImplBase::MapWriteOnly(TAny*& aDataAddress, TInt& aDataStride)
1.161 + {
1.162 + TInt err = iState->BeginDataAccess(ESgCpuAccessWriteOnly, ETrue);
1.163 + if (err != KErrNone)
1.164 + {
1.165 + return err;
1.166 + }
1.167 + aDataAddress = iState->DataAddress();
1.168 + aDataStride = iState->DataStride();
1.169 + return KErrNone;
1.170 + }
1.171 +
1.172 +
1.173 +TInt XSgImageImplBase::MapReadWrite(TAny*& aDataAddress, TInt& aDataStride)
1.174 + {
1.175 + TInt err = iState->BeginDataAccess(ESgCpuAccessReadWrite, ETrue);
1.176 + if (err != KErrNone)
1.177 + {
1.178 + return err;
1.179 + }
1.180 + aDataAddress = iState->DataAddress();
1.181 + aDataStride = iState->DataStride();
1.182 + return KErrNone;
1.183 + }
1.184 +
1.185 +
1.186 +TInt XSgImageImplBase::Unmap()
1.187 + {
1.188 + return iState->EndDataAccess(ETrue);
1.189 + }
1.190 +
1.191 +
1.192 +TAny* XSgImageImplBase::DataAddress() const
1.193 + {
1.194 + return iState->DataAddress();
1.195 + }
1.196 +
1.197 +
1.198 +TInt XSgImageImplBase::DataStride() const
1.199 + {
1.200 + return iState->DataStride();
1.201 + }
1.202 +
1.203 +
1.204 +TInt XSgImageImplBase::BeginDataAccess(TSgCpuAccess aCpuAccess)
1.205 + {
1.206 + return iState->BeginDataAccess(aCpuAccess, EFalse);
1.207 + }
1.208 +
1.209 +
1.210 +TInt XSgImageImplBase::EndDataAccess()
1.211 + {
1.212 + return iState->EndDataAccess(EFalse);
1.213 + }
1.214 +
1.215 +
1.216 +TInt XSgImageImplBase::SetData(const TAny* aDataAddress, TInt aDataStride)
1.217 + {
1.218 + if (aDataAddress)
1.219 + {
1.220 + TInt err = BeginDataAccess(ESgCpuAccessWriteOnly);
1.221 + if (err != KErrNone)
1.222 + {
1.223 + return err;
1.224 + }
1.225 + const TSgImageMetaData& metaData = iState->MetaData();
1.226 + const TAny* src = aDataAddress;
1.227 + TAny* trg = iState->DataAddress();
1.228 + TInt dataStride = iState->DataStride();
1.229 + TInt minDataStride = SgMinDataStride(metaData.iSizeInPixels.iWidth, metaData.iPixelFormat);
1.230 + __ASSERT_DEBUG(minDataStride > 0, Panic(ESgPanicResourceAdapterGeneral));
1.231 + for (TInt y = 0; y < metaData.iSizeInPixels.iHeight; ++y)
1.232 + {
1.233 + Mem::Copy(trg, src, minDataStride);
1.234 + src = PtrAdd(src, aDataStride);
1.235 + trg = PtrAdd(trg, dataStride);
1.236 + }
1.237 + EndDataAccess();
1.238 + }
1.239 + return KErrNone;
1.240 + }
1.241 +
1.242 +
1.243 +TInt XSgImageStateBase::BeginDataAccess(TSgCpuAccess aCpuAccess, TBool aIsUserAccess)
1.244 + {
1.245 + if (aCpuAccess == ESgCpuAccessNone)
1.246 + {
1.247 + return KErrArgument;
1.248 + }
1.249 + const TSgImageMetaData& metaData = MetaData();
1.250 + if (aIsUserAccess && (~metaData.iCpuAccess & aCpuAccess))
1.251 + {
1.252 + return KErrAccessDenied;
1.253 + }
1.254 + if (aIsUserAccess && metaData.iCreatorProcess != RProcess().Id())
1.255 + {
1.256 + return KErrPermissionDenied;
1.257 + }
1.258 + iDriverImpl.Wait();
1.259 + if (iCpuAccess != ESgCpuAccessNone)
1.260 + {
1.261 + iDriverImpl.Signal();
1.262 + return KErrInUse;
1.263 + }
1.264 + iCpuAccess = aCpuAccess;
1.265 + iIsUserAccess = aIsUserAccess;
1.266 + iDriverImpl.Signal();
1.267 + return KErrNone;
1.268 + }
1.269 +
1.270 +
1.271 +TInt XSgImageStateBase::EndDataAccess(TBool aIsUserAccess)
1.272 + {
1.273 + iDriverImpl.Wait();
1.274 + if (iCpuAccess == ESgCpuAccessNone || iIsUserAccess != aIsUserAccess)
1.275 + {
1.276 + iDriverImpl.Signal();
1.277 + return KErrGeneral;
1.278 + }
1.279 + iCpuAccess = ESgCpuAccessNone;
1.280 + iIsUserAccess = EFalse;
1.281 + iDriverImpl.Signal();
1.282 + return KErrNone;
1.283 + }
1.284 +
1.285 +
1.286 +#ifndef SYMBIAN_GRAPHICS_USE_GPU
1.287 +
1.288 +// XSgImageImpl_SwLocal
1.289 +
1.290 +TInt XSgImageImpl_SwLocal::New(XSgImageImpl_SwLocal*& aPtr, XSgDriverImpl& aDriverImpl, const TSgDrawableId& aId,
1.291 + const TSgImageInfo& aInfo, const TAny* aDataAddress, TInt aDataStride)
1.292 + {
1.293 + aPtr = static_cast<XSgImageImpl_SwLocal*>(aDriverImpl.Alloc(sizeof(XSgImageImpl_SwLocal)));
1.294 + if (!aPtr)
1.295 + {
1.296 + return KErrNoMemory;
1.297 + }
1.298 + new(aPtr) XSgImageImpl_SwLocal(aDriverImpl, aId);
1.299 + TInt err = aPtr->Construct(aInfo, aDataAddress, aDataStride);
1.300 + if (err != KErrNone)
1.301 + {
1.302 + aPtr->Delete();
1.303 + aPtr = NULL;
1.304 + }
1.305 + return err;
1.306 + }
1.307 +
1.308 +
1.309 +TInt XSgImageImpl_SwLocal::New(XSgImageImpl_SwLocal*& aPtr, const XSgImageImpl_SwLocal& aImage, TUint32 aFlags)
1.310 + {
1.311 + aPtr = static_cast<XSgImageImpl_SwLocal*>(aImage.iDriverImpl.Alloc(sizeof(XSgImageImpl_SwLocal)));
1.312 + if (!aPtr)
1.313 + {
1.314 + return KErrNoMemory;
1.315 + }
1.316 + new(aPtr) XSgImageImpl_SwLocal(aImage, aFlags);
1.317 + return KErrNone;
1.318 + }
1.319 +
1.320 +
1.321 +TInt XSgImageImpl_SwLocal::Construct(const TSgImageInfo& aInfo, const TAny* aDataAddress, TInt aDataStride)
1.322 + {
1.323 + XSgImageState_SwLocal* state;
1.324 + TInt err = XSgImageState_SwLocal::New(state, iDriverImpl, aInfo);
1.325 + if (err != KErrNone)
1.326 + {
1.327 + return err;
1.328 + }
1.329 + state->IncRefCount();
1.330 + iState = state;
1.331 + return SetData(aDataAddress, aDataStride);
1.332 + }
1.333 +
1.334 +
1.335 +// XSgImageState_SwLocal
1.336 +
1.337 +TInt XSgImageState_SwLocal::New(XSgImageState_SwLocal*& aPtr, XSgDriverImpl& aDriverImpl, const TSgImageInfo& aInfo)
1.338 + {
1.339 + TInt dataStride = Align4(SgMinDataStride(aInfo.iSizeInPixels.iWidth, aInfo.iPixelFormat));
1.340 + TInt size = _FOFF(XSgImageState_SwLocal, iUserAttributes) + aInfo.iUserAttributeCount * sizeof(TSgUserAttribute) + dataStride * aInfo.iSizeInPixels.iHeight;
1.341 + aPtr = static_cast<XSgImageState_SwLocal*>(aDriverImpl.Alloc(size));
1.342 + if (!aPtr)
1.343 + {
1.344 + return KErrNoMemory;
1.345 + }
1.346 + new(aPtr) XSgImageState_SwLocal(aDriverImpl, aInfo, dataStride);
1.347 + return KErrNone;
1.348 + }
1.349 +
1.350 +
1.351 +XSgImageState_SwLocal::XSgImageState_SwLocal(XSgDriverImpl& aDriverImpl, const TSgImageInfo& aInfo, TInt aDataStride)
1.352 + : XSgImageStateBase(aDriverImpl, aDataStride), iMetaData(aInfo, aDriverImpl.PixelFormatTable())
1.353 + {
1.354 + iUserAttributeCount = aInfo.iUserAttributeCount;
1.355 + Mem::Copy(iUserAttributes, aInfo.iUserAttributes, aInfo.iUserAttributeCount * sizeof(TSgUserAttribute));
1.356 + }
1.357 +
1.358 +
1.359 +const TSgImageMetaData& XSgImageState_SwLocal::MetaData() const
1.360 + {
1.361 + return iMetaData;
1.362 + }
1.363 +
1.364 +
1.365 +TInt XSgImageState_SwLocal::GetUserAttributes(TSgUserAttribute* aUserAttributes, TInt aUserAttributeCount) const
1.366 + {
1.367 + for (TInt i = 0; i < aUserAttributeCount; ++i)
1.368 + {
1.369 + TBool found = EFalse;
1.370 + for (TInt j = 0; j < iUserAttributeCount; ++j)
1.371 + {
1.372 + if (aUserAttributes[i].iUid == iUserAttributes[j].iUid)
1.373 + {
1.374 + aUserAttributes[i].iValue = iUserAttributes[j].iValue;
1.375 + found = ETrue;
1.376 + break;
1.377 + }
1.378 + }
1.379 + if (!found)
1.380 + {
1.381 + return KErrNotFound;
1.382 + }
1.383 + }
1.384 + return KErrNone;
1.385 + }
1.386 +
1.387 +
1.388 +TAny* XSgImageState_SwLocal::DataAddress() const
1.389 + {
1.390 + //__ASSERT_DEBUG(iCpuAccess != ESgCpuAccessNone, ::Panic(ESgPanicNoCpuAccess));
1.391 + return (TAny*)PtrAdd(iUserAttributes, iUserAttributeCount * sizeof(TSgUserAttribute));
1.392 + }
1.393 +
1.394 +#endif
1.395 +
1.396 +
1.397 +// XSgImageImpl_SurfaceManager
1.398 +
1.399 +
1.400 +TInt XSgImageImpl_SurfaceManager::New(XSgImageImpl_SurfaceManager*& aPtr, XSgDriverImpl& aDriverImpl,
1.401 + const TSgImageInfo& aInfo, TBool aIsCached, const TAny* aDataAddress, TInt aDataStride)
1.402 + {
1.403 + aPtr = static_cast<XSgImageImpl_SurfaceManager*>(aDriverImpl.Alloc(sizeof(XSgImageImpl_SurfaceManager)));
1.404 + if (!aPtr)
1.405 + {
1.406 + return KErrNoMemory;
1.407 + }
1.408 + new(aPtr) XSgImageImpl_SurfaceManager(aDriverImpl);
1.409 + TInt err = aPtr->Construct(aInfo, aIsCached, aDataAddress, aDataStride);
1.410 + if (err != KErrNone)
1.411 + {
1.412 + aPtr->Delete();
1.413 + aPtr = NULL;
1.414 + }
1.415 + return err;
1.416 + }
1.417 +
1.418 +
1.419 +TInt XSgImageImpl_SurfaceManager::New(XSgImageImpl_SurfaceManager*& aPtr, XSgDriverImpl& aDriverImpl, const TSgDrawableId& aId)
1.420 + {
1.421 + aPtr = static_cast<XSgImageImpl_SurfaceManager*>(aDriverImpl.Alloc(sizeof(XSgImageImpl_SurfaceManager)));
1.422 + if (!aPtr)
1.423 + {
1.424 + return KErrNoMemory;
1.425 + }
1.426 + new(aPtr) XSgImageImpl_SurfaceManager(aDriverImpl, aId);
1.427 + TInt err = aPtr->Construct(aId);
1.428 + if (err != KErrNone)
1.429 + {
1.430 + aPtr->Delete();
1.431 + aPtr = NULL;
1.432 + }
1.433 + return err;
1.434 + }
1.435 +
1.436 +
1.437 +TInt XSgImageImpl_SurfaceManager::New(XSgImageImpl_SurfaceManager*& aPtr, const XSgImageImpl_SurfaceManager& aImage, TUint32 aFlags)
1.438 + {
1.439 + aPtr = static_cast<XSgImageImpl_SurfaceManager*>(aImage.iDriverImpl.Alloc(sizeof(XSgImageImpl_SurfaceManager)));
1.440 + if (!aPtr)
1.441 + {
1.442 + return KErrNoMemory;
1.443 + }
1.444 + new(aPtr) XSgImageImpl_SurfaceManager(aImage, aFlags);
1.445 + return KErrNone;
1.446 + }
1.447 +
1.448 +
1.449 +TInt XSgImageImpl_SurfaceManager::Construct(const TSgImageInfo& aInfo, TBool aIsCached, const TAny* aDataAddress, TInt aDataStride)
1.450 + {
1.451 + XSgImageState_SurfaceManager* state;
1.452 + TInt err = XSgImageState_SurfaceManager::New(state, iDriverImpl, aInfo, aIsCached);
1.453 + if (err != KErrNone)
1.454 + {
1.455 + return err;
1.456 + }
1.457 + Mem::Copy(&iId, &state->SurfaceId(), sizeof(TSurfaceId));
1.458 + state->IncRefCount();
1.459 + iState = state;
1.460 + return SetData(aDataAddress, aDataStride);
1.461 + }
1.462 +
1.463 +
1.464 +TInt XSgImageImpl_SurfaceManager::Construct(const TSgDrawableId& aId)
1.465 + {
1.466 + XSgImageState_SurfaceManager* state;
1.467 + TInt err = XSgImageState_SurfaceManager::New(state, iDriverImpl, aId);
1.468 + if (err != KErrNone)
1.469 + {
1.470 + return err;
1.471 + }
1.472 + state->IncRefCount();
1.473 + iState = state;
1.474 + return KErrNone;
1.475 + }
1.476 +
1.477 +
1.478 +TInt XSgImageImpl_SurfaceManager::GetInterface(TUid aInterfaceUid, TAny*& aInterfacePtr)
1.479 + {
1.480 + if (aInterfaceUid.iUid == MSgImage_Chunk::EInterfaceUid)
1.481 + {
1.482 + aInterfacePtr = static_cast<MSgImage_Chunk*>(this);
1.483 + return KErrNone;
1.484 + }
1.485 + return XSgImageImplBase::GetInterface(aInterfaceUid, aInterfacePtr);
1.486 + }
1.487 +
1.488 +
1.489 +const RChunk& XSgImageImpl_SurfaceManager::DataChunk() const
1.490 + {
1.491 + return static_cast<XSgImageState_SurfaceManager*>(iState)->DataChunk();
1.492 + }
1.493 +
1.494 +
1.495 +TInt XSgImageImpl_SurfaceManager::DataOffset() const
1.496 + {
1.497 + return static_cast<XSgImageState_SurfaceManager*>(iState)->DataOffset();
1.498 + }
1.499 +
1.500 +
1.501 +TInt XSgImageImpl_SurfaceManager::DataStride() const
1.502 + {
1.503 + return iState->DataStride();
1.504 + }
1.505 +
1.506 +
1.507 +// XSgImageState_SurfaceManager
1.508 +
1.509 +TInt XSgImageState_SurfaceManager::New(XSgImageState_SurfaceManager*& aPtr, XSgDriverImpl& aDriverImpl, const TSgImageInfo& aInfo, TBool aIsCached)
1.510 + {
1.511 + aPtr = static_cast<XSgImageState_SurfaceManager*>(aDriverImpl.Alloc(sizeof(XSgImageState_SurfaceManager)));
1.512 + if (!aPtr)
1.513 + {
1.514 + return KErrNoMemory;
1.515 + }
1.516 + new(aPtr) XSgImageState_SurfaceManager(aDriverImpl);
1.517 + TInt err = aPtr->Construct(aInfo, aIsCached);
1.518 + if (err != KErrNone)
1.519 + {
1.520 + aPtr->Delete();
1.521 + aPtr = NULL;
1.522 + }
1.523 + return err;
1.524 + }
1.525 +
1.526 +
1.527 +TInt XSgImageState_SurfaceManager::New(XSgImageState_SurfaceManager*& aPtr, XSgDriverImpl& aDriverImpl, const TSgDrawableId& aId)
1.528 + {
1.529 + aPtr = static_cast<XSgImageState_SurfaceManager*>(aDriverImpl.Alloc(sizeof(XSgImageState_SurfaceManager)));
1.530 + if (!aPtr)
1.531 + {
1.532 + return KErrNoMemory;
1.533 + }
1.534 + new(aPtr) XSgImageState_SurfaceManager(aDriverImpl);
1.535 + TInt err = aPtr->Construct(aId);
1.536 + if (err != KErrNone)
1.537 + {
1.538 + aPtr->Delete();
1.539 + aPtr = NULL;
1.540 + }
1.541 + return err;
1.542 + }
1.543 +
1.544 +
1.545 +TInt XSgImageState_SurfaceManager::Construct(const TSgImageInfo& aInfo, TBool aIsCached)
1.546 + {
1.547 + TInt maxNumberOfHints;
1.548 + TInt err;
1.549 + err=iDriverImpl.GetSurfaceManagerAttrib(RSurfaceManager::EMaxNumberOfHints,maxNumberOfHints);
1.550 + if (err!=KErrNone)
1.551 + {
1.552 + return err;
1.553 + }
1.554 +
1.555 + if (aInfo.iUserAttributeCount > maxNumberOfHints)
1.556 + {
1.557 + return KErrOverflow;
1.558 + }
1.559 + RSurfaceManager::THintPair* hints = new RSurfaceManager::THintPair[aInfo.iUserAttributeCount];
1.560 + if(!hints)
1.561 + {
1.562 + return KErrNoMemory;
1.563 + }
1.564 + RSurfaceManager::TSurfaceCreationAttributesBuf reqs;
1.565 + reqs().iSurfaceHints = hints;
1.566 + reqs().iHintCount = aInfo.iUserAttributeCount;
1.567 + reqs().iSize = aInfo.iSizeInPixels;
1.568 + reqs().iBuffers = 1;
1.569 + reqs().iPixelFormat = aInfo.iPixelFormat;
1.570 + reqs().iStride = SgAlignedDataStride(aInfo.iSizeInPixels.iWidth, aInfo.iPixelFormat);
1.571 + reqs().iOffsetToFirstBuffer = SgOffsetToFirstBuffer(sizeof(TSgImageMetaData));
1.572 + reqs().iAlignment = 4;
1.573 + reqs().iContiguous = EFalse;
1.574 + reqs().iCacheAttrib = aIsCached ? RSurfaceManager::ECached : RSurfaceManager::ENotCached;
1.575 + reqs().iOffsetBetweenBuffers = SgOffsetBetweenBuffers(reqs().iStride, aInfo.iSizeInPixels.iHeight);
1.576 + reqs().iMappable = ETrue;
1.577 + for (TInt i = 0; i < aInfo.iUserAttributeCount; ++i)
1.578 + {
1.579 + reqs().iSurfaceHints[i].iKey = aInfo.iUserAttributes[i].iUid;
1.580 + reqs().iSurfaceHints[i].iValue = aInfo.iUserAttributes[i].iValue;
1.581 + reqs().iSurfaceHints[i].iMutable = EFalse;
1.582 + }
1.583 + TSurfaceId surfaceId;
1.584 + err = iDriverImpl.CreateSurface(reqs, surfaceId);
1.585 + delete[] hints;
1.586 + hints = NULL;
1.587 + reqs().iSurfaceHints = NULL;
1.588 + if (err != KErrNone)
1.589 + {
1.590 + return err;
1.591 + }
1.592 + iSurfaceId = surfaceId;
1.593 + RSurfaceManager::TInfoBuf info;
1.594 + err = iDriverImpl.SurfaceInfo(surfaceId, info);
1.595 + if (err != KErrNone)
1.596 + {
1.597 + return err;
1.598 + }
1.599 + err=iDriverImpl.GetBufferOffset(surfaceId,0,iDataOffset);
1.600 + if (err != KErrNone)
1.601 + {
1.602 + return err;
1.603 + }
1.604 + iDataStride = info().iStride;
1.605 + RChunk chunk;
1.606 + err = iDriverImpl.MapSurface(surfaceId, chunk);
1.607 + if (err != KErrNone)
1.608 + {
1.609 + return err;
1.610 + }
1.611 + iDataChunk = chunk;
1.612 + new(chunk.Base()) TSgImageMetaData(aInfo, iDriverImpl.PixelFormatTable(), aIsCached);
1.613 + return err;
1.614 + }
1.615 +
1.616 +
1.617 +TInt XSgImageState_SurfaceManager::Construct(const TSgDrawableId& aId)
1.618 + {
1.619 + const TSgImageId_SurfaceManager& id_SurfaceManager = reinterpret_cast<const TSgImageId_SurfaceManager&>(aId);
1.620 + if (id_SurfaceManager.iBufferIndex < 0)
1.621 + {
1.622 + return KErrNotFound;
1.623 + }
1.624 + if (id_SurfaceManager.iMetaDataIndex < 0)
1.625 + {
1.626 + return KErrNotFound;
1.627 + }
1.628 + TInt err = iDriverImpl.OpenSurface(id_SurfaceManager.iSurfaceId);
1.629 + if (err != KErrNone)
1.630 + {
1.631 + return err;
1.632 + }
1.633 + iSurfaceId = id_SurfaceManager.iSurfaceId;
1.634 + RSurfaceManager::TInfoBuf info;
1.635 + err = iDriverImpl.SurfaceInfo(id_SurfaceManager.iSurfaceId, info);
1.636 + if (err != KErrNone)
1.637 + {
1.638 + return err;
1.639 + }
1.640 + iDataStride = info().iStride;
1.641 + if (id_SurfaceManager.iBufferIndex >= info().iBuffers)
1.642 + {
1.643 + return KErrNotFound;
1.644 + }
1.645 + iBufferIndex = id_SurfaceManager.iBufferIndex;
1.646 + TInt offsetToFirstBuffer;
1.647 + err=iDriverImpl.GetBufferOffset(id_SurfaceManager.iSurfaceId,0,offsetToFirstBuffer);
1.648 + if (err != KErrNone)
1.649 + {
1.650 + return err;
1.651 + }
1.652 + if ((id_SurfaceManager.iMetaDataIndex + 1) * sizeof(TSgImageMetaData) > offsetToFirstBuffer)
1.653 + {
1.654 + return KErrNotFound;
1.655 + }
1.656 + iMetaDataOffset = id_SurfaceManager.iMetaDataIndex * sizeof(TSgImageMetaData);
1.657 + RChunk chunk;
1.658 + err = iDriverImpl.MapSurface(id_SurfaceManager.iSurfaceId, chunk);
1.659 + if (err != KErrNone)
1.660 + {
1.661 + return err;
1.662 + }
1.663 + iDataChunk = chunk;
1.664 + err=iDriverImpl.GetBufferOffset(id_SurfaceManager.iSurfaceId,id_SurfaceManager.iBufferIndex,iDataOffset);
1.665 + return err;
1.666 + }
1.667 +
1.668 +
1.669 +XSgImageState_SurfaceManager::~XSgImageState_SurfaceManager()
1.670 + {
1.671 + if (!iSurfaceId.IsNull())
1.672 + {
1.673 + iDriverImpl.CloseSurface(iSurfaceId);
1.674 + iDataChunk.Close();
1.675 + }
1.676 + }
1.677 +
1.678 +
1.679 +const TSgImageMetaData& XSgImageState_SurfaceManager::MetaData() const
1.680 + {
1.681 + return *reinterpret_cast<TSgImageMetaData*>(iDataChunk.Base() + iMetaDataOffset);
1.682 + }
1.683 +
1.684 +
1.685 +TInt XSgImageState_SurfaceManager::GetUserAttributes(TSgUserAttribute* aUserAttributes, TInt aUserAttributeCount) const
1.686 + {
1.687 + for (TInt i = 0; i < aUserAttributeCount; ++i)
1.688 + {
1.689 + RSurfaceManager::THintPair hint;
1.690 + hint.iKey = aUserAttributes[i].iUid;
1.691 + TInt err = iDriverImpl.GetSurfaceHint(iSurfaceId, hint);
1.692 + if (err != KErrNone)
1.693 + {
1.694 + return err;
1.695 + }
1.696 + aUserAttributes[i].iValue = hint.iValue;
1.697 + }
1.698 + return KErrNone;
1.699 + }
1.700 +
1.701 +
1.702 +TAny* XSgImageState_SurfaceManager::DataAddress() const
1.703 + {
1.704 +#ifdef SYMBIAN_GRAPHICS_AUTOFLUSH_CACHE
1.705 + __ASSERT_DEBUG(iCpuAccess != ESgCpuAccessNone, ::Panic(ESgPanicNoCpuAccess));
1.706 +#endif
1.707 + return iDataChunk.Base() + iDataOffset;
1.708 + }
1.709 +
1.710 +
1.711 +#ifdef SYMBIAN_GRAPHICS_AUTOFLUSH_CACHE
1.712 +
1.713 +TInt XSgImageState_SurfaceManager::BeginDataAccess(TSgCpuAccess aCpuAccess, TBool aIsUserAccess)
1.714 + {
1.715 + TInt err = XSgImageStateBase::BeginDataAccess(aCpuAccess, aIsUserAccess);
1.716 + if (err != KErrNone)
1.717 + {
1.718 + return err;
1.719 + }
1.720 + if (aCpuAccess != ESgCpuAccessWriteOnly && MetaData().iIsCached && (MetaData().iPotentialUsage & KSgUsageAllTargets))
1.721 + {
1.722 + // Cache::SyncMemoryAfterDmaRead() cannot fail so the following should not fail if the arguments are correct
1.723 + err = iDriverImpl.SynchronizeCache(iSurfaceId, iBufferIndex, RSurfaceManager::ESyncAfterNonCPUWrite);
1.724 + __ASSERT_DEBUG(err == KErrNone, Panic(ESgPanicResourceAdapterGeneral));
1.725 + }
1.726 + return KErrNone;
1.727 + }
1.728 +
1.729 +
1.730 +TInt XSgImageState_SurfaceManager::EndDataAccess(TBool aIsUserAccess)
1.731 + {
1.732 + TSgCpuAccess prevCpuAccess = iCpuAccess;
1.733 + TInt err = XSgImageStateBase::EndDataAccess(aIsUserAccess);
1.734 + if (err != KErrNone)
1.735 + {
1.736 + return err;
1.737 + }
1.738 + if (prevCpuAccess != ESgCpuAccessReadOnly && MetaData().iIsCached)
1.739 + {
1.740 + // Cache::SyncMemoryBeforeDmaWrite() cannot fail so the following should not fail if the arguments are correct
1.741 + err = iDriverImpl.SynchronizeCache(iSurfaceId, iBufferIndex, RSurfaceManager::ESyncBeforeNonCPURead);
1.742 + __ASSERT_DEBUG(err == KErrNone, Panic(ESgPanicResourceAdapterGeneral));
1.743 + }
1.744 + return KErrNone;
1.745 + }
1.746 +
1.747 +#endif