sl@0: // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include "sgimageimpl.h" sl@0: #include "sgresourceinternal.h" sl@0: sl@0: sl@0: // TSgImageMetaData sl@0: sl@0: TSgImageMetaData::TSgImageMetaData(const TSgImageInfo& aInfo, TArray aPixelFormatTable, TBool aIsCached) sl@0: : iCreatorProcess(RProcess().Id()), sl@0: iSizeInPixels(aInfo.iSizeInPixels), sl@0: iPixelFormat(aInfo.iPixelFormat), sl@0: iRequestedUsage(aInfo.iUsage), sl@0: iPotentialUsage(0), sl@0: iShareable(aInfo.iShareable), sl@0: iCpuAccess(aInfo.iCpuAccess), sl@0: iScreenId(aInfo.iScreenId), sl@0: iIsCached(aIsCached) sl@0: { sl@0: TUint32 usageMask = (aInfo.iUsage & KSgUsageAllSources ? KSgUsageAllSources : 0) sl@0: | (aInfo.iUsage & KSgUsageAllTargets ? KSgUsageAllTargets : 0); sl@0: TInt n = aPixelFormatTable.Count(); sl@0: for (TInt i = 0; i < n; ++i) sl@0: { sl@0: const TSgPixelFormatTableEntry& entry = aPixelFormatTable[i]; sl@0: if (entry.IsMatchIgnoringUsage(aInfo)) sl@0: { sl@0: iPotentialUsage |= entry.iUsage & usageMask; sl@0: } sl@0: } sl@0: } sl@0: sl@0: sl@0: void TSgImageMetaData::GetInfo(TSgImageInfo& aInfo, TBool aGetPotentialUsage) const sl@0: { sl@0: aInfo.iSizeInPixels = iSizeInPixels; sl@0: aInfo.iPixelFormat = iPixelFormat; sl@0: aInfo.iUsage = aGetPotentialUsage ? iPotentialUsage : iRequestedUsage; sl@0: aInfo.iShareable = iShareable; sl@0: aInfo.iCpuAccess = iCpuAccess; sl@0: aInfo.iScreenId = iScreenId; sl@0: } sl@0: sl@0: sl@0: // XSgImageImplBase sl@0: sl@0: XSgImageImplBase::XSgImageImplBase(const XSgImageImplBase& aImage, TUint32 aFlags) sl@0: : XSgBase(aImage.iDriverImpl) sl@0: { sl@0: __ASSERT_DEBUG(iDriverImpl.IsMutexHeld(), Panic(ESgPanicMutexNotHeld)); sl@0: iId = aImage.iId; sl@0: iId.iId[KSgImageIdFlagsIndex] = aFlags; sl@0: aImage.iState->IncRefCount(); sl@0: iState = aImage.iState; sl@0: } sl@0: sl@0: sl@0: XSgImageImplBase::~XSgImageImplBase() sl@0: { sl@0: __ASSERT_DEBUG(iDriverImpl.IsMutexHeld(), Panic(ESgPanicMutexNotHeld)); sl@0: if (iState && iState->DecRefCount() == 0) sl@0: { sl@0: Unmap(); sl@0: iState->Delete(); sl@0: } sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImplBase::Compare(const TSgDrawableId* aId, const XSgImageImplBase& aImage) sl@0: { sl@0: return Mem::Compare(reinterpret_cast(aId), sizeof(TSgDrawableId), sl@0: reinterpret_cast(&aImage.Id()), sizeof(TSgDrawableId)); sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImplBase::Compare(const XSgImageImplBase& aImage1, const XSgImageImplBase& aImage2) sl@0: { sl@0: return Compare(&aImage1.Id(), aImage2); sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImplBase::CompareIgnoringFlags(const TSgDrawableId* aId, const XSgImageImplBase& aImage) sl@0: { sl@0: return Mem::Compare(reinterpret_cast(aId), sizeof(TSgDrawableId) - sizeof(TUint32), sl@0: reinterpret_cast(&aImage.Id()), sizeof(TSgDrawableId) - sizeof(TUint32)); sl@0: } sl@0: sl@0: sl@0: void XSgImageImplBase::Close() sl@0: { sl@0: XSgDriverImpl& driverImpl = iDriverImpl; sl@0: driverImpl.Wait(); sl@0: if (DecRefCount() == 0) sl@0: { sl@0: driverImpl.DeleteImage(this); sl@0: } sl@0: driverImpl.Signal(); sl@0: } sl@0: sl@0: sl@0: const TSgDrawableId& XSgImageImplBase::Id() const sl@0: { sl@0: return iId; sl@0: } sl@0: sl@0: sl@0: TUid XSgImageImplBase::DrawableType() const sl@0: { sl@0: return KSgImageTypeUid; sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImplBase::GetInterface(TUid aInterfaceUid, TAny*& aInterfacePtr) sl@0: { sl@0: if (aInterfaceUid.iUid == MSgImage_Sw::EInterfaceUid) sl@0: { sl@0: aInterfacePtr = static_cast(this); sl@0: return KErrNone; sl@0: } sl@0: return KErrExtensionNotSupported; sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImplBase::GetInfo(TSgImageInfo& aInfo) const sl@0: { sl@0: iState->MetaData().GetInfo(aInfo, iId.iId[KSgImageIdFlagsIndex] & ESgDoNotRestrictUsage); sl@0: return iState->GetUserAttributes(aInfo.iUserAttributes, aInfo.iUserAttributeCount); sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImplBase::MapReadOnly(const TAny*& aDataAddress, TInt& aDataStride) sl@0: { sl@0: TInt err = iState->BeginDataAccess(ESgCpuAccessReadOnly, ETrue); sl@0: if (err != KErrNone) sl@0: { sl@0: return err; sl@0: } sl@0: aDataAddress = iState->DataAddress(); sl@0: aDataStride = iState->DataStride(); sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImplBase::MapWriteOnly(TAny*& aDataAddress, TInt& aDataStride) sl@0: { sl@0: TInt err = iState->BeginDataAccess(ESgCpuAccessWriteOnly, ETrue); sl@0: if (err != KErrNone) sl@0: { sl@0: return err; sl@0: } sl@0: aDataAddress = iState->DataAddress(); sl@0: aDataStride = iState->DataStride(); sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImplBase::MapReadWrite(TAny*& aDataAddress, TInt& aDataStride) sl@0: { sl@0: TInt err = iState->BeginDataAccess(ESgCpuAccessReadWrite, ETrue); sl@0: if (err != KErrNone) sl@0: { sl@0: return err; sl@0: } sl@0: aDataAddress = iState->DataAddress(); sl@0: aDataStride = iState->DataStride(); sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImplBase::Unmap() sl@0: { sl@0: return iState->EndDataAccess(ETrue); sl@0: } sl@0: sl@0: sl@0: TAny* XSgImageImplBase::DataAddress() const sl@0: { sl@0: return iState->DataAddress(); sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImplBase::DataStride() const sl@0: { sl@0: return iState->DataStride(); sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImplBase::BeginDataAccess(TSgCpuAccess aCpuAccess) sl@0: { sl@0: return iState->BeginDataAccess(aCpuAccess, EFalse); sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImplBase::EndDataAccess() sl@0: { sl@0: return iState->EndDataAccess(EFalse); sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImplBase::SetData(const TAny* aDataAddress, TInt aDataStride) sl@0: { sl@0: if (aDataAddress) sl@0: { sl@0: TInt err = BeginDataAccess(ESgCpuAccessWriteOnly); sl@0: if (err != KErrNone) sl@0: { sl@0: return err; sl@0: } sl@0: const TSgImageMetaData& metaData = iState->MetaData(); sl@0: const TAny* src = aDataAddress; sl@0: TAny* trg = iState->DataAddress(); sl@0: TInt dataStride = iState->DataStride(); sl@0: TInt minDataStride = SgMinDataStride(metaData.iSizeInPixels.iWidth, metaData.iPixelFormat); sl@0: __ASSERT_DEBUG(minDataStride > 0, Panic(ESgPanicResourceAdapterGeneral)); sl@0: for (TInt y = 0; y < metaData.iSizeInPixels.iHeight; ++y) sl@0: { sl@0: Mem::Copy(trg, src, minDataStride); sl@0: src = PtrAdd(src, aDataStride); sl@0: trg = PtrAdd(trg, dataStride); sl@0: } sl@0: EndDataAccess(); sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TInt XSgImageStateBase::BeginDataAccess(TSgCpuAccess aCpuAccess, TBool aIsUserAccess) sl@0: { sl@0: if (aCpuAccess == ESgCpuAccessNone) sl@0: { sl@0: return KErrArgument; sl@0: } sl@0: const TSgImageMetaData& metaData = MetaData(); sl@0: if (aIsUserAccess && (~metaData.iCpuAccess & aCpuAccess)) sl@0: { sl@0: return KErrAccessDenied; sl@0: } sl@0: if (aIsUserAccess && metaData.iCreatorProcess != RProcess().Id()) sl@0: { sl@0: return KErrPermissionDenied; sl@0: } sl@0: iDriverImpl.Wait(); sl@0: if (iCpuAccess != ESgCpuAccessNone) sl@0: { sl@0: iDriverImpl.Signal(); sl@0: return KErrInUse; sl@0: } sl@0: iCpuAccess = aCpuAccess; sl@0: iIsUserAccess = aIsUserAccess; sl@0: iDriverImpl.Signal(); sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TInt XSgImageStateBase::EndDataAccess(TBool aIsUserAccess) sl@0: { sl@0: iDriverImpl.Wait(); sl@0: if (iCpuAccess == ESgCpuAccessNone || iIsUserAccess != aIsUserAccess) sl@0: { sl@0: iDriverImpl.Signal(); sl@0: return KErrGeneral; sl@0: } sl@0: iCpuAccess = ESgCpuAccessNone; sl@0: iIsUserAccess = EFalse; sl@0: iDriverImpl.Signal(); sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: #ifndef SYMBIAN_GRAPHICS_USE_GPU sl@0: sl@0: // XSgImageImpl_SwLocal sl@0: sl@0: TInt XSgImageImpl_SwLocal::New(XSgImageImpl_SwLocal*& aPtr, XSgDriverImpl& aDriverImpl, const TSgDrawableId& aId, sl@0: const TSgImageInfo& aInfo, const TAny* aDataAddress, TInt aDataStride) sl@0: { sl@0: aPtr = static_cast(aDriverImpl.Alloc(sizeof(XSgImageImpl_SwLocal))); sl@0: if (!aPtr) sl@0: { sl@0: return KErrNoMemory; sl@0: } sl@0: new(aPtr) XSgImageImpl_SwLocal(aDriverImpl, aId); sl@0: TInt err = aPtr->Construct(aInfo, aDataAddress, aDataStride); sl@0: if (err != KErrNone) sl@0: { sl@0: aPtr->Delete(); sl@0: aPtr = NULL; sl@0: } sl@0: return err; sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImpl_SwLocal::New(XSgImageImpl_SwLocal*& aPtr, const XSgImageImpl_SwLocal& aImage, TUint32 aFlags) sl@0: { sl@0: aPtr = static_cast(aImage.iDriverImpl.Alloc(sizeof(XSgImageImpl_SwLocal))); sl@0: if (!aPtr) sl@0: { sl@0: return KErrNoMemory; sl@0: } sl@0: new(aPtr) XSgImageImpl_SwLocal(aImage, aFlags); sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImpl_SwLocal::Construct(const TSgImageInfo& aInfo, const TAny* aDataAddress, TInt aDataStride) sl@0: { sl@0: XSgImageState_SwLocal* state; sl@0: TInt err = XSgImageState_SwLocal::New(state, iDriverImpl, aInfo); sl@0: if (err != KErrNone) sl@0: { sl@0: return err; sl@0: } sl@0: state->IncRefCount(); sl@0: iState = state; sl@0: return SetData(aDataAddress, aDataStride); sl@0: } sl@0: sl@0: sl@0: // XSgImageState_SwLocal sl@0: sl@0: TInt XSgImageState_SwLocal::New(XSgImageState_SwLocal*& aPtr, XSgDriverImpl& aDriverImpl, const TSgImageInfo& aInfo) sl@0: { sl@0: TInt dataStride = Align4(SgMinDataStride(aInfo.iSizeInPixels.iWidth, aInfo.iPixelFormat)); sl@0: TInt size = _FOFF(XSgImageState_SwLocal, iUserAttributes) + aInfo.iUserAttributeCount * sizeof(TSgUserAttribute) + dataStride * aInfo.iSizeInPixels.iHeight; sl@0: aPtr = static_cast(aDriverImpl.Alloc(size)); sl@0: if (!aPtr) sl@0: { sl@0: return KErrNoMemory; sl@0: } sl@0: new(aPtr) XSgImageState_SwLocal(aDriverImpl, aInfo, dataStride); sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: XSgImageState_SwLocal::XSgImageState_SwLocal(XSgDriverImpl& aDriverImpl, const TSgImageInfo& aInfo, TInt aDataStride) sl@0: : XSgImageStateBase(aDriverImpl, aDataStride), iMetaData(aInfo, aDriverImpl.PixelFormatTable()) sl@0: { sl@0: iUserAttributeCount = aInfo.iUserAttributeCount; sl@0: Mem::Copy(iUserAttributes, aInfo.iUserAttributes, aInfo.iUserAttributeCount * sizeof(TSgUserAttribute)); sl@0: } sl@0: sl@0: sl@0: const TSgImageMetaData& XSgImageState_SwLocal::MetaData() const sl@0: { sl@0: return iMetaData; sl@0: } sl@0: sl@0: sl@0: TInt XSgImageState_SwLocal::GetUserAttributes(TSgUserAttribute* aUserAttributes, TInt aUserAttributeCount) const sl@0: { sl@0: for (TInt i = 0; i < aUserAttributeCount; ++i) sl@0: { sl@0: TBool found = EFalse; sl@0: for (TInt j = 0; j < iUserAttributeCount; ++j) sl@0: { sl@0: if (aUserAttributes[i].iUid == iUserAttributes[j].iUid) sl@0: { sl@0: aUserAttributes[i].iValue = iUserAttributes[j].iValue; sl@0: found = ETrue; sl@0: break; sl@0: } sl@0: } sl@0: if (!found) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TAny* XSgImageState_SwLocal::DataAddress() const sl@0: { sl@0: //__ASSERT_DEBUG(iCpuAccess != ESgCpuAccessNone, ::Panic(ESgPanicNoCpuAccess)); sl@0: return (TAny*)PtrAdd(iUserAttributes, iUserAttributeCount * sizeof(TSgUserAttribute)); sl@0: } sl@0: sl@0: #endif sl@0: sl@0: sl@0: // XSgImageImpl_SurfaceManager sl@0: sl@0: sl@0: TInt XSgImageImpl_SurfaceManager::New(XSgImageImpl_SurfaceManager*& aPtr, XSgDriverImpl& aDriverImpl, sl@0: const TSgImageInfo& aInfo, TBool aIsCached, const TAny* aDataAddress, TInt aDataStride) sl@0: { sl@0: aPtr = static_cast(aDriverImpl.Alloc(sizeof(XSgImageImpl_SurfaceManager))); sl@0: if (!aPtr) sl@0: { sl@0: return KErrNoMemory; sl@0: } sl@0: new(aPtr) XSgImageImpl_SurfaceManager(aDriverImpl); sl@0: TInt err = aPtr->Construct(aInfo, aIsCached, aDataAddress, aDataStride); sl@0: if (err != KErrNone) sl@0: { sl@0: aPtr->Delete(); sl@0: aPtr = NULL; sl@0: } sl@0: return err; sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImpl_SurfaceManager::New(XSgImageImpl_SurfaceManager*& aPtr, XSgDriverImpl& aDriverImpl, const TSgDrawableId& aId) sl@0: { sl@0: aPtr = static_cast(aDriverImpl.Alloc(sizeof(XSgImageImpl_SurfaceManager))); sl@0: if (!aPtr) sl@0: { sl@0: return KErrNoMemory; sl@0: } sl@0: new(aPtr) XSgImageImpl_SurfaceManager(aDriverImpl, aId); sl@0: TInt err = aPtr->Construct(aId); sl@0: if (err != KErrNone) sl@0: { sl@0: aPtr->Delete(); sl@0: aPtr = NULL; sl@0: } sl@0: return err; sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImpl_SurfaceManager::New(XSgImageImpl_SurfaceManager*& aPtr, const XSgImageImpl_SurfaceManager& aImage, TUint32 aFlags) sl@0: { sl@0: aPtr = static_cast(aImage.iDriverImpl.Alloc(sizeof(XSgImageImpl_SurfaceManager))); sl@0: if (!aPtr) sl@0: { sl@0: return KErrNoMemory; sl@0: } sl@0: new(aPtr) XSgImageImpl_SurfaceManager(aImage, aFlags); sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImpl_SurfaceManager::Construct(const TSgImageInfo& aInfo, TBool aIsCached, const TAny* aDataAddress, TInt aDataStride) sl@0: { sl@0: XSgImageState_SurfaceManager* state; sl@0: TInt err = XSgImageState_SurfaceManager::New(state, iDriverImpl, aInfo, aIsCached); sl@0: if (err != KErrNone) sl@0: { sl@0: return err; sl@0: } sl@0: Mem::Copy(&iId, &state->SurfaceId(), sizeof(TSurfaceId)); sl@0: state->IncRefCount(); sl@0: iState = state; sl@0: return SetData(aDataAddress, aDataStride); sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImpl_SurfaceManager::Construct(const TSgDrawableId& aId) sl@0: { sl@0: XSgImageState_SurfaceManager* state; sl@0: TInt err = XSgImageState_SurfaceManager::New(state, iDriverImpl, aId); sl@0: if (err != KErrNone) sl@0: { sl@0: return err; sl@0: } sl@0: state->IncRefCount(); sl@0: iState = state; sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImpl_SurfaceManager::GetInterface(TUid aInterfaceUid, TAny*& aInterfacePtr) sl@0: { sl@0: if (aInterfaceUid.iUid == MSgImage_Chunk::EInterfaceUid) sl@0: { sl@0: aInterfacePtr = static_cast(this); sl@0: return KErrNone; sl@0: } sl@0: return XSgImageImplBase::GetInterface(aInterfaceUid, aInterfacePtr); sl@0: } sl@0: sl@0: sl@0: const RChunk& XSgImageImpl_SurfaceManager::DataChunk() const sl@0: { sl@0: return static_cast(iState)->DataChunk(); sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImpl_SurfaceManager::DataOffset() const sl@0: { sl@0: return static_cast(iState)->DataOffset(); sl@0: } sl@0: sl@0: sl@0: TInt XSgImageImpl_SurfaceManager::DataStride() const sl@0: { sl@0: return iState->DataStride(); sl@0: } sl@0: sl@0: sl@0: // XSgImageState_SurfaceManager sl@0: sl@0: TInt XSgImageState_SurfaceManager::New(XSgImageState_SurfaceManager*& aPtr, XSgDriverImpl& aDriverImpl, const TSgImageInfo& aInfo, TBool aIsCached) sl@0: { sl@0: aPtr = static_cast(aDriverImpl.Alloc(sizeof(XSgImageState_SurfaceManager))); sl@0: if (!aPtr) sl@0: { sl@0: return KErrNoMemory; sl@0: } sl@0: new(aPtr) XSgImageState_SurfaceManager(aDriverImpl); sl@0: TInt err = aPtr->Construct(aInfo, aIsCached); sl@0: if (err != KErrNone) sl@0: { sl@0: aPtr->Delete(); sl@0: aPtr = NULL; sl@0: } sl@0: return err; sl@0: } sl@0: sl@0: sl@0: TInt XSgImageState_SurfaceManager::New(XSgImageState_SurfaceManager*& aPtr, XSgDriverImpl& aDriverImpl, const TSgDrawableId& aId) sl@0: { sl@0: aPtr = static_cast(aDriverImpl.Alloc(sizeof(XSgImageState_SurfaceManager))); sl@0: if (!aPtr) sl@0: { sl@0: return KErrNoMemory; sl@0: } sl@0: new(aPtr) XSgImageState_SurfaceManager(aDriverImpl); sl@0: TInt err = aPtr->Construct(aId); sl@0: if (err != KErrNone) sl@0: { sl@0: aPtr->Delete(); sl@0: aPtr = NULL; sl@0: } sl@0: return err; sl@0: } sl@0: sl@0: sl@0: TInt XSgImageState_SurfaceManager::Construct(const TSgImageInfo& aInfo, TBool aIsCached) sl@0: { sl@0: TInt maxNumberOfHints; sl@0: TInt err; sl@0: err=iDriverImpl.GetSurfaceManagerAttrib(RSurfaceManager::EMaxNumberOfHints,maxNumberOfHints); sl@0: if (err!=KErrNone) sl@0: { sl@0: return err; sl@0: } sl@0: sl@0: if (aInfo.iUserAttributeCount > maxNumberOfHints) sl@0: { sl@0: return KErrOverflow; sl@0: } sl@0: RSurfaceManager::THintPair* hints = new RSurfaceManager::THintPair[aInfo.iUserAttributeCount]; sl@0: if(!hints) sl@0: { sl@0: return KErrNoMemory; sl@0: } sl@0: RSurfaceManager::TSurfaceCreationAttributesBuf reqs; sl@0: reqs().iSurfaceHints = hints; sl@0: reqs().iHintCount = aInfo.iUserAttributeCount; sl@0: reqs().iSize = aInfo.iSizeInPixels; sl@0: reqs().iBuffers = 1; sl@0: reqs().iPixelFormat = aInfo.iPixelFormat; sl@0: reqs().iStride = SgAlignedDataStride(aInfo.iSizeInPixels.iWidth, aInfo.iPixelFormat); sl@0: reqs().iOffsetToFirstBuffer = SgOffsetToFirstBuffer(sizeof(TSgImageMetaData)); sl@0: reqs().iAlignment = 4; sl@0: reqs().iContiguous = EFalse; sl@0: reqs().iCacheAttrib = aIsCached ? RSurfaceManager::ECached : RSurfaceManager::ENotCached; sl@0: reqs().iOffsetBetweenBuffers = SgOffsetBetweenBuffers(reqs().iStride, aInfo.iSizeInPixels.iHeight); sl@0: reqs().iMappable = ETrue; sl@0: for (TInt i = 0; i < aInfo.iUserAttributeCount; ++i) sl@0: { sl@0: reqs().iSurfaceHints[i].iKey = aInfo.iUserAttributes[i].iUid; sl@0: reqs().iSurfaceHints[i].iValue = aInfo.iUserAttributes[i].iValue; sl@0: reqs().iSurfaceHints[i].iMutable = EFalse; sl@0: } sl@0: TSurfaceId surfaceId; sl@0: err = iDriverImpl.CreateSurface(reqs, surfaceId); sl@0: delete[] hints; sl@0: hints = NULL; sl@0: reqs().iSurfaceHints = NULL; sl@0: if (err != KErrNone) sl@0: { sl@0: return err; sl@0: } sl@0: iSurfaceId = surfaceId; sl@0: RSurfaceManager::TInfoBuf info; sl@0: err = iDriverImpl.SurfaceInfo(surfaceId, info); sl@0: if (err != KErrNone) sl@0: { sl@0: return err; sl@0: } sl@0: err=iDriverImpl.GetBufferOffset(surfaceId,0,iDataOffset); sl@0: if (err != KErrNone) sl@0: { sl@0: return err; sl@0: } sl@0: iDataStride = info().iStride; sl@0: RChunk chunk; sl@0: err = iDriverImpl.MapSurface(surfaceId, chunk); sl@0: if (err != KErrNone) sl@0: { sl@0: return err; sl@0: } sl@0: iDataChunk = chunk; sl@0: new(chunk.Base()) TSgImageMetaData(aInfo, iDriverImpl.PixelFormatTable(), aIsCached); sl@0: return err; sl@0: } sl@0: sl@0: sl@0: TInt XSgImageState_SurfaceManager::Construct(const TSgDrawableId& aId) sl@0: { sl@0: const TSgImageId_SurfaceManager& id_SurfaceManager = reinterpret_cast(aId); sl@0: if (id_SurfaceManager.iBufferIndex < 0) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: if (id_SurfaceManager.iMetaDataIndex < 0) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: TInt err = iDriverImpl.OpenSurface(id_SurfaceManager.iSurfaceId); sl@0: if (err != KErrNone) sl@0: { sl@0: return err; sl@0: } sl@0: iSurfaceId = id_SurfaceManager.iSurfaceId; sl@0: RSurfaceManager::TInfoBuf info; sl@0: err = iDriverImpl.SurfaceInfo(id_SurfaceManager.iSurfaceId, info); sl@0: if (err != KErrNone) sl@0: { sl@0: return err; sl@0: } sl@0: iDataStride = info().iStride; sl@0: if (id_SurfaceManager.iBufferIndex >= info().iBuffers) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: iBufferIndex = id_SurfaceManager.iBufferIndex; sl@0: TInt offsetToFirstBuffer; sl@0: err=iDriverImpl.GetBufferOffset(id_SurfaceManager.iSurfaceId,0,offsetToFirstBuffer); sl@0: if (err != KErrNone) sl@0: { sl@0: return err; sl@0: } sl@0: if ((id_SurfaceManager.iMetaDataIndex + 1) * sizeof(TSgImageMetaData) > offsetToFirstBuffer) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: iMetaDataOffset = id_SurfaceManager.iMetaDataIndex * sizeof(TSgImageMetaData); sl@0: RChunk chunk; sl@0: err = iDriverImpl.MapSurface(id_SurfaceManager.iSurfaceId, chunk); sl@0: if (err != KErrNone) sl@0: { sl@0: return err; sl@0: } sl@0: iDataChunk = chunk; sl@0: err=iDriverImpl.GetBufferOffset(id_SurfaceManager.iSurfaceId,id_SurfaceManager.iBufferIndex,iDataOffset); sl@0: return err; sl@0: } sl@0: sl@0: sl@0: XSgImageState_SurfaceManager::~XSgImageState_SurfaceManager() sl@0: { sl@0: if (!iSurfaceId.IsNull()) sl@0: { sl@0: iDriverImpl.CloseSurface(iSurfaceId); sl@0: iDataChunk.Close(); sl@0: } sl@0: } sl@0: sl@0: sl@0: const TSgImageMetaData& XSgImageState_SurfaceManager::MetaData() const sl@0: { sl@0: return *reinterpret_cast(iDataChunk.Base() + iMetaDataOffset); sl@0: } sl@0: sl@0: sl@0: TInt XSgImageState_SurfaceManager::GetUserAttributes(TSgUserAttribute* aUserAttributes, TInt aUserAttributeCount) const sl@0: { sl@0: for (TInt i = 0; i < aUserAttributeCount; ++i) sl@0: { sl@0: RSurfaceManager::THintPair hint; sl@0: hint.iKey = aUserAttributes[i].iUid; sl@0: TInt err = iDriverImpl.GetSurfaceHint(iSurfaceId, hint); sl@0: if (err != KErrNone) sl@0: { sl@0: return err; sl@0: } sl@0: aUserAttributes[i].iValue = hint.iValue; sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TAny* XSgImageState_SurfaceManager::DataAddress() const sl@0: { sl@0: #ifdef SYMBIAN_GRAPHICS_AUTOFLUSH_CACHE sl@0: __ASSERT_DEBUG(iCpuAccess != ESgCpuAccessNone, ::Panic(ESgPanicNoCpuAccess)); sl@0: #endif sl@0: return iDataChunk.Base() + iDataOffset; sl@0: } sl@0: sl@0: sl@0: #ifdef SYMBIAN_GRAPHICS_AUTOFLUSH_CACHE sl@0: sl@0: TInt XSgImageState_SurfaceManager::BeginDataAccess(TSgCpuAccess aCpuAccess, TBool aIsUserAccess) sl@0: { sl@0: TInt err = XSgImageStateBase::BeginDataAccess(aCpuAccess, aIsUserAccess); sl@0: if (err != KErrNone) sl@0: { sl@0: return err; sl@0: } sl@0: if (aCpuAccess != ESgCpuAccessWriteOnly && MetaData().iIsCached && (MetaData().iPotentialUsage & KSgUsageAllTargets)) sl@0: { sl@0: // Cache::SyncMemoryAfterDmaRead() cannot fail so the following should not fail if the arguments are correct sl@0: err = iDriverImpl.SynchronizeCache(iSurfaceId, iBufferIndex, RSurfaceManager::ESyncAfterNonCPUWrite); sl@0: __ASSERT_DEBUG(err == KErrNone, Panic(ESgPanicResourceAdapterGeneral)); sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TInt XSgImageState_SurfaceManager::EndDataAccess(TBool aIsUserAccess) sl@0: { sl@0: TSgCpuAccess prevCpuAccess = iCpuAccess; sl@0: TInt err = XSgImageStateBase::EndDataAccess(aIsUserAccess); sl@0: if (err != KErrNone) sl@0: { sl@0: return err; sl@0: } sl@0: if (prevCpuAccess != ESgCpuAccessReadOnly && MetaData().iIsCached) sl@0: { sl@0: // Cache::SyncMemoryBeforeDmaWrite() cannot fail so the following should not fail if the arguments are correct sl@0: err = iDriverImpl.SynchronizeCache(iSurfaceId, iBufferIndex, RSurfaceManager::ESyncBeforeNonCPURead); sl@0: __ASSERT_DEBUG(err == KErrNone, Panic(ESgPanicResourceAdapterGeneral)); sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: #endif