* Copyright (c) 2023 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef OHOS_HDI_DISPLAY_V1_0_BUFFER_CACHE_UTILS_H
#define OHOS_HDI_DISPLAY_V1_0_BUFFER_CACHE_UTILS_H
#include <functional>
#include <memory>
#include <unordered_map>
#include "base/native_buffer.h"
#include "cache_manager.h"
#include "common/include/display_interface_utils.h"
#include "hdf_log.h"
namespace OHOS {
namespace HDI {
namespace Display {
namespace Composer {
#define DEBUG_BUFFER_CACHE_UTILS
class BufferCacheUtils {
public:
static BufferHandle* NativeBufferCache(const std::shared_ptr<CacheManager<uint32_t, NativeBuffer>>& cacheMgr,
BufferHandle* buffer, uint32_t seqNo, uint32_t callerId, bool &needFreeBuffer)
{
BufferHandle* handle = nullptr;
needFreeBuffer = false;
if (buffer == nullptr && seqNo != UINT32_MAX) {
NativeBuffer* nativeBuffer = cacheMgr->SearchCache(seqNo);
DISPLAY_CHK_RETURN(nativeBuffer == nullptr, handle,
HDF_LOGE("%{public}s: Get Native buffer cache is not found, callerId=%{public}u, seqNo=%{public}u",
__func__, callerId, seqNo));
handle = nativeBuffer->GetBufferHandle();
HDF_LOGD("apply %{public}s: callerId=%{public}u, seqNo=%{public}u", __func__, callerId, seqNo);
DISPLAY_CHK_RETURN(handle == nullptr, handle,
HDF_LOGE("%{public}s: Get buffer cache is nullptr, callerId=%{public}u, seqNo=%{public}u",
__func__, callerId, seqNo));
} else if (buffer != nullptr && seqNo != UINT32_MAX) {
NativeBuffer* nativeBuffer = new NativeBuffer();
DISPLAY_CHK_RETURN(nativeBuffer == nullptr, nullptr,
HDF_LOGE("%{public}s: new nativeBuffer fail", __func__));
nativeBuffer->SetBufferHandle(buffer, true, nullptr);
auto retBool = cacheMgr->InsertCache(seqNo, nativeBuffer);
if (retBool == false) {
handle = nativeBuffer->Move();
delete nativeBuffer;
HDF_LOGE("%{public}s: Set buffer cache fail, callerId=%{public}u, seqNo=%{public}u",
__func__, callerId, seqNo);
needFreeBuffer = true;
} else {
handle = buffer;
}
HDF_LOGD("insert %{public}s: callerId=%{public}u, seqNo=%{public}u", __func__, callerId, seqNo);
} else if (buffer != nullptr && seqNo == UINT32_MAX) {
HDF_LOGI("%{public}s: buffer cache passthrough", __func__);
handle = buffer;
needFreeBuffer = true;
} else {
DISPLAY_CHK_RETURN(((buffer == nullptr)), nullptr,
HDF_LOGE("%{public}s: Inputs args check error", __func__));
}
return handle;
}
};
}
}
}
}
#endif