/* * Copyright 2019 The Android Open Source Project * * 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. */ #define LOG_TAG "ComposerResources 2.2" #include "composer-resources/2.2/ComposerResources.h" namespace android { namespace hardware { namespace graphics { namespace composer { namespace V2_2 { namespace hal { using V2_1::Display; using V2_1::Error; using V2_1::Layer; using V2_1::hal::ComposerHandleCache; using V2_1::hal::ComposerHandleImporter; Error ComposerDisplayResource::getReadbackBuffer(const native_handle_t* inHandle, const native_handle_t** outHandle, const native_handle** outReplacedHandle) { const uint32_t slot = 0; const bool fromCache = false; return mReadbackBufferCache.getHandle(slot, fromCache, inHandle, outHandle, outReplacedHandle); } std::unique_ptr ComposerResources::create() { auto resources = std::make_unique(); return resources->init() ? std::move(resources) : nullptr; } Error ComposerResources::getDisplayReadbackBuffer(Display display, const native_handle_t* rawHandle, const native_handle_t** outHandle, ReplacedHandle* outReplacedHandle) { // import buffer const native_handle_t* importedHandle; Error error = mImporter.importBuffer(rawHandle, &importedHandle); if (error != Error::NONE) { return error; } std::lock_guard lock(mDisplayResourcesMutex); auto iter = mDisplayResources.find(display); if (iter == mDisplayResources.end()) { mImporter.freeBuffer(importedHandle); return Error::BAD_DISPLAY; } ComposerDisplayResource& displayResource = *static_cast(iter->second.get()); // update cache const native_handle_t* replacedHandle; error = displayResource.getReadbackBuffer(importedHandle, outHandle, &replacedHandle); if (error != Error::NONE) { mImporter.freeBuffer(importedHandle); return error; } outReplacedHandle->reset(&mImporter, replacedHandle); return Error::NONE; } } // namespace hal } // namespace V2_2 } // namespace composer } // namespace graphics } // namespace hardware } // namespace android