blob: 9a7c335a7d0ed9ece0f272381dd72c2d233ced8e [file] [log] [blame]
Roman Stratiienko8666dc92021-02-09 17:49:55 +02001/*
2 * Copyright (C) 2021 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
Roman Stratiienkobde95662022-12-10 20:27:58 +020017#pragma once
Roman Stratiienko8666dc92021-02-09 17:49:55 +020018
19#include <drm/drm_fourcc.h>
20#include <hardware/gralloc.h>
21
22#include <array>
23#include <map>
24
Roman Stratiienko1cbaaf92022-02-21 10:52:18 +020025#include "bufferinfo/BufferInfo.h"
Roman Stratiienko8666dc92021-02-09 17:49:55 +020026#include "drm/DrmDevice.h"
Roman Stratiienko8666dc92021-02-09 17:49:55 +020027
28#ifndef DRM_FORMAT_INVALID
29#define DRM_FORMAT_INVALID 0
30#endif
31
32using GemHandle = uint32_t;
33
34namespace android {
35
36class DrmFbIdHandle {
37 public:
Roman Stratiienko1cbaaf92022-02-21 10:52:18 +020038 static auto CreateInstance(BufferInfo *bo, GemHandle first_gem_handle,
Roman Stratiienko7d899112022-01-31 11:30:27 +020039 DrmDevice &drm) -> std::shared_ptr<DrmFbIdHandle>;
Roman Stratiienko8666dc92021-02-09 17:49:55 +020040
41 ~DrmFbIdHandle();
42 DrmFbIdHandle(DrmFbIdHandle &&) = delete;
43 DrmFbIdHandle(const DrmFbIdHandle &) = delete;
44 auto operator=(const DrmFbIdHandle &) = delete;
45 auto operator=(DrmFbIdHandle &&) = delete;
46
47 auto GetFbId [[nodiscard]] () const -> uint32_t {
48 return fb_id_;
49 }
50
51 private:
Roman Stratiienko7d899112022-01-31 11:30:27 +020052 explicit DrmFbIdHandle(DrmDevice &drm) : drm_(&drm){};
Roman Stratiienko8666dc92021-02-09 17:49:55 +020053
Roman Stratiienko7d899112022-01-31 11:30:27 +020054 DrmDevice *const drm_;
Roman Stratiienko8666dc92021-02-09 17:49:55 +020055
56 uint32_t fb_id_{};
Roman Stratiienko1cbaaf92022-02-21 10:52:18 +020057 std::array<GemHandle, kBufferMaxPlanes> gem_handles_{};
Roman Stratiienko8666dc92021-02-09 17:49:55 +020058};
59
60class DrmFbImporter {
61 public:
Roman Stratiienko7d899112022-01-31 11:30:27 +020062 explicit DrmFbImporter(DrmDevice &drm) : drm_(&drm){};
Roman Stratiienko8666dc92021-02-09 17:49:55 +020063 ~DrmFbImporter() = default;
64 DrmFbImporter(const DrmFbImporter &) = delete;
65 DrmFbImporter(DrmFbImporter &&) = delete;
66 auto operator=(const DrmFbImporter &) = delete;
67 auto operator=(DrmFbImporter &&) = delete;
68
Roman Stratiienko1cbaaf92022-02-21 10:52:18 +020069 auto GetOrCreateFbId(BufferInfo *bo) -> std::shared_ptr<DrmFbIdHandle>;
Roman Stratiienko8666dc92021-02-09 17:49:55 +020070
71 private:
72 void CleanupEmptyCacheElements() {
73 for (auto it = drm_fb_id_handle_cache_.begin();
74 it != drm_fb_id_handle_cache_.end();) {
75 if (it->second.expired()) {
76 it = drm_fb_id_handle_cache_.erase(it);
77 } else {
78 ++it;
79 }
80 }
81 }
82
Roman Stratiienko7d899112022-01-31 11:30:27 +020083 DrmDevice *const drm_;
Roman Stratiienko8666dc92021-02-09 17:49:55 +020084
85 std::map<GemHandle, std::weak_ptr<DrmFbIdHandle>> drm_fb_id_handle_cache_;
86};
87
88} // namespace android