diff options
| author | 2008-12-19 08:31:54 -0800 | |
|---|---|---|
| committer | 2008-12-19 08:31:54 -0800 | |
| commit | 772a89695f179b51d16b26c1b0d946aa3e850e70 (patch) | |
| tree | 9a9fdadd1301625f875a3c126c986c79e3363ac4 /libs/surfaceflinger/VRamHeap.cpp | |
| parent | d34e59679f6a98e9e67ef4bd18da6e5a86d386bc (diff) | |
| parent | e09fd9e819c23dc90bca68375645e15544861330 (diff) | |
Merge commit 'remotes/korg/cupcake'
Conflicts:
	core/java/com/android/internal/app/AlertController.java
	core/res/res/values/strings.xml
	media/java/android/media/AudioSystem.java
	services/java/com/android/server/LocationManagerService.java
Diffstat (limited to 'libs/surfaceflinger/VRamHeap.cpp')
| -rw-r--r-- | libs/surfaceflinger/VRamHeap.cpp | 81 | 
1 files changed, 49 insertions, 32 deletions
| diff --git a/libs/surfaceflinger/VRamHeap.cpp b/libs/surfaceflinger/VRamHeap.cpp index 3852d51954..77bc5766be 100644 --- a/libs/surfaceflinger/VRamHeap.cpp +++ b/libs/surfaceflinger/VRamHeap.cpp @@ -37,6 +37,8 @@  #include <GLES/eglnatives.h> +#include "GPUHardware/GPUHardware.h" +#include "SurfaceFlinger.h"  #include "VRamHeap.h"  #if HAVE_ANDROID_OS @@ -59,8 +61,9 @@ int SurfaceHeapManager::global_pmem_heap = 0;  // --------------------------------------------------------------------------- -SurfaceHeapManager::SurfaceHeapManager(size_t clientHeapSize) -    : mClientHeapSize(clientHeapSize) +SurfaceHeapManager::SurfaceHeapManager(const sp<SurfaceFlinger>& flinger,  +        size_t clientHeapSize) +    : mFlinger(flinger), mClientHeapSize(clientHeapSize)  {      SurfaceHeapManager::global_pmem_heap = 1;  } @@ -81,25 +84,53 @@ void SurfaceHeapManager::onFirstRef()      }  } -sp<MemoryDealer> SurfaceHeapManager::createHeap(int type) +sp<MemoryDealer> SurfaceHeapManager::createHeap( +        uint32_t flags, +        pid_t client_pid, +        const sp<MemoryDealer>& defaultAllocator)  { -    if (!global_pmem_heap && type==NATIVE_MEMORY_TYPE_PMEM) -        type = NATIVE_MEMORY_TYPE_HEAP; - -    const sp<PMemHeap>& heap(mPMemHeap);      sp<MemoryDealer> dealer;  -    switch (type) { -    case NATIVE_MEMORY_TYPE_HEAP: -        dealer = new MemoryDealer(mClientHeapSize, 0, "SFNativeHeap"); -        break; -    case NATIVE_MEMORY_TYPE_PMEM: -        if (heap != 0) { -            dealer = new MemoryDealer(  -                    heap->createClientHeap(), -                    heap->getAllocator()); +    if (flags & ISurfaceComposer::eGPU) { +        // don't grant GPU memory if GPU is disabled +        char value[PROPERTY_VALUE_MAX]; +        property_get("debug.egl.hw", value, "1"); +        if (atoi(value) == 0) { +            flags &= ~ISurfaceComposer::eGPU; +        } +    } + +    if (flags & ISurfaceComposer::eGPU) { +        // FIXME: this is msm7201A specific, where gpu surfaces may not be secure +        if (!(flags & ISurfaceComposer::eSecure)) { +            // if GPU doesn't work, we try eHardware +            flags |= ISurfaceComposer::eHardware; +            // asked for GPU memory, try that first +            dealer = mFlinger->getGPU()->request(client_pid); +        } +    } + +    if (dealer == NULL) { +        if (defaultAllocator != NULL) +            // if a default allocator is given, use that +            dealer = defaultAllocator; +    } +     +    if (dealer == NULL) { +        // always try h/w accelerated memory first +        if (global_pmem_heap) { +            const sp<PMemHeap>& heap(mPMemHeap); +            if (dealer == NULL && heap != NULL) { +                dealer = new MemoryDealer(  +                        heap->createClientHeap(), +                        heap->getAllocator()); +            }          } -        break; +    } + +    if (dealer == NULL) { +        // return the ashmem allocator (software rendering) +        dealer = new MemoryDealer(mClientHeapSize, 0, "SFNativeHeap");      }      return dealer;  } @@ -122,22 +153,8 @@ sp<SimpleBestFitAllocator> SurfaceHeapManager::getAllocator(int type) const  // --------------------------------------------------------------------------- -PMemHeapInterface::PMemHeapInterface(int fd, size_t size) -    : MemoryHeapBase(fd, size) { -} -PMemHeapInterface::PMemHeapInterface(const char* device, size_t size) -    : MemoryHeapBase(device, size) { -} -PMemHeapInterface::PMemHeapInterface(size_t size, uint32_t flags, char const * name) -    : MemoryHeapBase(size, flags, name) { -} -PMemHeapInterface::~PMemHeapInterface() { -} - -// --------------------------------------------------------------------------- -  PMemHeap::PMemHeap(const char* const device, size_t size, size_t reserved) -    : PMemHeapInterface(device, size) +    : MemoryHeapBase(device, size)  {      //LOGD("%s, %p, mFD=%d", __PRETTY_FUNCTION__, this, heapID());      if (base() != MAP_FAILED) { |