xref: /aosp_15_r20/external/mesa3d/src/gfxstream/guest/connection-manager/VirtioGpuPipeStream.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright 2018 Google LLC
3  * SPDX-License-Identifier: MIT
4  */
5 
6 #pragma once
7 
8 #include <stdlib.h>
9 
10 #include "VirtGpu.h"
11 #include "gfxstream/guest/IOStream.h"
12 
13 /* This file implements an IOStream that uses VIRTGPU TRANSFER* ioctls on a
14  * virtio-gpu DRM rendernode device to communicate with a goldfish-pipe
15  * service on the host side.
16  */
17 
18 class VirtioGpuPipeStream : public gfxstream::guest::IOStream {
19    public:
20     explicit VirtioGpuPipeStream(size_t bufsize, int32_t descriptor);
21     ~VirtioGpuPipeStream();
22 
23     virtual int connect(const char* serviceName = nullptr);
24     virtual uint64_t processPipeInit();
25 
26     virtual void* allocBuffer(size_t minSize);
27     virtual int commitBuffer(size_t size);
28     virtual const unsigned char* readFully(void* buf, size_t len);
29     virtual const unsigned char* commitBufferAndReadFully(size_t size, void* buf, size_t len);
30     virtual const unsigned char* read(void* buf, size_t* inout_len);
31 
32     bool valid();
33     int getRendernodeFd();
34     int recv(void* buf, size_t len);
35 
36     virtual int writeFully(const void* buf, size_t len);
37 
38    private:
39     // sync. Also resets the write position.
40     void wait();
41 
42     // transfer to/from host ops
43     ssize_t transferToHost(const void* buffer, size_t len);
44     ssize_t transferFromHost(void* buffer, size_t len);
45 
46     int32_t m_fd = -1;
47     std::unique_ptr<VirtGpuDevice> m_device;
48     VirtGpuResourcePtr m_resource;
49     VirtGpuResourceMappingPtr m_resourceMapping;
50     unsigned char* m_virtio_mapped;  // user mapping of bo
51 
52     // intermediate buffer
53     size_t m_bufsize;
54     unsigned char* m_buf;
55 
56     size_t m_writtenPos;
57 };
58