Skip to content

Commit 3270cf9

Browse files
committed
virtgpu: use venus CS functions
1 parent 847a2ad commit 3270cf9

File tree

2 files changed

+343
-29
lines changed

2 files changed

+343
-29
lines changed
Lines changed: 298 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,298 @@
1+
#pragma once
2+
#include "virtgpu.h"
3+
4+
struct vn_cs_encoder {
5+
char* cur;
6+
const char* end;
7+
};
8+
9+
struct vn_cs_decoder {
10+
const char* cur;
11+
const char* end;
12+
};
13+
14+
/*
15+
* encode peek
16+
*/
17+
18+
static inline bool
19+
vn_cs_decoder_peek_internal(const struct vn_cs_decoder *dec,
20+
size_t size,
21+
void *val,
22+
size_t val_size)
23+
{
24+
assert(val_size <= size);
25+
26+
if (unlikely(size > (size_t) (dec->end - dec->cur))) {
27+
FATAL("DECODER IS FULL :/");
28+
//vn_cs_decoder_set_fatal(dec);
29+
memset(val, 0, val_size);
30+
return false;
31+
}
32+
33+
/* we should not rely on the compiler to optimize away memcpy... */
34+
memcpy(val, dec->cur, val_size);
35+
return true;
36+
}
37+
38+
static inline void
39+
vn_cs_decoder_peek(const struct vn_cs_decoder *dec,
40+
size_t size,
41+
void *val,
42+
size_t val_size)
43+
{
44+
vn_cs_decoder_peek_internal(dec, size, val, val_size);
45+
}
46+
47+
/*
48+
* read/write
49+
*/
50+
51+
static inline void
52+
vn_cs_decoder_read(struct vn_cs_decoder *dec,
53+
size_t size,
54+
void *val,
55+
size_t val_size)
56+
{
57+
if (vn_cs_decoder_peek_internal(dec, size, val, val_size))
58+
dec->cur += size;
59+
}
60+
61+
static inline void
62+
vn_cs_encoder_write(struct vn_cs_encoder *enc,
63+
size_t size,
64+
const void *val,
65+
size_t val_size)
66+
{
67+
assert(val_size <= size);
68+
assert(size <= ((size_t) (enc->end - enc->cur)));
69+
70+
/* we should not rely on the compiler to optimize away memcpy... */
71+
memcpy(enc->cur, val, val_size);
72+
enc->cur += size;
73+
}
74+
75+
/*
76+
* encode/decode
77+
*/
78+
79+
static inline void
80+
vn_decode(struct vn_cs_decoder *dec, size_t size, void *data, size_t data_size)
81+
{
82+
assert(size % 4 == 0);
83+
vn_cs_decoder_read(dec, size, data, data_size);
84+
}
85+
86+
static inline void
87+
vn_encode(struct vn_cs_encoder *enc, size_t size, const void *data, size_t data_size)
88+
{
89+
assert(size % 4 == 0);
90+
/* TODO check if the generated code is optimal */
91+
vn_cs_encoder_write(enc, size, data, data_size);
92+
}
93+
94+
/*
95+
* typed encode/decode
96+
*/
97+
98+
/* uint64_t */
99+
100+
static inline size_t
101+
vn_sizeof_uint64_t(const uint64_t *val)
102+
{
103+
assert(sizeof(*val) == 8);
104+
return 8;
105+
}
106+
107+
static inline void
108+
vn_encode_uint64_t(struct vn_cs_encoder *enc, const uint64_t *val)
109+
{
110+
vn_encode(enc, 8, val, sizeof(*val));
111+
}
112+
113+
static inline void
114+
vn_decode_uint64_t(struct vn_cs_decoder *dec, uint64_t *val)
115+
{
116+
vn_decode(dec, 8, val, sizeof(*val));
117+
}
118+
119+
static inline size_t
120+
vn_sizeof_uint64_t_array(const uint64_t *val, uint32_t count)
121+
{
122+
assert(sizeof(*val) == 8);
123+
const size_t size = sizeof(*val) * count;
124+
assert(size >= count);
125+
return size;
126+
}
127+
128+
static inline void
129+
vn_encode_uint64_t_array(struct vn_cs_encoder *enc, const uint64_t *val, uint32_t count)
130+
{
131+
const size_t size = sizeof(*val) * count;
132+
assert(size >= count);
133+
vn_encode(enc, size, val, size);
134+
}
135+
136+
static inline void
137+
vn_decode_uint64_t_array(struct vn_cs_decoder *dec, uint64_t *val, uint32_t count)
138+
{
139+
const size_t size = sizeof(*val) * count;
140+
assert(size >= count);
141+
vn_decode(dec, size, val, size);
142+
}
143+
144+
/* int32_t */
145+
146+
static inline size_t
147+
vn_sizeof_int32_t(const int32_t *val)
148+
{
149+
assert(sizeof(*val) == 4);
150+
return 4;
151+
}
152+
153+
static inline void
154+
vn_encode_int32_t(struct vn_cs_encoder *enc, const int32_t *val)
155+
{
156+
vn_encode(enc, 4, val, sizeof(*val));
157+
}
158+
159+
static inline void
160+
vn_decode_int32_t(struct vn_cs_decoder *dec, int32_t *val)
161+
{
162+
vn_decode(dec, 4, val, sizeof(*val));
163+
}
164+
165+
static inline size_t
166+
vn_sizeof_int32_t_array(const int32_t *val, uint32_t count)
167+
{
168+
assert(sizeof(*val) == 4);
169+
const size_t size = sizeof(*val) * count;
170+
assert(size >= count);
171+
return size;
172+
}
173+
174+
static inline void
175+
vn_encode_int32_t_array(struct vn_cs_encoder *enc, const int32_t *val, uint32_t count)
176+
{
177+
const size_t size = sizeof(*val) * count;
178+
assert(size >= count);
179+
vn_encode(enc, size, val, size);
180+
}
181+
182+
static inline void
183+
vn_decode_int32_t_array(struct vn_cs_decoder *dec, int32_t *val, uint32_t count)
184+
{
185+
const size_t size = sizeof(*val) * count;
186+
assert(size >= count);
187+
vn_decode(dec, size, val, size);
188+
}
189+
190+
/* array size (uint64_t) */
191+
192+
static inline size_t
193+
vn_sizeof_array_size(uint64_t size)
194+
{
195+
return vn_sizeof_uint64_t(&size);
196+
}
197+
198+
static inline void
199+
vn_encode_array_size(struct vn_cs_encoder *enc, uint64_t size)
200+
{
201+
vn_encode_uint64_t(enc, &size);
202+
}
203+
204+
static inline uint64_t
205+
vn_decode_array_size(struct vn_cs_decoder *dec, uint64_t expected_size)
206+
{
207+
uint64_t size;
208+
vn_decode_uint64_t(dec, &size);
209+
if (size != expected_size) {
210+
FATAL("ENCODER IS FULL :/");
211+
//vn_cs_decoder_set_fatal(dec);
212+
size = 0;
213+
}
214+
return size;
215+
}
216+
217+
static inline uint64_t
218+
vn_decode_array_size_unchecked(struct vn_cs_decoder *dec)
219+
{
220+
uint64_t size;
221+
vn_decode_uint64_t(dec, &size);
222+
return size;
223+
}
224+
225+
static inline uint64_t
226+
vn_peek_array_size(struct vn_cs_decoder *dec)
227+
{
228+
uint64_t size;
229+
vn_cs_decoder_peek(dec, sizeof(size), &size, sizeof(size));
230+
return size;
231+
}
232+
233+
/* non-array pointer */
234+
235+
static inline size_t
236+
vn_sizeof_simple_pointer(const void *val)
237+
{
238+
return vn_sizeof_array_size(val ? 1 : 0);
239+
}
240+
241+
static inline bool
242+
vn_encode_simple_pointer(struct vn_cs_encoder *enc, const void *val)
243+
{
244+
vn_encode_array_size(enc, val ? 1 : 0);
245+
return val;
246+
}
247+
248+
static inline bool
249+
vn_decode_simple_pointer(struct vn_cs_decoder *dec)
250+
{
251+
return vn_decode_array_size_unchecked(dec);
252+
}
253+
254+
/* uint32_t */
255+
256+
static inline size_t
257+
vn_sizeof_uint32_t(const uint32_t *val)
258+
{
259+
assert(sizeof(*val) == 4);
260+
return 4;
261+
}
262+
263+
static inline void
264+
vn_encode_uint32_t(struct vn_cs_encoder *enc, const uint32_t *val)
265+
{
266+
vn_encode(enc, 4, val, sizeof(*val));
267+
}
268+
269+
static inline void
270+
vn_decode_uint32_t(struct vn_cs_decoder *dec, uint32_t *val)
271+
{
272+
vn_decode(dec, 4, val, sizeof(*val));
273+
}
274+
275+
static inline size_t
276+
vn_sizeof_uint32_t_array(const uint32_t *val, uint32_t count)
277+
{
278+
assert(sizeof(*val) == 4);
279+
const size_t size = sizeof(*val) * count;
280+
assert(size >= count);
281+
return size;
282+
}
283+
284+
static inline void
285+
vn_encode_uint32_t_array(struct vn_cs_encoder *enc, const uint32_t *val, uint32_t count)
286+
{
287+
const size_t size = sizeof(*val) * count;
288+
assert(size >= count);
289+
vn_encode(enc, size, val, size);
290+
}
291+
292+
static inline void
293+
vn_decode_uint32_t_array(struct vn_cs_decoder *dec, uint32_t *val, uint32_t count)
294+
{
295+
const size_t size = sizeof(*val) * count;
296+
assert(size >= count);
297+
vn_decode(dec, size, val, size);
298+
}

0 commit comments

Comments
 (0)