xref: /aosp_15_r20/external/mesa3d/src/gfxstream/guest/platform/linux/LinuxVirtGpu.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 class LinuxVirtGpuResource : public std::enable_shared_from_this<LinuxVirtGpuResource>,
11                              public VirtGpuResource {
12    public:
13     LinuxVirtGpuResource(int64_t deviceHandle, uint32_t blobHandle, uint32_t resourceHandle,
14                          uint64_t size);
15     ~LinuxVirtGpuResource();
16 
17     void intoRaw() override;
18     uint32_t getResourceHandle() const override;
19     uint32_t getBlobHandle() const override;
20     uint64_t getSize() const override;
21     int wait() override;
22 
23     VirtGpuResourceMappingPtr createMapping(void) override;
24     int exportBlob(struct VirtGpuExternalHandle& handle) override;
25 
26     int transferFromHost(uint32_t x, uint32_t y, uint32_t w, uint32_t h) override;
27     int transferToHost(uint32_t x, uint32_t y, uint32_t w, uint32_t h) override;
28 
29    private:
30     // Not owned.  Really should use a ScopedFD for this, but doesn't matter since we have a
31     // singleton deviceimplemenentation anyways.
32     int64_t mDeviceHandle;
33 
34     uint32_t mBlobHandle;
35     uint32_t mResourceHandle;
36     uint64_t mSize;
37 };
38 
39 class LinuxVirtGpuResourceMapping : public VirtGpuResourceMapping {
40    public:
41     LinuxVirtGpuResourceMapping(VirtGpuResourcePtr blob, uint8_t* ptr, uint64_t size);
42     ~LinuxVirtGpuResourceMapping(void);
43 
44     uint8_t* asRawPtr(void) override;
45 
46    private:
47     VirtGpuResourcePtr mBlob;
48     uint8_t* mPtr;
49     uint64_t mSize;
50 };
51 
52 class LinuxVirtGpuDevice : public VirtGpuDevice {
53    public:
54     LinuxVirtGpuDevice(enum VirtGpuCapset capset, int fd = -1);
55     virtual ~LinuxVirtGpuDevice();
56 
57     virtual int64_t getDeviceHandle(void);
58 
59     virtual struct VirtGpuCaps getCaps(void);
60 
61     VirtGpuResourcePtr createBlob(const struct VirtGpuCreateBlob& blobCreate) override;
62     VirtGpuResourcePtr createResource(uint32_t width, uint32_t height, uint32_t stride,
63                                       uint32_t size, uint32_t virglFormat, uint32_t target,
64                                       uint32_t bind) override;
65 
66     virtual VirtGpuResourcePtr importBlob(const struct VirtGpuExternalHandle& handle);
67     virtual int execBuffer(struct VirtGpuExecBuffer& execbuffer, const VirtGpuResource* blob);
68 
69    private:
70     int64_t mDeviceHandle;
71     struct VirtGpuCaps mCaps;
72 };
73