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> &params,
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