| // 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. |
| #include "ExternalObjectManager.h" |
| |
| #include <utility> |
| |
| namespace gfxstream { |
| |
| static ExternalObjectManager* sMapping() { |
| static ExternalObjectManager* s = new ExternalObjectManager; |
| return s; |
| } |
| |
| // static |
| ExternalObjectManager* ExternalObjectManager::get() { return sMapping(); } |
| |
| void ExternalObjectManager::addMapping(uint32_t ctxId, uint64_t blobId, void* addr, |
| uint32_t caching) { |
| struct HostMemInfo info = { |
| .addr = addr, |
| .caching = caching, |
| }; |
| |
| auto key = std::make_pair(ctxId, blobId); |
| std::lock_guard<std::mutex> lock(mLock); |
| mHostMemInfos.insert(std::make_pair(key, info)); |
| } |
| |
| std::optional<HostMemInfo> ExternalObjectManager::removeMapping(uint32_t ctxId, uint64_t blobId) { |
| auto key = std::make_pair(ctxId, blobId); |
| std::lock_guard<std::mutex> lock(mLock); |
| auto found = mHostMemInfos.find(key); |
| if (found != mHostMemInfos.end()) { |
| std::optional<HostMemInfo> ret = found->second; |
| mHostMemInfos.erase(found); |
| return ret; |
| } |
| |
| return std::nullopt; |
| } |
| |
| void ExternalObjectManager::addBlobDescriptorInfo(uint32_t ctxId, uint64_t blobId, |
| ManagedDescriptor descriptor, |
| uint32_t streamHandleType, uint32_t caching, |
| std::optional<VulkanInfo> vulkanInfoOpt) { |
| struct BlobDescriptorInfo info = { |
| .descriptorInfo = |
| { |
| .descriptor = std::move(descriptor), |
| .streamHandleType = streamHandleType, |
| }, |
| .caching = caching, |
| .vulkanInfoOpt = vulkanInfoOpt, |
| }; |
| |
| auto key = std::make_pair(ctxId, blobId); |
| std::lock_guard<std::mutex> lock(mLock); |
| mBlobDescriptorInfos.insert(std::make_pair(key, std::move(info))); |
| } |
| |
| std::optional<BlobDescriptorInfo> ExternalObjectManager::removeBlobDescriptorInfo(uint32_t ctxId, |
| uint64_t blobId) { |
| auto key = std::make_pair(ctxId, blobId); |
| std::lock_guard<std::mutex> lock(mLock); |
| auto found = mBlobDescriptorInfos.find(key); |
| if (found != mBlobDescriptorInfos.end()) { |
| std::optional<BlobDescriptorInfo> ret = std::move(found->second); |
| mBlobDescriptorInfos.erase(found); |
| return ret; |
| } |
| |
| return std::nullopt; |
| } |
| |
| void ExternalObjectManager::addSyncDescriptorInfo(uint32_t ctxId, uint64_t syncId, |
| ManagedDescriptor descriptor, |
| uint32_t streamHandleType) { |
| SyncDescriptorInfo info = { |
| .descriptor = std::move(descriptor), |
| .streamHandleType = streamHandleType, |
| }; |
| |
| auto key = std::make_pair(ctxId, syncId); |
| std::lock_guard<std::mutex> lock(mLock); |
| mSyncDescriptorInfos.insert(std::make_pair(key, std::move(info))); |
| } |
| |
| std::optional<SyncDescriptorInfo> ExternalObjectManager::removeSyncDescriptorInfo(uint32_t ctxId, |
| uint64_t syncId) { |
| auto key = std::make_pair(ctxId, syncId); |
| std::lock_guard<std::mutex> lock(mLock); |
| auto found = mSyncDescriptorInfos.find(key); |
| if (found != mSyncDescriptorInfos.end()) { |
| std::optional<SyncDescriptorInfo> ret = std::move(found->second); |
| mSyncDescriptorInfos.erase(found); |
| return ret; |
| } |
| |
| return std::nullopt; |
| } |
| |
| void ExternalObjectManager::addResourceExternalHandleInfo( |
| uint32_t resHandle, const ExternalHandleInfo& externalHandleInfo) { |
| std::lock_guard<std::mutex> lock(mLock); |
| mResourceExternalHandleInfos.insert(std::make_pair(resHandle, externalHandleInfo)); |
| } |
| |
| std::optional<ExternalHandleInfo> ExternalObjectManager::removeResourceExternalHandleInfo( |
| uint32_t resHandle) { |
| std::lock_guard<std::mutex> lock(mLock); |
| auto found = mResourceExternalHandleInfos.find(resHandle); |
| if (found != mResourceExternalHandleInfos.end()) { |
| std::optional<ExternalHandleInfo> ret = found->second; |
| mResourceExternalHandleInfos.erase(found); |
| return ret; |
| } |
| |
| return std::nullopt; |
| } |
| |
| } // namespace gfxstream |