14344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim/* 24344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * Copyright (C) 2018 The Android Open Source Project 34344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * 44344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * Licensed under the Apache License, Version 2.0 (the "License"); 54344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * you may not use this file except in compliance with the License. 64344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * You may obtain a copy of the License at 74344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * 84344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * http://www.apache.org/licenses/LICENSE-2.0 94344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * 104344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * Unless required by applicable law or agreed to in writing, software 114344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * distributed under the License is distributed on an "AS IS" BASIS, 124344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * See the License for the specific language governing permissions and 144344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * limitations under the License. 154344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim */ 164344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim 174344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim#include <C2Buffer.h> 184344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim#include "allocator.h" 194344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim 204344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimunion Params { 214344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim struct { 224344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim uint32_t capacity; 234344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim C2MemoryUsage usage; 244344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim } data; 254344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim uint8_t array[0]; 264344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim Params() : data{0, {0, 0}} {} 274344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim Params(uint32_t size) 284344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim : data{size, {C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE}} {} 294344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}; 304344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim 314344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimstruct AllocationDtor { 324344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim AllocationDtor(const std::shared_ptr<C2LinearAllocation> &alloc) 334344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim : mAlloc(alloc) {} 344344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim 354344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim void operator()(BufferPoolAllocation *poolAlloc) { delete poolAlloc; } 364344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim 374344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim const std::shared_ptr<C2LinearAllocation> mAlloc; 384344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}; 394344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim 404344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik KimResultStatus VtsBufferPoolAllocator::allocate( 414344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim const std::vector<uint8_t> ¶ms, 42da9d245365644c12eaa95b4c043cc7e357cdf7d7Sungtak Lee std::shared_ptr<BufferPoolAllocation> *alloc, 43da9d245365644c12eaa95b4c043cc7e357cdf7d7Sungtak Lee size_t *allocSize) { 444344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim Params ionParams; 454344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim memcpy(&ionParams, params.data(), std::min(sizeof(Params), params.size())); 464344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim 474344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim std::shared_ptr<C2LinearAllocation> linearAlloc; 484344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim c2_status_t status = mAllocator->newLinearAllocation( 494344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim ionParams.data.capacity, ionParams.data.usage, &linearAlloc); 504344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim if (status == C2_OK && linearAlloc) { 514344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim BufferPoolAllocation *ptr = new BufferPoolAllocation(linearAlloc->handle()); 524344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim if (ptr) { 534344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim *alloc = std::shared_ptr<BufferPoolAllocation>( 544344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim ptr, AllocationDtor(linearAlloc)); 554344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim if (*alloc) { 56da9d245365644c12eaa95b4c043cc7e357cdf7d7Sungtak Lee *allocSize = ionParams.data.capacity; 574344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim return ResultStatus::OK; 584344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim } 594344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim delete ptr; 604344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim return ResultStatus::NO_MEMORY; 614344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim } 624344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim } 634344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim return ResultStatus::CRITICAL_ERROR; 644344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim} 654344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim 664344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimbool VtsBufferPoolAllocator::compatible(const std::vector<uint8_t> &newParams, 674344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim const std::vector<uint8_t> &oldParams) { 684344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim size_t newSize = newParams.size(); 694344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim size_t oldSize = oldParams.size(); 704344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim if (newSize == oldSize) { 714344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim for (size_t i = 0; i < newSize; ++i) { 724344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim if (newParams[i] != oldParams[i]) { 734344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim return false; 744344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim } 754344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim } 764344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim return true; 774344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim } 784344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim return false; 794344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim} 804344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim 814344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimvoid getVtsAllocatorParams(std::vector<uint8_t> *params) { 824344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim constexpr static int kAllocationSize = 1024 * 10; 834344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim Params ionParams(kAllocationSize); 844344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim 854344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim params->assign(ionParams.array, ionParams.array + sizeof(ionParams)); 864344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim} 87