xref: /aosp_15_r20/external/mesa3d/src/gfxstream/aemu/include/Stream.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2019 Google
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker #pragma once
7*61046927SAndroid Build Coastguard Worker 
8*61046927SAndroid Build Coastguard Worker #include <inttypes.h>
9*61046927SAndroid Build Coastguard Worker #include <sys/types.h>
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker #include <string>
12*61046927SAndroid Build Coastguard Worker 
13*61046927SAndroid Build Coastguard Worker namespace gfxstream {
14*61046927SAndroid Build Coastguard Worker namespace aemu {
15*61046927SAndroid Build Coastguard Worker 
16*61046927SAndroid Build Coastguard Worker // Abstract interface to byte streams of all kind.
17*61046927SAndroid Build Coastguard Worker // This is mainly used to implement disk serialization.
18*61046927SAndroid Build Coastguard Worker class Stream {
19*61046927SAndroid Build Coastguard Worker    public:
20*61046927SAndroid Build Coastguard Worker     // Default constructor.
21*61046927SAndroid Build Coastguard Worker     Stream() = default;
22*61046927SAndroid Build Coastguard Worker 
23*61046927SAndroid Build Coastguard Worker     // Destructor.
24*61046927SAndroid Build Coastguard Worker     virtual ~Stream() = default;
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker     // Read up to |size| bytes and copy them to |buffer|. Return the number
27*61046927SAndroid Build Coastguard Worker     // of bytes that were actually transferred, or -errno value on error.
28*61046927SAndroid Build Coastguard Worker     virtual ssize_t read(void* buffer, size_t size) = 0;
29*61046927SAndroid Build Coastguard Worker 
30*61046927SAndroid Build Coastguard Worker     // Write up to |size| bytes from |buffer| into the stream. Return the
31*61046927SAndroid Build Coastguard Worker     // number of bytes that were actually transferred, or -errno value on
32*61046927SAndroid Build Coastguard Worker     // error.
33*61046927SAndroid Build Coastguard Worker     virtual ssize_t write(const void* buffer, size_t size) = 0;
34*61046927SAndroid Build Coastguard Worker 
getProtobuf()35*61046927SAndroid Build Coastguard Worker     virtual void* getProtobuf() { return nullptr; }
36*61046927SAndroid Build Coastguard Worker 
37*61046927SAndroid Build Coastguard Worker     // Write a single byte |value| into the stream. Ignore errors.
38*61046927SAndroid Build Coastguard Worker     void putByte(uint8_t value);
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker     // Write a 16-bit |value| as big-endian into the stream. Ignore errors.
41*61046927SAndroid Build Coastguard Worker     void putBe16(uint16_t value);
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker     // Write a 32-bit |value| as big-endian into the stream. Ignore errors.
44*61046927SAndroid Build Coastguard Worker     void putBe32(uint32_t value);
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker     // Write a 64-bit |value| as big-endian into the stream. Ignore errors.
47*61046927SAndroid Build Coastguard Worker     void putBe64(uint64_t value);
48*61046927SAndroid Build Coastguard Worker 
49*61046927SAndroid Build Coastguard Worker     // Read a single byte from the stream. Return 0 on error.
50*61046927SAndroid Build Coastguard Worker     uint8_t getByte();
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker     // Read a single big-endian 16-bit value from the stream.
53*61046927SAndroid Build Coastguard Worker     // Return 0 on error.
54*61046927SAndroid Build Coastguard Worker     uint16_t getBe16();
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker     // Read a single big-endian 32-bit value from the stream.
57*61046927SAndroid Build Coastguard Worker     // Return 0 on error.
58*61046927SAndroid Build Coastguard Worker     uint32_t getBe32();
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker     // Read a single big-endian 64-bit value from the stream.
61*61046927SAndroid Build Coastguard Worker     // Return 0 on error.
62*61046927SAndroid Build Coastguard Worker     uint64_t getBe64();
63*61046927SAndroid Build Coastguard Worker 
64*61046927SAndroid Build Coastguard Worker     // Write a 32-bit float |value| to the stream.
65*61046927SAndroid Build Coastguard Worker     void putFloat(float value);
66*61046927SAndroid Build Coastguard Worker 
67*61046927SAndroid Build Coastguard Worker     // Read a single 32-bit float value from the stream.
68*61046927SAndroid Build Coastguard Worker     float getFloat();
69*61046927SAndroid Build Coastguard Worker 
70*61046927SAndroid Build Coastguard Worker     // Write a 0-terminated C string |str| into the stream. Ignore error.
71*61046927SAndroid Build Coastguard Worker     void putString(const char* str);
72*61046927SAndroid Build Coastguard Worker     void putString(const std::string& str);
73*61046927SAndroid Build Coastguard Worker 
74*61046927SAndroid Build Coastguard Worker     // Write a string |str| of |strlen| bytes into the stream.
75*61046927SAndroid Build Coastguard Worker     // Ignore errors.
76*61046927SAndroid Build Coastguard Worker     void putString(const char* str, size_t strlen);
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker     // Read a string from the stream. Return a new string instance,
79*61046927SAndroid Build Coastguard Worker     // which will be empty on error. Note that this can only be used
80*61046927SAndroid Build Coastguard Worker     // to read strings that were written with putString().
81*61046927SAndroid Build Coastguard Worker     std::string getString();
82*61046927SAndroid Build Coastguard Worker 
83*61046927SAndroid Build Coastguard Worker     // Put/gen an integer number into the stream, making it use as little space
84*61046927SAndroid Build Coastguard Worker     // there as possible.
85*61046927SAndroid Build Coastguard Worker     // It uses a simple byte-by-byte encoding scheme, putting 7 bits of the
86*61046927SAndroid Build Coastguard Worker     // number with the 8th bit set when there's more data to read, until the
87*61046927SAndroid Build Coastguard Worker     // whole number is read.
88*61046927SAndroid Build Coastguard Worker     // The compression is efficient if the number range is small, but it starts
89*61046927SAndroid Build Coastguard Worker     // wasting space when values approach 14 bits for int16 (16K), 28 bits for
90*61046927SAndroid Build Coastguard Worker     // int32 (268M) or 56 bits for int64 (still a lot).
91*61046927SAndroid Build Coastguard Worker     void putPackedNum(uint64_t num);
92*61046927SAndroid Build Coastguard Worker     uint64_t getPackedNum();
93*61046927SAndroid Build Coastguard Worker 
94*61046927SAndroid Build Coastguard Worker     // Same thing, but encode negative numbers efficiently as well (single sign
95*61046927SAndroid Build Coastguard Worker     // bit + packed unsigned representation)
96*61046927SAndroid Build Coastguard Worker     void putPackedSignedNum(int64_t num);
97*61046927SAndroid Build Coastguard Worker     int64_t getPackedSignedNum();
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker     // Static big-endian conversions
100*61046927SAndroid Build Coastguard Worker     static void toByte(uint8_t*);
101*61046927SAndroid Build Coastguard Worker     static void toBe16(uint8_t*);
102*61046927SAndroid Build Coastguard Worker     static void toBe32(uint8_t*);
103*61046927SAndroid Build Coastguard Worker     static void toBe64(uint8_t*);
104*61046927SAndroid Build Coastguard Worker     static void fromByte(uint8_t*);
105*61046927SAndroid Build Coastguard Worker     static void fromBe16(uint8_t*);
106*61046927SAndroid Build Coastguard Worker     static void fromBe32(uint8_t*);
107*61046927SAndroid Build Coastguard Worker     static void fromBe64(uint8_t*);
108*61046927SAndroid Build Coastguard Worker };
109*61046927SAndroid Build Coastguard Worker 
110*61046927SAndroid Build Coastguard Worker void saveStringArray(Stream* stream, const char* const* strings, uint32_t count);
111*61046927SAndroid Build Coastguard Worker 
112*61046927SAndroid Build Coastguard Worker }  // namespace aemu
113*61046927SAndroid Build Coastguard Worker }  // namespace gfxstream
114