blob: 34825073991068c526386a276a1afe04ffe735a0 [file] [log] [blame]
Jiwen 'Steve' Cai4e566ed2018-09-19 22:41:42 -07001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Jiwen 'Steve' Caiff675b72018-10-09 18:08:29 -070017#ifndef ANDROID_BUFFER_HUB_METADATA_H_
18#define ANDROID_BUFFER_HUB_METADATA_H_
Jiwen 'Steve' Cai4e566ed2018-09-19 22:41:42 -070019
Fan Xu069e8382018-11-16 16:28:08 -080020#include <android-base/unique_fd.h>
Fan Xucfbe0742018-11-21 15:03:32 -080021#include <ui/BufferHubDefs.h>
Fan Xu069e8382018-11-16 16:28:08 -080022
Jiwen 'Steve' Cai4e566ed2018-09-19 22:41:42 -070023namespace android {
Jiwen 'Steve' Cai4e566ed2018-09-19 22:41:42 -070024
Fan Xu069e8382018-11-16 16:28:08 -080025namespace {
26using base::unique_fd;
27} // namespace
28
Jiwen 'Steve' Cai4e566ed2018-09-19 22:41:42 -070029class BufferHubMetadata {
Jiwen 'Steve' Caiff675b72018-10-09 18:08:29 -070030public:
31 // Creates a new BufferHubMetadata backed by an ashmem region.
32 //
33 // @param userMetadataSize Size in bytes of the user defined metadata. The entire metadata
34 // shared memory region to be allocated is the size of canonical
35 // BufferHubDefs::MetadataHeader plus userMetadataSize.
Tianyu Jiang727ede42019-02-01 11:44:51 -080036 static BufferHubMetadata create(size_t userMetadataSize);
Jiwen 'Steve' Cai4e566ed2018-09-19 22:41:42 -070037
Jiwen 'Steve' Caiff675b72018-10-09 18:08:29 -070038 // Imports an existing BufferHubMetadata from an ashmem FD.
39 //
Fan Xu069e8382018-11-16 16:28:08 -080040 // @param ashmemFd Ashmem file descriptor representing an ashmem region.
Tianyu Jiang727ede42019-02-01 11:44:51 -080041 static BufferHubMetadata import(unique_fd ashmemFd);
Jiwen 'Steve' Cai4e566ed2018-09-19 22:41:42 -070042
Jiwen 'Steve' Caiff675b72018-10-09 18:08:29 -070043 BufferHubMetadata() = default;
Jiwen 'Steve' Cai4e566ed2018-09-19 22:41:42 -070044
Jiwen 'Steve' Caiff675b72018-10-09 18:08:29 -070045 BufferHubMetadata(BufferHubMetadata&& other) { *this = std::move(other); }
Jiwen 'Steve' Cai4e566ed2018-09-19 22:41:42 -070046
Jiwen 'Steve' Caiff675b72018-10-09 18:08:29 -070047 ~BufferHubMetadata();
Jiwen 'Steve' Cai4e566ed2018-09-19 22:41:42 -070048
Jiwen 'Steve' Caiff675b72018-10-09 18:08:29 -070049 BufferHubMetadata& operator=(BufferHubMetadata&& other) {
50 if (this != &other) {
51 mUserMetadataSize = other.mUserMetadataSize;
52 other.mUserMetadataSize = 0;
Jiwen 'Steve' Cai4e566ed2018-09-19 22:41:42 -070053
Fan Xu069e8382018-11-16 16:28:08 -080054 mAshmemFd = std::move(other.mAshmemFd);
Jiwen 'Steve' Cai4e566ed2018-09-19 22:41:42 -070055
Jiwen 'Steve' Caiff675b72018-10-09 18:08:29 -070056 // The old raw mMetadataHeader pointer must be cleared, otherwise the destructor will
57 // automatically mummap() the shared memory.
58 mMetadataHeader = other.mMetadataHeader;
59 other.mMetadataHeader = nullptr;
60 }
61 return *this;
Jiwen 'Steve' Cai4e566ed2018-09-19 22:41:42 -070062 }
Jiwen 'Steve' Cai4e566ed2018-09-19 22:41:42 -070063
Jiwen 'Steve' Caiff675b72018-10-09 18:08:29 -070064 // Returns true if the metadata is valid, i.e. the metadata has a valid ashmem fd and the ashmem
65 // has been mapped into virtual address space.
Tianyu Jiang727ede42019-02-01 11:44:51 -080066 bool isValid() const { return mAshmemFd.get() != -1 && mMetadataHeader != nullptr; }
Jiwen 'Steve' Cai4e566ed2018-09-19 22:41:42 -070067
Tianyu Jiang727ede42019-02-01 11:44:51 -080068 size_t userMetadataSize() const { return mUserMetadataSize; }
69 size_t metadataSize() const { return mUserMetadataSize + BufferHubDefs::kMetadataHeaderSize; }
Jiwen 'Steve' Cai4e566ed2018-09-19 22:41:42 -070070
Tianyu Jiang727ede42019-02-01 11:44:51 -080071 const unique_fd& ashmemFd() const { return mAshmemFd; }
72 BufferHubDefs::MetadataHeader* metadataHeader() { return mMetadataHeader; }
Jiwen 'Steve' Cai4e566ed2018-09-19 22:41:42 -070073
Jiwen 'Steve' Caiff675b72018-10-09 18:08:29 -070074private:
Fan Xu069e8382018-11-16 16:28:08 -080075 BufferHubMetadata(size_t userMetadataSize, unique_fd ashmemFd,
Fan Xucfbe0742018-11-21 15:03:32 -080076 BufferHubDefs::MetadataHeader* metadataHeader);
Jiwen 'Steve' Cai4e566ed2018-09-19 22:41:42 -070077
Jiwen 'Steve' Caiff675b72018-10-09 18:08:29 -070078 BufferHubMetadata(const BufferHubMetadata&) = delete;
79 void operator=(const BufferHubMetadata&) = delete;
Jiwen 'Steve' Cai4e566ed2018-09-19 22:41:42 -070080
Jiwen 'Steve' Caiff675b72018-10-09 18:08:29 -070081 size_t mUserMetadataSize = 0;
Fan Xu069e8382018-11-16 16:28:08 -080082 unique_fd mAshmemFd;
Fan Xucfbe0742018-11-21 15:03:32 -080083 BufferHubDefs::MetadataHeader* mMetadataHeader = nullptr;
Jiwen 'Steve' Cai4e566ed2018-09-19 22:41:42 -070084};
85
Jiwen 'Steve' Caiff675b72018-10-09 18:08:29 -070086} // namespace android
Jiwen 'Steve' Cai4e566ed2018-09-19 22:41:42 -070087
Jiwen 'Steve' Caiff675b72018-10-09 18:08:29 -070088#endif // ANDROID_BUFFER_HUB_METADATA_H_