2019-04-17 10:49:11 +08:00
|
|
|
//
|
|
|
|
// ImagePool.cpp
|
|
|
|
// MNN
|
|
|
|
//
|
|
|
|
// Created by MNN on 2019/02/28.
|
|
|
|
// Copyright © 2018, Alibaba Group Holding Limited
|
|
|
|
//
|
|
|
|
|
2019-12-27 22:16:57 +08:00
|
|
|
#include "backend/opencl/core/ImagePool.hpp"
|
2019-04-17 10:49:11 +08:00
|
|
|
namespace MNN {
|
|
|
|
namespace OpenCL {
|
2020-11-05 16:41:56 +08:00
|
|
|
cl::Image* ImagePool::alloc(int w, int h, cl_channel_type type, bool seperate) {
|
2019-04-17 10:49:11 +08:00
|
|
|
if (!seperate) {
|
|
|
|
int minWaste = 0;
|
|
|
|
auto findIter = mFreeList.end();
|
|
|
|
for (auto iterP = mFreeList.begin(); iterP != mFreeList.end(); iterP++) {
|
|
|
|
auto& iter = *iterP;
|
2019-12-27 22:16:57 +08:00
|
|
|
if (iter->w >= w && iter->h >= h) {
|
2019-04-17 10:49:11 +08:00
|
|
|
int waste = iter->w * iter->h - w * h;
|
|
|
|
if (minWaste == 0 || waste < minWaste) {
|
|
|
|
findIter = iterP;
|
|
|
|
minWaste = waste;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (findIter != mFreeList.end()) {
|
|
|
|
auto image = (*findIter)->image.get();
|
|
|
|
mFreeList.erase(findIter);
|
|
|
|
return image;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
std::shared_ptr<Node> node(new Node);
|
|
|
|
node->w = w;
|
|
|
|
node->h = h;
|
|
|
|
node->image.reset(
|
2020-11-05 16:41:56 +08:00
|
|
|
new cl::Image2D(mContext, CL_MEM_READ_WRITE, cl::ImageFormat(CL_RGBA, type), w, h, 0, nullptr, nullptr));
|
2019-04-17 10:49:11 +08:00
|
|
|
if (nullptr == node->image) {
|
|
|
|
MNN_ERROR("All Image %d x %d error \n", w, h);
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
mAllImage.insert(std::make_pair(node->image.get(), node));
|
|
|
|
return node->image.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ImagePool::recycle(cl::Image* image, bool release) {
|
|
|
|
auto iter = mAllImage.find(image);
|
|
|
|
if (iter == mAllImage.end()) {
|
|
|
|
MNN_ERROR("recycle failed for not belong image\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (release) {
|
|
|
|
mAllImage.erase(iter);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
mFreeList.push_back(iter->second);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ImagePool::clear() {
|
|
|
|
mFreeList.clear();
|
|
|
|
mAllImage.clear();
|
|
|
|
}
|
|
|
|
} // namespace OpenCL
|
|
|
|
} // namespace MNN
|