xref: /aosp_15_r20/external/mesa3d/src/gfxstream/guest/android/GrallocEmulated.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2024 Google LLC
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker #include <cstdint>
7*61046927SAndroid Build Coastguard Worker #include <memory>
8*61046927SAndroid Build Coastguard Worker #include <optional>
9*61046927SAndroid Build Coastguard Worker #include <vector>
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker #include "VirtGpu.h"
12*61046927SAndroid Build Coastguard Worker #include "gfxstream/guest/GfxStreamGralloc.h"
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker namespace gfxstream {
15*61046927SAndroid Build Coastguard Worker 
16*61046927SAndroid Build Coastguard Worker using EGLClientBuffer = void*;
17*61046927SAndroid Build Coastguard Worker 
18*61046927SAndroid Build Coastguard Worker class EmulatedAHardwareBuffer {
19*61046927SAndroid Build Coastguard Worker    public:
20*61046927SAndroid Build Coastguard Worker     EmulatedAHardwareBuffer(uint32_t width, uint32_t height, uint32_t drmFormat,
21*61046927SAndroid Build Coastguard Worker                             VirtGpuResourcePtr resource);
22*61046927SAndroid Build Coastguard Worker 
23*61046927SAndroid Build Coastguard Worker     ~EmulatedAHardwareBuffer();
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker     uint32_t getResourceId() const;
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker     uint32_t getWidth() const;
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker     uint32_t getHeight() const;
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker     int getAndroidFormat() const;
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker     uint32_t getDrmFormat() const;
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker     AHardwareBuffer* asAHardwareBuffer();
36*61046927SAndroid Build Coastguard Worker 
37*61046927SAndroid Build Coastguard Worker     buffer_handle_t asBufferHandle();
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker     EGLClientBuffer asEglClientBuffer();
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker     void acquire();
42*61046927SAndroid Build Coastguard Worker     void release();
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker     int lock(uint8_t** ptr);
45*61046927SAndroid Build Coastguard Worker     int lockPlanes(std::vector<Gralloc::LockedPlane>* ahbPlanes);
46*61046927SAndroid Build Coastguard Worker     int unlock();
47*61046927SAndroid Build Coastguard Worker 
48*61046927SAndroid Build Coastguard Worker    private:
49*61046927SAndroid Build Coastguard Worker     uint32_t mRefCount;
50*61046927SAndroid Build Coastguard Worker     uint32_t mWidth;
51*61046927SAndroid Build Coastguard Worker     uint32_t mHeight;
52*61046927SAndroid Build Coastguard Worker     uint32_t mDrmFormat;
53*61046927SAndroid Build Coastguard Worker     VirtGpuResourcePtr mResource;
54*61046927SAndroid Build Coastguard Worker     std::optional<VirtGpuResourceMappingPtr> mMapped;
55*61046927SAndroid Build Coastguard Worker };
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker class EmulatedGralloc : public Gralloc {
58*61046927SAndroid Build Coastguard Worker    public:
59*61046927SAndroid Build Coastguard Worker     EmulatedGralloc(int32_t descriptor);
60*61046927SAndroid Build Coastguard Worker     ~EmulatedGralloc();
61*61046927SAndroid Build Coastguard Worker 
62*61046927SAndroid Build Coastguard Worker     GrallocType getGrallocType() override;
63*61046927SAndroid Build Coastguard Worker     uint32_t createColorBuffer(int width, int height, uint32_t glFormat) override;
64*61046927SAndroid Build Coastguard Worker 
65*61046927SAndroid Build Coastguard Worker     int allocate(uint32_t width, uint32_t height, uint32_t format, uint64_t usage,
66*61046927SAndroid Build Coastguard Worker                  AHardwareBuffer** outputAhb) override;
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker     AHardwareBuffer* allocate(uint32_t width, uint32_t height, uint32_t format);
69*61046927SAndroid Build Coastguard Worker 
70*61046927SAndroid Build Coastguard Worker     void acquire(AHardwareBuffer* ahb) override;
71*61046927SAndroid Build Coastguard Worker     void release(AHardwareBuffer* ahb) override;
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker     int lock(AHardwareBuffer* ahb, uint8_t** ptr) override;
74*61046927SAndroid Build Coastguard Worker     int lockPlanes(AHardwareBuffer* ahb, std::vector<LockedPlane>* ahbPlanes) override;
75*61046927SAndroid Build Coastguard Worker     int unlock(AHardwareBuffer* ahb) override;
76*61046927SAndroid Build Coastguard Worker 
77*61046927SAndroid Build Coastguard Worker     uint32_t getHostHandle(const native_handle_t* handle) override;
78*61046927SAndroid Build Coastguard Worker     uint32_t getHostHandle(const AHardwareBuffer* handle) override;
79*61046927SAndroid Build Coastguard Worker 
80*61046927SAndroid Build Coastguard Worker     const native_handle_t* getNativeHandle(const AHardwareBuffer* ahb) override;
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker     int getFormat(const native_handle_t* handle) override;
83*61046927SAndroid Build Coastguard Worker     int getFormat(const AHardwareBuffer* handle) override;
84*61046927SAndroid Build Coastguard Worker 
85*61046927SAndroid Build Coastguard Worker     uint32_t getFormatDrmFourcc(const AHardwareBuffer* handle) override;
86*61046927SAndroid Build Coastguard Worker 
87*61046927SAndroid Build Coastguard Worker     uint32_t getWidth(const AHardwareBuffer* ahb) override;
88*61046927SAndroid Build Coastguard Worker     uint32_t getHeight(const AHardwareBuffer* ahb) override;
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker     size_t getAllocatedSize(const native_handle_t*) override;
91*61046927SAndroid Build Coastguard Worker     size_t getAllocatedSize(const AHardwareBuffer*) override;
92*61046927SAndroid Build Coastguard Worker 
93*61046927SAndroid Build Coastguard Worker     int getId(const AHardwareBuffer* ahb, uint64_t* id) override;
94*61046927SAndroid Build Coastguard Worker 
95*61046927SAndroid Build Coastguard Worker    private:
96*61046927SAndroid Build Coastguard Worker     std::unique_ptr<VirtGpuDevice> mDevice;
97*61046927SAndroid Build Coastguard Worker     std::vector<std::unique_ptr<EmulatedAHardwareBuffer>> mOwned;
98*61046927SAndroid Build Coastguard Worker };
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker }  // namespace gfxstream
101