xref: /aosp_15_r20/external/virglrenderer/src/venus/vkr_cs.h (revision bbecb9d118dfdb95f99bd754f8fa9be01f189df3)
1*bbecb9d1SAndroid Build Coastguard Worker /*
2*bbecb9d1SAndroid Build Coastguard Worker  * Copyright 2021 Google LLC
3*bbecb9d1SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*bbecb9d1SAndroid Build Coastguard Worker  */
5*bbecb9d1SAndroid Build Coastguard Worker 
6*bbecb9d1SAndroid Build Coastguard Worker #ifndef VKR_CS_H
7*bbecb9d1SAndroid Build Coastguard Worker #define VKR_CS_H
8*bbecb9d1SAndroid Build Coastguard Worker 
9*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_common.h"
10*bbecb9d1SAndroid Build Coastguard Worker 
11*bbecb9d1SAndroid Build Coastguard Worker /* This is to avoid integer overflows and to catch bogus allocations (e.g.,
12*bbecb9d1SAndroid Build Coastguard Worker  * the guest driver encodes an uninitialized value).  In practice, the largest
13*bbecb9d1SAndroid Build Coastguard Worker  * allocations we've seen are from vkGetPipelineCacheData and are dozens of
14*bbecb9d1SAndroid Build Coastguard Worker  * MBs.
15*bbecb9d1SAndroid Build Coastguard Worker  */
16*bbecb9d1SAndroid Build Coastguard Worker #define VKR_CS_DECODER_TEMP_POOL_MAX_SIZE (1u * 1024 * 1024 * 1024)
17*bbecb9d1SAndroid Build Coastguard Worker 
18*bbecb9d1SAndroid Build Coastguard Worker struct iovec;
19*bbecb9d1SAndroid Build Coastguard Worker 
20*bbecb9d1SAndroid Build Coastguard Worker struct vkr_cs_encoder {
21*bbecb9d1SAndroid Build Coastguard Worker    bool *fatal_error;
22*bbecb9d1SAndroid Build Coastguard Worker 
23*bbecb9d1SAndroid Build Coastguard Worker    struct {
24*bbecb9d1SAndroid Build Coastguard Worker       const struct vkr_resource_attachment *attachment;
25*bbecb9d1SAndroid Build Coastguard Worker       const struct iovec *iov;
26*bbecb9d1SAndroid Build Coastguard Worker       int iov_count;
27*bbecb9d1SAndroid Build Coastguard Worker       size_t offset;
28*bbecb9d1SAndroid Build Coastguard Worker       size_t size;
29*bbecb9d1SAndroid Build Coastguard Worker 
30*bbecb9d1SAndroid Build Coastguard Worker       int cached_index;
31*bbecb9d1SAndroid Build Coastguard Worker       size_t cached_offset;
32*bbecb9d1SAndroid Build Coastguard Worker    } stream;
33*bbecb9d1SAndroid Build Coastguard Worker 
34*bbecb9d1SAndroid Build Coastguard Worker    size_t remaining_size;
35*bbecb9d1SAndroid Build Coastguard Worker    int next_iov;
36*bbecb9d1SAndroid Build Coastguard Worker    uint8_t *cur;
37*bbecb9d1SAndroid Build Coastguard Worker    const uint8_t *end;
38*bbecb9d1SAndroid Build Coastguard Worker };
39*bbecb9d1SAndroid Build Coastguard Worker 
40*bbecb9d1SAndroid Build Coastguard Worker struct vkr_cs_decoder_saved_state {
41*bbecb9d1SAndroid Build Coastguard Worker    const uint8_t *cur;
42*bbecb9d1SAndroid Build Coastguard Worker    const uint8_t *end;
43*bbecb9d1SAndroid Build Coastguard Worker 
44*bbecb9d1SAndroid Build Coastguard Worker    uint32_t pool_buffer_count;
45*bbecb9d1SAndroid Build Coastguard Worker    uint8_t *pool_reset_to;
46*bbecb9d1SAndroid Build Coastguard Worker };
47*bbecb9d1SAndroid Build Coastguard Worker 
48*bbecb9d1SAndroid Build Coastguard Worker /*
49*bbecb9d1SAndroid Build Coastguard Worker  * We usually need many small allocations during decoding.  Those allocations
50*bbecb9d1SAndroid Build Coastguard Worker  * are suballocated from the temp pool.
51*bbecb9d1SAndroid Build Coastguard Worker  *
52*bbecb9d1SAndroid Build Coastguard Worker  * After a command is decoded, vkr_cs_decoder_reset_temp_pool is called to
53*bbecb9d1SAndroid Build Coastguard Worker  * reset pool->cur.  After an entire command stream is decoded,
54*bbecb9d1SAndroid Build Coastguard Worker  * vkr_cs_decoder_gc_temp_pool is called to garbage collect pool->buffers.
55*bbecb9d1SAndroid Build Coastguard Worker  */
56*bbecb9d1SAndroid Build Coastguard Worker struct vkr_cs_decoder_temp_pool {
57*bbecb9d1SAndroid Build Coastguard Worker    uint8_t **buffers;
58*bbecb9d1SAndroid Build Coastguard Worker    uint32_t buffer_count;
59*bbecb9d1SAndroid Build Coastguard Worker    uint32_t buffer_max;
60*bbecb9d1SAndroid Build Coastguard Worker    size_t total_size;
61*bbecb9d1SAndroid Build Coastguard Worker 
62*bbecb9d1SAndroid Build Coastguard Worker    uint8_t *reset_to;
63*bbecb9d1SAndroid Build Coastguard Worker 
64*bbecb9d1SAndroid Build Coastguard Worker    uint8_t *cur;
65*bbecb9d1SAndroid Build Coastguard Worker    const uint8_t *end;
66*bbecb9d1SAndroid Build Coastguard Worker };
67*bbecb9d1SAndroid Build Coastguard Worker 
68*bbecb9d1SAndroid Build Coastguard Worker struct vkr_cs_decoder {
69*bbecb9d1SAndroid Build Coastguard Worker    const struct hash_table *object_table;
70*bbecb9d1SAndroid Build Coastguard Worker 
71*bbecb9d1SAndroid Build Coastguard Worker    bool fatal_error;
72*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_cs_decoder_temp_pool temp_pool;
73*bbecb9d1SAndroid Build Coastguard Worker 
74*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_cs_decoder_saved_state saved_states[1];
75*bbecb9d1SAndroid Build Coastguard Worker    uint32_t saved_state_count;
76*bbecb9d1SAndroid Build Coastguard Worker 
77*bbecb9d1SAndroid Build Coastguard Worker    const uint8_t *cur;
78*bbecb9d1SAndroid Build Coastguard Worker    const uint8_t *end;
79*bbecb9d1SAndroid Build Coastguard Worker };
80*bbecb9d1SAndroid Build Coastguard Worker 
81*bbecb9d1SAndroid Build Coastguard Worker static inline void
vkr_cs_encoder_init(struct vkr_cs_encoder * enc,bool * fatal_error)82*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_encoder_init(struct vkr_cs_encoder *enc, bool *fatal_error)
83*bbecb9d1SAndroid Build Coastguard Worker {
84*bbecb9d1SAndroid Build Coastguard Worker    memset(enc, 0, sizeof(*enc));
85*bbecb9d1SAndroid Build Coastguard Worker    enc->fatal_error = fatal_error;
86*bbecb9d1SAndroid Build Coastguard Worker }
87*bbecb9d1SAndroid Build Coastguard Worker 
88*bbecb9d1SAndroid Build Coastguard Worker static inline void
vkr_cs_encoder_set_fatal(const struct vkr_cs_encoder * enc)89*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_encoder_set_fatal(const struct vkr_cs_encoder *enc)
90*bbecb9d1SAndroid Build Coastguard Worker {
91*bbecb9d1SAndroid Build Coastguard Worker    *enc->fatal_error = true;
92*bbecb9d1SAndroid Build Coastguard Worker }
93*bbecb9d1SAndroid Build Coastguard Worker 
94*bbecb9d1SAndroid Build Coastguard Worker void
95*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_encoder_set_stream(struct vkr_cs_encoder *enc,
96*bbecb9d1SAndroid Build Coastguard Worker                           const struct vkr_resource_attachment *att,
97*bbecb9d1SAndroid Build Coastguard Worker                           size_t offset,
98*bbecb9d1SAndroid Build Coastguard Worker                           size_t size);
99*bbecb9d1SAndroid Build Coastguard Worker 
100*bbecb9d1SAndroid Build Coastguard Worker void
101*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_encoder_seek_stream(struct vkr_cs_encoder *enc, size_t pos);
102*bbecb9d1SAndroid Build Coastguard Worker 
103*bbecb9d1SAndroid Build Coastguard Worker void
104*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_encoder_write_internal(struct vkr_cs_encoder *enc,
105*bbecb9d1SAndroid Build Coastguard Worker                               size_t size,
106*bbecb9d1SAndroid Build Coastguard Worker                               const void *val,
107*bbecb9d1SAndroid Build Coastguard Worker                               size_t val_size);
108*bbecb9d1SAndroid Build Coastguard Worker 
109*bbecb9d1SAndroid Build Coastguard Worker static inline void
vkr_cs_encoder_write(struct vkr_cs_encoder * enc,size_t size,const void * val,size_t val_size)110*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_encoder_write(struct vkr_cs_encoder *enc,
111*bbecb9d1SAndroid Build Coastguard Worker                      size_t size,
112*bbecb9d1SAndroid Build Coastguard Worker                      const void *val,
113*bbecb9d1SAndroid Build Coastguard Worker                      size_t val_size)
114*bbecb9d1SAndroid Build Coastguard Worker {
115*bbecb9d1SAndroid Build Coastguard Worker    assert(val_size <= size);
116*bbecb9d1SAndroid Build Coastguard Worker 
117*bbecb9d1SAndroid Build Coastguard Worker    if (unlikely(size > (size_t)(enc->end - enc->cur))) {
118*bbecb9d1SAndroid Build Coastguard Worker       vkr_cs_encoder_write_internal(enc, size, val, val_size);
119*bbecb9d1SAndroid Build Coastguard Worker       return;
120*bbecb9d1SAndroid Build Coastguard Worker    }
121*bbecb9d1SAndroid Build Coastguard Worker 
122*bbecb9d1SAndroid Build Coastguard Worker    /* we should not rely on the compiler to optimize away memcpy... */
123*bbecb9d1SAndroid Build Coastguard Worker    memcpy(enc->cur, val, val_size);
124*bbecb9d1SAndroid Build Coastguard Worker    enc->cur += size;
125*bbecb9d1SAndroid Build Coastguard Worker }
126*bbecb9d1SAndroid Build Coastguard Worker 
127*bbecb9d1SAndroid Build Coastguard Worker void
128*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_init(struct vkr_cs_decoder *dec, const struct hash_table *object_table);
129*bbecb9d1SAndroid Build Coastguard Worker 
130*bbecb9d1SAndroid Build Coastguard Worker void
131*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_fini(struct vkr_cs_decoder *dec);
132*bbecb9d1SAndroid Build Coastguard Worker 
133*bbecb9d1SAndroid Build Coastguard Worker void
134*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_reset(struct vkr_cs_decoder *dec);
135*bbecb9d1SAndroid Build Coastguard Worker 
136*bbecb9d1SAndroid Build Coastguard Worker static inline void
vkr_cs_decoder_set_fatal(const struct vkr_cs_decoder * dec)137*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_set_fatal(const struct vkr_cs_decoder *dec)
138*bbecb9d1SAndroid Build Coastguard Worker {
139*bbecb9d1SAndroid Build Coastguard Worker    ((struct vkr_cs_decoder *)dec)->fatal_error = true;
140*bbecb9d1SAndroid Build Coastguard Worker }
141*bbecb9d1SAndroid Build Coastguard Worker 
142*bbecb9d1SAndroid Build Coastguard Worker static inline bool
vkr_cs_decoder_get_fatal(const struct vkr_cs_decoder * dec)143*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_get_fatal(const struct vkr_cs_decoder *dec)
144*bbecb9d1SAndroid Build Coastguard Worker {
145*bbecb9d1SAndroid Build Coastguard Worker    return dec->fatal_error;
146*bbecb9d1SAndroid Build Coastguard Worker }
147*bbecb9d1SAndroid Build Coastguard Worker 
148*bbecb9d1SAndroid Build Coastguard Worker static inline void
vkr_cs_decoder_set_stream(struct vkr_cs_decoder * dec,const void * data,size_t size)149*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_set_stream(struct vkr_cs_decoder *dec, const void *data, size_t size)
150*bbecb9d1SAndroid Build Coastguard Worker {
151*bbecb9d1SAndroid Build Coastguard Worker    dec->cur = data;
152*bbecb9d1SAndroid Build Coastguard Worker    dec->end = dec->cur + size;
153*bbecb9d1SAndroid Build Coastguard Worker }
154*bbecb9d1SAndroid Build Coastguard Worker 
155*bbecb9d1SAndroid Build Coastguard Worker static inline bool
vkr_cs_decoder_has_command(const struct vkr_cs_decoder * dec)156*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_has_command(const struct vkr_cs_decoder *dec)
157*bbecb9d1SAndroid Build Coastguard Worker {
158*bbecb9d1SAndroid Build Coastguard Worker    return dec->cur < dec->end;
159*bbecb9d1SAndroid Build Coastguard Worker }
160*bbecb9d1SAndroid Build Coastguard Worker 
161*bbecb9d1SAndroid Build Coastguard Worker bool
162*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_push_state(struct vkr_cs_decoder *dec);
163*bbecb9d1SAndroid Build Coastguard Worker 
164*bbecb9d1SAndroid Build Coastguard Worker void
165*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_pop_state(struct vkr_cs_decoder *dec);
166*bbecb9d1SAndroid Build Coastguard Worker 
167*bbecb9d1SAndroid Build Coastguard Worker static inline bool
vkr_cs_decoder_peek_internal(const struct vkr_cs_decoder * dec,size_t size,void * val,size_t val_size)168*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_peek_internal(const struct vkr_cs_decoder *dec,
169*bbecb9d1SAndroid Build Coastguard Worker                              size_t size,
170*bbecb9d1SAndroid Build Coastguard Worker                              void *val,
171*bbecb9d1SAndroid Build Coastguard Worker                              size_t val_size)
172*bbecb9d1SAndroid Build Coastguard Worker {
173*bbecb9d1SAndroid Build Coastguard Worker    assert(val_size <= size);
174*bbecb9d1SAndroid Build Coastguard Worker 
175*bbecb9d1SAndroid Build Coastguard Worker    if (unlikely(size > (size_t)(dec->end - dec->cur))) {
176*bbecb9d1SAndroid Build Coastguard Worker       vkr_log("failed to peek %zu bytes", size);
177*bbecb9d1SAndroid Build Coastguard Worker       vkr_cs_decoder_set_fatal(dec);
178*bbecb9d1SAndroid Build Coastguard Worker       memset(val, 0, val_size);
179*bbecb9d1SAndroid Build Coastguard Worker       return false;
180*bbecb9d1SAndroid Build Coastguard Worker    }
181*bbecb9d1SAndroid Build Coastguard Worker 
182*bbecb9d1SAndroid Build Coastguard Worker    /* we should not rely on the compiler to optimize away memcpy... */
183*bbecb9d1SAndroid Build Coastguard Worker    memcpy(val, dec->cur, val_size);
184*bbecb9d1SAndroid Build Coastguard Worker    return true;
185*bbecb9d1SAndroid Build Coastguard Worker }
186*bbecb9d1SAndroid Build Coastguard Worker 
187*bbecb9d1SAndroid Build Coastguard Worker static inline void
vkr_cs_decoder_read(struct vkr_cs_decoder * dec,size_t size,void * val,size_t val_size)188*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_read(struct vkr_cs_decoder *dec, size_t size, void *val, size_t val_size)
189*bbecb9d1SAndroid Build Coastguard Worker {
190*bbecb9d1SAndroid Build Coastguard Worker    if (vkr_cs_decoder_peek_internal(dec, size, val, val_size))
191*bbecb9d1SAndroid Build Coastguard Worker       dec->cur += size;
192*bbecb9d1SAndroid Build Coastguard Worker }
193*bbecb9d1SAndroid Build Coastguard Worker 
194*bbecb9d1SAndroid Build Coastguard Worker static inline void
vkr_cs_decoder_peek(const struct vkr_cs_decoder * dec,size_t size,void * val,size_t val_size)195*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_peek(const struct vkr_cs_decoder *dec,
196*bbecb9d1SAndroid Build Coastguard Worker                     size_t size,
197*bbecb9d1SAndroid Build Coastguard Worker                     void *val,
198*bbecb9d1SAndroid Build Coastguard Worker                     size_t val_size)
199*bbecb9d1SAndroid Build Coastguard Worker {
200*bbecb9d1SAndroid Build Coastguard Worker    vkr_cs_decoder_peek_internal(dec, size, val, val_size);
201*bbecb9d1SAndroid Build Coastguard Worker }
202*bbecb9d1SAndroid Build Coastguard Worker 
203*bbecb9d1SAndroid Build Coastguard Worker static inline struct vkr_object *
vkr_cs_decoder_lookup_object(const struct vkr_cs_decoder * dec,vkr_object_id id,VkObjectType type)204*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_lookup_object(const struct vkr_cs_decoder *dec,
205*bbecb9d1SAndroid Build Coastguard Worker                              vkr_object_id id,
206*bbecb9d1SAndroid Build Coastguard Worker                              VkObjectType type)
207*bbecb9d1SAndroid Build Coastguard Worker {
208*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_object *obj;
209*bbecb9d1SAndroid Build Coastguard Worker 
210*bbecb9d1SAndroid Build Coastguard Worker    if (!id)
211*bbecb9d1SAndroid Build Coastguard Worker       return NULL;
212*bbecb9d1SAndroid Build Coastguard Worker 
213*bbecb9d1SAndroid Build Coastguard Worker    const struct hash_entry *entry =
214*bbecb9d1SAndroid Build Coastguard Worker       _mesa_hash_table_search((struct hash_table *)dec->object_table, &id);
215*bbecb9d1SAndroid Build Coastguard Worker    obj = likely(entry) ? entry->data : NULL;
216*bbecb9d1SAndroid Build Coastguard Worker    if (unlikely(!obj || obj->type != type)) {
217*bbecb9d1SAndroid Build Coastguard Worker       if (obj)
218*bbecb9d1SAndroid Build Coastguard Worker          vkr_log("object %" PRIu64 " has type %d, not %d", id, obj->type, type);
219*bbecb9d1SAndroid Build Coastguard Worker       else
220*bbecb9d1SAndroid Build Coastguard Worker          vkr_log("failed to look up object %" PRIu64, id);
221*bbecb9d1SAndroid Build Coastguard Worker       vkr_cs_decoder_set_fatal(dec);
222*bbecb9d1SAndroid Build Coastguard Worker    }
223*bbecb9d1SAndroid Build Coastguard Worker 
224*bbecb9d1SAndroid Build Coastguard Worker    return obj;
225*bbecb9d1SAndroid Build Coastguard Worker }
226*bbecb9d1SAndroid Build Coastguard Worker 
227*bbecb9d1SAndroid Build Coastguard Worker static inline void
vkr_cs_decoder_reset_temp_pool(struct vkr_cs_decoder * dec)228*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_reset_temp_pool(struct vkr_cs_decoder *dec)
229*bbecb9d1SAndroid Build Coastguard Worker {
230*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_cs_decoder_temp_pool *pool = &dec->temp_pool;
231*bbecb9d1SAndroid Build Coastguard Worker    pool->cur = pool->reset_to;
232*bbecb9d1SAndroid Build Coastguard Worker }
233*bbecb9d1SAndroid Build Coastguard Worker 
234*bbecb9d1SAndroid Build Coastguard Worker bool
235*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_alloc_temp_internal(struct vkr_cs_decoder *dec, size_t size);
236*bbecb9d1SAndroid Build Coastguard Worker 
237*bbecb9d1SAndroid Build Coastguard Worker static inline void *
vkr_cs_decoder_alloc_temp(struct vkr_cs_decoder * dec,size_t size)238*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_alloc_temp(struct vkr_cs_decoder *dec, size_t size)
239*bbecb9d1SAndroid Build Coastguard Worker {
240*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_cs_decoder_temp_pool *pool = &dec->temp_pool;
241*bbecb9d1SAndroid Build Coastguard Worker 
242*bbecb9d1SAndroid Build Coastguard Worker    if (unlikely(size > (size_t)(pool->end - pool->cur))) {
243*bbecb9d1SAndroid Build Coastguard Worker       if (!vkr_cs_decoder_alloc_temp_internal(dec, size)) {
244*bbecb9d1SAndroid Build Coastguard Worker          vkr_log("failed to suballocate %zu bytes from the temp pool", size);
245*bbecb9d1SAndroid Build Coastguard Worker          vkr_cs_decoder_set_fatal(dec);
246*bbecb9d1SAndroid Build Coastguard Worker          return NULL;
247*bbecb9d1SAndroid Build Coastguard Worker       }
248*bbecb9d1SAndroid Build Coastguard Worker    }
249*bbecb9d1SAndroid Build Coastguard Worker 
250*bbecb9d1SAndroid Build Coastguard Worker    /* align to 64-bit after we know size is at most
251*bbecb9d1SAndroid Build Coastguard Worker     * VKR_CS_DECODER_TEMP_POOL_MAX_SIZE and cannot overflow
252*bbecb9d1SAndroid Build Coastguard Worker     */
253*bbecb9d1SAndroid Build Coastguard Worker    size = align64(size, 8);
254*bbecb9d1SAndroid Build Coastguard Worker    assert(size <= (size_t)(pool->end - pool->cur));
255*bbecb9d1SAndroid Build Coastguard Worker 
256*bbecb9d1SAndroid Build Coastguard Worker    void *ptr = pool->cur;
257*bbecb9d1SAndroid Build Coastguard Worker    pool->cur += size;
258*bbecb9d1SAndroid Build Coastguard Worker    return ptr;
259*bbecb9d1SAndroid Build Coastguard Worker }
260*bbecb9d1SAndroid Build Coastguard Worker 
261*bbecb9d1SAndroid Build Coastguard Worker static inline bool
vkr_cs_handle_indirect_id(VkObjectType type)262*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_handle_indirect_id(VkObjectType type)
263*bbecb9d1SAndroid Build Coastguard Worker {
264*bbecb9d1SAndroid Build Coastguard Worker    /* Dispatchable handles may or may not have enough bits to store
265*bbecb9d1SAndroid Build Coastguard Worker     * vkr_object_id.  Non-dispatchable handles always have enough bits to
266*bbecb9d1SAndroid Build Coastguard Worker     * store vkr_object_id.
267*bbecb9d1SAndroid Build Coastguard Worker     *
268*bbecb9d1SAndroid Build Coastguard Worker     * This should compile to a constant after inlining.
269*bbecb9d1SAndroid Build Coastguard Worker     */
270*bbecb9d1SAndroid Build Coastguard Worker    switch (type) {
271*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_INSTANCE:
272*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_PHYSICAL_DEVICE:
273*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_DEVICE:
274*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_QUEUE:
275*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_COMMAND_BUFFER:
276*bbecb9d1SAndroid Build Coastguard Worker       return sizeof(VkInstance) < sizeof(vkr_object_id);
277*bbecb9d1SAndroid Build Coastguard Worker    default:
278*bbecb9d1SAndroid Build Coastguard Worker       return false;
279*bbecb9d1SAndroid Build Coastguard Worker    }
280*bbecb9d1SAndroid Build Coastguard Worker }
281*bbecb9d1SAndroid Build Coastguard Worker 
282*bbecb9d1SAndroid Build Coastguard Worker static inline vkr_object_id
vkr_cs_handle_load_id(const void ** handle,VkObjectType type)283*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_handle_load_id(const void **handle, VkObjectType type)
284*bbecb9d1SAndroid Build Coastguard Worker {
285*bbecb9d1SAndroid Build Coastguard Worker    const vkr_object_id *p = vkr_cs_handle_indirect_id(type)
286*bbecb9d1SAndroid Build Coastguard Worker                                ? *(const vkr_object_id **)handle
287*bbecb9d1SAndroid Build Coastguard Worker                                : (const vkr_object_id *)handle;
288*bbecb9d1SAndroid Build Coastguard Worker    return *p;
289*bbecb9d1SAndroid Build Coastguard Worker }
290*bbecb9d1SAndroid Build Coastguard Worker 
291*bbecb9d1SAndroid Build Coastguard Worker static inline void
vkr_cs_handle_store_id(void ** handle,vkr_object_id id,VkObjectType type)292*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_handle_store_id(void **handle, vkr_object_id id, VkObjectType type)
293*bbecb9d1SAndroid Build Coastguard Worker {
294*bbecb9d1SAndroid Build Coastguard Worker    vkr_object_id *p = vkr_cs_handle_indirect_id(type) ? *(vkr_object_id **)handle
295*bbecb9d1SAndroid Build Coastguard Worker                                                       : (vkr_object_id *)handle;
296*bbecb9d1SAndroid Build Coastguard Worker    *p = id;
297*bbecb9d1SAndroid Build Coastguard Worker }
298*bbecb9d1SAndroid Build Coastguard Worker 
299*bbecb9d1SAndroid Build Coastguard Worker #endif /* VKR_CS_H */
300