9c050e95ec
- Add ION support - Refactor the design Change-Id: I5b067b0aca1235ee8c01c256e025f416bb56f560
159 lines
4.7 KiB
C++
159 lines
4.7 KiB
C++
/*
|
|
* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are
|
|
* met:
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above
|
|
* copyright notice, this list of conditions and the following
|
|
* disclaimer in the documentation and/or other materials provided
|
|
* with the distribution.
|
|
* * Neither the name of Code Aurora Forum, Inc. nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
|
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
|
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
|
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#include <cutils/log.h>
|
|
#include <utils/RefBase.h>
|
|
#include "gralloc_priv.h"
|
|
#include "alloc_controller.h"
|
|
#include "memalloc.h"
|
|
#include "ionalloc.h"
|
|
|
|
using namespace gralloc;
|
|
using android::sp;
|
|
|
|
sp<IAllocController> IAllocController::sController = NULL;
|
|
sp<IAllocController> IAllocController::getInstance(void)
|
|
{
|
|
if(sController == NULL) {
|
|
#ifdef USE_ION
|
|
sController = new IonController();
|
|
#else
|
|
// XXX: Return pmem/ashmem controller when completed
|
|
#endif
|
|
}
|
|
return sController;
|
|
}
|
|
|
|
IonController::IonController()
|
|
{
|
|
mIonAlloc = new IonAlloc();
|
|
}
|
|
|
|
static bool canFallback(int compositionType, int usage, int flags)
|
|
{
|
|
// Fallback to system heap when alloc fails unless
|
|
// 1. Composition type is MDP
|
|
// 2. Earlier alloc attempt was from system heap
|
|
// 3. Contiguous heap requsted explicitly
|
|
|
|
if(compositionType == MDP_COMPOSITION)
|
|
return false;
|
|
if(flags & ION_HEAP_SYSTEM_ID)
|
|
return false;
|
|
if(usage &(GRALLOC_USAGE_PRIVATE_ADSP_HEAP|
|
|
GRALLOC_USAGE_PRIVATE_EBI_HEAP |
|
|
GRALLOC_USAGE_PRIVATE_SMI_HEAP))
|
|
return false;
|
|
//Return true by default
|
|
return true;
|
|
}
|
|
|
|
int IonController::allocate(alloc_data& data, int usage,
|
|
int compositionType)
|
|
{
|
|
int ionFlags = 0;
|
|
int ret;
|
|
|
|
//System heap cannot be uncached
|
|
if (usage & GRALLOC_USAGE_PRIVATE_UNCACHED &&
|
|
!(usage & GRALLOC_USAGE_PRIVATE_SYSTEM_HEAP))
|
|
data.uncached = true;
|
|
else
|
|
data.uncached = false;
|
|
|
|
if(usage & GRALLOC_USAGE_PRIVATE_ADSP_HEAP)
|
|
ionFlags |= 1 << ION_HEAP_ADSP_ID;
|
|
|
|
if(usage & GRALLOC_USAGE_PRIVATE_SMI_HEAP)
|
|
ionFlags |= 1 << ION_HEAP_SMI_ID;
|
|
|
|
if(usage & GRALLOC_USAGE_PRIVATE_EBI_HEAP)
|
|
ionFlags |= 1 << ION_HEAP_EBI_ID;
|
|
|
|
if(usage & GRALLOC_USAGE_PRIVATE_SYSTEM_HEAP)
|
|
ionFlags |= 1 << ION_HEAP_SYSTEM_ID;
|
|
|
|
// if no flags are set, default to
|
|
// EBI heap, so that bypass can work
|
|
// we can fall back to system heap if
|
|
// we run out.
|
|
if(!ionFlags)
|
|
ionFlags = 1 << ION_HEAP_EBI_ID;
|
|
|
|
data.flags = ionFlags;
|
|
ret = mIonAlloc->alloc_buffer(data);
|
|
|
|
// Fallback
|
|
if(ret < 0 && canFallback(compositionType, usage, ionFlags)) {
|
|
LOGW("Falling back to system heap");
|
|
data.flags = 1 << ION_HEAP_SYSTEM_ID;
|
|
ret = mIonAlloc->alloc_buffer(data);
|
|
}
|
|
|
|
if(ret >= 0 )
|
|
data.allocType = private_handle_t::PRIV_FLAGS_USES_ION;
|
|
|
|
return ret;
|
|
}
|
|
|
|
sp<IMemAlloc> IonController::getAllocator(int flags)
|
|
{
|
|
sp<IMemAlloc> memalloc;
|
|
if (flags & private_handle_t::PRIV_FLAGS_USES_ION) {
|
|
memalloc = mIonAlloc;
|
|
} else {
|
|
LOGE("%s: Invalid flags passed: 0x%x", __FUNCTION__, flags);
|
|
}
|
|
|
|
return memalloc;
|
|
}
|
|
|
|
int PmemAshmemController::allocate(alloc_data& data, int usage,
|
|
int compositionType)
|
|
{
|
|
//XXX PMEM with ashmem fallback strategy
|
|
return 0;
|
|
}
|
|
|
|
sp<IMemAlloc> PmemAshmemController::getAllocator(int flags)
|
|
{
|
|
sp<IMemAlloc> memalloc;
|
|
if (flags & private_handle_t::PRIV_FLAGS_USES_PMEM) {
|
|
// XXX Return right allocator based on flags
|
|
memalloc = NULL;
|
|
} else {
|
|
LOGE("%s: Invalid flags passed: 0x%x", __FUNCTION__, flags);
|
|
memalloc = NULL;
|
|
}
|
|
|
|
return memalloc;
|
|
}
|
|
|
|
|