xref: /aosp_15_r20/external/mesa3d/src/gfxstream/guest/platform/kumquat/VirtGpuKumquat.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright 2023 Google
3  * SPDX-License-Identifier: MIT
4  */
5 
6 #pragma once
7 
8 #include "VirtGpu.h"
9 
10 // Blueprint and Meson builds place things differently
11 #if defined(ANDROID)
12 #include "virtgpu_kumquat_ffi.h"
13 #else
14 #include "virtgpu_kumquat/virtgpu_kumquat_ffi.h"
15 #endif
16 
17 class VirtGpuKumquatResource : public std::enable_shared_from_this<VirtGpuKumquatResource>,
18                                public VirtGpuResource {
19    public:
20     VirtGpuKumquatResource(struct virtgpu_kumquat* virtGpu, uint32_t blobHandle,
21                            uint32_t resourceHandle, uint64_t size);
22     ~VirtGpuKumquatResource();
23 
24     uint32_t getResourceHandle() const override;
25     uint32_t getBlobHandle() const override;
26     uint64_t getSize() const override;
27 
28     int wait() override;
29 
30     VirtGpuResourceMappingPtr createMapping(void) override;
31     int exportBlob(struct VirtGpuExternalHandle& handle) override;
32 
33     int transferFromHost(uint32_t x, uint32_t y, uint32_t w, uint32_t h) override;
34     int transferToHost(uint32_t x, uint32_t y, uint32_t w, uint32_t h) override;
35 
36    private:
37     // Not owned.  Really should use a ScopedFD for this, but doesn't matter since we have a
38     // singleton deviceimplemenentation anyways.
39     struct virtgpu_kumquat* mVirtGpu = nullptr;
40 
41     uint32_t mBlobHandle;
42     uint32_t mResourceHandle;
43     uint64_t mSize;
44 };
45 
46 class VirtGpuKumquatResourceMapping : public VirtGpuResourceMapping {
47    public:
48     VirtGpuKumquatResourceMapping(VirtGpuResourcePtr blob, struct virtgpu_kumquat* virtGpu,
49                                   uint8_t* ptr, uint64_t size);
50     ~VirtGpuKumquatResourceMapping(void);
51 
52     uint8_t* asRawPtr(void) override;
53 
54    private:
55     VirtGpuResourcePtr mBlob;
56     struct virtgpu_kumquat* mVirtGpu = nullptr;
57     uint8_t* mPtr;
58     uint64_t mSize;
59 };
60 
61 class VirtGpuKumquatDevice : public VirtGpuDevice {
62    public:
63     VirtGpuKumquatDevice(enum VirtGpuCapset capset, int fd = -1);
64     virtual ~VirtGpuKumquatDevice();
65 
66     virtual int64_t getDeviceHandle(void);
67 
68     virtual struct VirtGpuCaps getCaps(void);
69 
70     VirtGpuResourcePtr createBlob(const struct VirtGpuCreateBlob& blobCreate) override;
71     VirtGpuResourcePtr createResource(uint32_t width, uint32_t height, uint32_t stride,
72                                       uint32_t size, uint32_t virglFormat, uint32_t target,
73                                       uint32_t bind) override;
74 
75     virtual VirtGpuResourcePtr importBlob(const struct VirtGpuExternalHandle& handle);
76     virtual int execBuffer(struct VirtGpuExecBuffer& execbuffer, const VirtGpuResource* blob);
77 
78    private:
79     int32_t mDescriptor = 0;
80     struct virtgpu_kumquat* mVirtGpu = nullptr;
81     struct VirtGpuCaps mCaps;
82 };
83