xref: /aosp_15_r20/external/mesa3d/src/gfxstream/guest/GoldfishAddressSpace/include/AddressSpaceStream.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright 2011 Google
3  * SPDX-License-Identifier: MIT
4  */
5 
6 #ifndef __ADDRESS_SPACE_STREAM_H
7 #define __ADDRESS_SPACE_STREAM_H
8 
9 #include "VirtGpu.h"
10 #include "address_space.h"
11 #include "address_space_graphics_types.h"
12 #include "gfxstream/guest/IOStream.h"
13 
14 using gfxstream::guest::IOStream;
15 
16 class AddressSpaceStream : public IOStream {
17 public:
18  explicit AddressSpaceStream(address_space_handle_t handle, uint32_t version,
19                              struct asg_context context, uint64_t ringOffset,
20                              uint64_t writeBufferOffset, struct address_space_ops ops);
21  ~AddressSpaceStream();
22 
23  virtual size_t idealAllocSize(size_t len);
24  virtual void* allocBuffer(size_t minSize);
25  virtual int commitBuffer(size_t size);
26  virtual const unsigned char* readFully(void* buf, size_t len);
27  virtual const unsigned char* read(void* buf, size_t* inout_len);
28  virtual int writeFully(const void* buf, size_t len);
29  virtual int writeFullyAsync(const void* buf, size_t len);
30  virtual const unsigned char* commitBufferAndReadFully(size_t size, void* buf, size_t len);
31 
setMapping(VirtGpuResourceMappingPtr mapping)32  void setMapping(VirtGpuResourceMappingPtr mapping) { m_mapping = mapping; }
33 
setResourceId(uint32_t id)34  void setResourceId(uint32_t id) { m_resourceId = id; }
35 
36 private:
37     bool isInError() const;
38     ssize_t speculativeRead(unsigned char* readBuffer, size_t trySize);
39     void notifyAvailable();
40     uint32_t getRelativeBufferPos(uint32_t pos);
41     void advanceWrite();
42     void ensureConsumerFinishing();
43     void ensureType1Finished();
44     void ensureType3Finished();
45     int type1Write(uint32_t offset, size_t size);
46 
47     void backoff();
48     void resetBackoff();
49 
50     VirtGpuResourceMappingPtr m_mapping = nullptr;
51     struct address_space_ops m_ops;
52 
53     unsigned char* m_tmpBuf;
54     size_t m_tmpBufSize;
55     size_t m_tmpBufXferSize;
56     bool m_usingTmpBuf;
57 
58     unsigned char* m_readBuf;
59     size_t m_read;
60     size_t m_readLeft;
61 
62     address_space_handle_t m_handle;
63     uint32_t m_version;
64     struct asg_context m_context;
65 
66     uint64_t m_ringOffset;
67     uint64_t m_writeBufferOffset;
68 
69     uint32_t m_writeBufferSize;
70     uint32_t m_writeBufferMask;
71     unsigned char* m_buf;
72     unsigned char* m_writeStart;
73     uint32_t m_writeStep;
74 
75     uint32_t m_notifs;
76     uint32_t m_written;
77 
78     uint64_t m_backoffIters;
79     uint64_t m_backoffFactor;
80 
81     size_t m_ringStorageSize;
82     uint32_t m_resourceId = 0;
83 };
84 
85 #endif
86