xref: /aosp_15_r20/external/mesa3d/src/gfxstream/guest/vulkan_enc/VulkanStreamGuest.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright 2018 Google LLC
3  * SPDX-License-Identifier: MIT
4  */
5 #pragma once
6 
7 #include <inttypes.h>
8 
9 #include <memory>
10 #include <vector>
11 
12 #include "ResourceTracker.h"
13 #include "VulkanHandleMapping.h"
14 #include "BumpPool.h"
15 #include "Stream.h"
16 #include "gfxstream/guest/IOStream.h"
17 #include "goldfish_vk_private_defs.h"
18 
19 namespace gfxstream {
20 namespace vk {
21 
22 class VulkanStreamGuest : public gfxstream::aemu::Stream {
23    public:
24     VulkanStreamGuest(gfxstream::guest::IOStream* stream);
25     ~VulkanStreamGuest();
26 
27     // Returns whether the connection is valid.
28     bool valid();
29 
30     // General allocation function
31     void alloc(void** ptrAddr, size_t bytes);
32 
33     // Utility functions to load strings or
34     // string arrays in place with allocation.
35     void loadStringInPlace(char** forOutput);
36     void loadStringArrayInPlace(char*** forOutput);
37 
38     // When we load a string and are using a reserved pointer.
39     void loadStringInPlaceWithStreamPtr(char** forOutput, uint8_t** streamPtr);
40     void loadStringArrayInPlaceWithStreamPtr(char*** forOutput, uint8_t** streamPtr);
41 
42     ssize_t read(void* buffer, size_t size) override;
43     ssize_t write(const void* buffer, size_t size) override;
44 
45     void writeLarge(const void* buffer, size_t size);
46 
47     // Frees everything that got alloc'ed.
48     void clearPool();
49 
50     void setHandleMapping(VulkanHandleMapping* mapping);
51     void unsetHandleMapping();
52     VulkanHandleMapping* handleMapping() const;
53 
54     void flush();
55 
56     uint32_t getFeatureBits() const;
57 
58     void incStreamRef();
59     bool decStreamRef();
60 
61     uint8_t* reserve(size_t size);
62 
63    private:
64     gfxstream::aemu::BumpPool mPool;
65     std::vector<uint8_t> mWriteBuffer;
66     gfxstream::guest::IOStream* mStream = nullptr;
67     DefaultHandleMapping mDefaultHandleMapping;
68     VulkanHandleMapping* mCurrentHandleMapping;
69     uint32_t mFeatureBits = 0;
70 };
71 
72 class VulkanCountingStream : public VulkanStreamGuest {
73    public:
74     VulkanCountingStream();
75     ~VulkanCountingStream();
76 
77     ssize_t read(void* buffer, size_t size) override;
78     ssize_t write(const void* buffer, size_t size) override;
79 
bytesWritten()80     size_t bytesWritten() const { return m_written; }
bytesRead()81     size_t bytesRead() const { return m_read; }
82 
83     void rewind();
84 
85    private:
86     size_t m_written = 0;
87     size_t m_read = 0;
88 };
89 
90 }  // namespace vk
91 }  // namespace gfxstream
92