sl@0: // Copyright (c) 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: // Graphics Resource - kernel extension implementation sl@0: // sl@0: sl@0: #include sl@0: #include "sgextensionimpl.h" sl@0: sl@0: DSgExtensionImpl* TheSgExtensionImpl = NULL; sl@0: sl@0: DECLARE_STANDARD_EXTENSION() sl@0: { sl@0: __KTRACE_OPT(KBOOT, Kern::Printf("Starting Graphics Extension")); sl@0: TInt err; sl@0: TheSgExtensionImpl = new DSgExtensionImpl; sl@0: if (TheSgExtensionImpl) sl@0: { sl@0: err = TheSgExtensionImpl->Construct(); sl@0: if (err != KErrNone) sl@0: { sl@0: delete TheSgExtensionImpl; sl@0: TheSgExtensionImpl = NULL; sl@0: } sl@0: } sl@0: else sl@0: { sl@0: err = KErrNoMemory; sl@0: } sl@0: if (err != KErrNone) sl@0: { sl@0: __KTRACE_OPT(KBOOT, Kern::Printf("Error: Graphics Extension failed to start")); sl@0: } sl@0: return err; sl@0: } sl@0: sl@0: EXPORT_C TVersion SgExtension::Version() sl@0: { sl@0: return TVersion(1, 1, 1); sl@0: } sl@0: sl@0: EXPORT_C TInt SgExtension::CreateResource(TUint32 aAttribs, const TDesC8& aMetaData, TInt aDataSize, DSgResource*& aResource) sl@0: { sl@0: if (!TheSgExtensionImpl) sl@0: { sl@0: __KTRACE_OPT(KPANIC, Kern::Printf("Error: Graphics Extension not ready")); sl@0: return KErrNotReady; sl@0: } sl@0: return TheSgExtensionImpl->CreateResource(aAttribs, aMetaData, aDataSize, aResource); sl@0: } sl@0: sl@0: EXPORT_C TInt SgExtension::FindAndOpenResource(TUint64 aId, DSgResource*& aResource) sl@0: { sl@0: if (!TheSgExtensionImpl) sl@0: { sl@0: __KTRACE_OPT(KPANIC, Kern::Printf("Error: Graphics Extension not ready")); sl@0: return KErrNotReady; sl@0: } sl@0: return TheSgExtensionImpl->FindAndOpenResource(aId, aResource); sl@0: } sl@0: sl@0: EXPORT_C TInt SgExtension::GlobalResourceCount() sl@0: { sl@0: if (!TheSgExtensionImpl) sl@0: { sl@0: __KTRACE_OPT(KPANIC, Kern::Printf("Error: Graphics Extension not ready")); sl@0: return KErrNotReady; sl@0: } sl@0: return TheSgExtensionImpl->GlobalResourceCount(); sl@0: } sl@0: sl@0: EXPORT_C TInt SgExtension::GlobalGraphicsMemoryUsed() sl@0: { sl@0: if (!TheSgExtensionImpl) sl@0: { sl@0: __KTRACE_OPT(KPANIC, Kern::Printf("Error: Graphics Extension not ready")); sl@0: return KErrNotReady; sl@0: } sl@0: return TheSgExtensionImpl->GlobalGraphicsMemoryUsed(); sl@0: } sl@0: sl@0: TInt DSgExtensionImpl::Construct() sl@0: { sl@0: return Kern::MutexCreate(iMutex, KNullDesC8, KMutexOrdGeneral0); sl@0: } sl@0: sl@0: TInt DSgExtensionImpl::CreateResource(TUint32 aAttribs, const TDesC8& aMetaData, TInt aDataSize, DSgResource*& aResource) sl@0: { sl@0: if (aDataSize <= 0) sl@0: { sl@0: return KErrArgument; sl@0: } sl@0: DSgResourceImpl* resource = static_cast(Kern::Alloc(sizeof(DSgResourceImpl) + aMetaData.Size())); sl@0: if (!resource) sl@0: { sl@0: return KErrNoMemory; sl@0: } sl@0: TChunkCreateInfo info; sl@0: info.iType = TChunkCreateInfo::ESharedKernelMultiple; sl@0: info.iMaxSize = aDataSize; sl@0: info.iOwnsMemory = ETrue; sl@0: #ifdef __WINS__ sl@0: info.iMapAttr = aAttribs, 0; // suppress compiler warning: cache attribute does not apply to WINS sl@0: #else sl@0: info.iMapAttr = aAttribs & ESgResourceAttrCpuCached ? EMapAttrCachedMax : EMapAttrL1Uncached; sl@0: #endif sl@0: DChunk* chunk; sl@0: TLinAddr kernAddr; sl@0: TUint32 mapAttr; sl@0: TInt err = Kern::ChunkCreate(info, chunk, kernAddr, mapAttr); sl@0: if (err != KErrNone) sl@0: { sl@0: Kern::Free(resource); sl@0: return err; sl@0: } sl@0: err = Kern::ChunkCommit(chunk, 0, aDataSize); sl@0: if (err != KErrNone) sl@0: { sl@0: Kern::ChunkClose(chunk); sl@0: Kern::Free(resource); sl@0: return err; sl@0: } sl@0: Kern::MutexWait(*iMutex); sl@0: new(resource) DSgResourceImpl(*this, ++iLastResourceId, aAttribs, aMetaData, chunk, aDataSize); sl@0: err = iResources.InsertInOrder(resource, DSgResource::Compare); sl@0: Kern::MutexSignal(*iMutex); sl@0: if (err != KErrNone) sl@0: { sl@0: resource->Close(); sl@0: } sl@0: aResource = (err == KErrNone ? resource : NULL); sl@0: return err; sl@0: } sl@0: sl@0: TInt DSgExtensionImpl::FindAndOpenResource(TUint64 aId, DSgResource*& aResource) sl@0: { sl@0: if (aId == 0) sl@0: { sl@0: return KErrArgument; sl@0: } sl@0: Kern::MutexWait(*iMutex); sl@0: TInt i = iResources.FindInOrder(aId, DSgResource::Compare); sl@0: if (i < 0) sl@0: { sl@0: Kern::MutexSignal(*iMutex); sl@0: return KErrNotFound; sl@0: } sl@0: DSgResource* resource = iResources[i]; sl@0: TInt err = resource->Open(); sl@0: Kern::MutexSignal(*iMutex); sl@0: aResource = (err == KErrNone ? resource : NULL); sl@0: return err; sl@0: } sl@0: sl@0: void DSgExtensionImpl::DeleteResource(DSgResource* aResource) sl@0: { sl@0: Kern::MutexWait(*iMutex); sl@0: TInt i = iResources.FindInOrder(aResource, DSgResource::Compare); sl@0: if (i >= 0) sl@0: { sl@0: iResources.Remove(i); sl@0: } sl@0: else sl@0: { sl@0: __KTRACE_OPT(KPANIC, Kern::Printf("Error: internal state of Graphics Extension is inconsistent")); sl@0: } sl@0: Kern::MutexSignal(*iMutex); sl@0: delete aResource; sl@0: } sl@0: sl@0: TInt DSgExtensionImpl::GlobalResourceCount() const sl@0: { sl@0: return iResources.Count(); sl@0: } sl@0: sl@0: TInt DSgExtensionImpl::GlobalGraphicsMemoryUsed() const sl@0: { sl@0: TInt ret = 0; sl@0: Kern::MutexWait(*iMutex); sl@0: TInt n = iResources.Count(); sl@0: for (TInt i = 0; i < n; ++i) sl@0: { sl@0: ret += iResources[i]->DataChunk()->Size(); sl@0: } sl@0: Kern::MutexSignal(*iMutex); sl@0: return ret; sl@0: }