xref: /aosp_15_r20/external/mesa3d/src/virtio/vulkan/vn_cs.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2019 Google LLC
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker #include "vn_cs.h"
7*61046927SAndroid Build Coastguard Worker 
8*61046927SAndroid Build Coastguard Worker #include "vn_instance.h"
9*61046927SAndroid Build Coastguard Worker #include "vn_renderer.h"
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker struct vn_cs_renderer_protocol_info _vn_cs_renderer_protocol_info = {
12*61046927SAndroid Build Coastguard Worker    .mutex = SIMPLE_MTX_INITIALIZER,
13*61046927SAndroid Build Coastguard Worker };
14*61046927SAndroid Build Coastguard Worker 
15*61046927SAndroid Build Coastguard Worker static void
vn_cs_renderer_protocol_info_init_once(struct vn_instance * instance)16*61046927SAndroid Build Coastguard Worker vn_cs_renderer_protocol_info_init_once(struct vn_instance *instance)
17*61046927SAndroid Build Coastguard Worker {
18*61046927SAndroid Build Coastguard Worker    const struct vn_renderer_info *renderer_info = &instance->renderer->info;
19*61046927SAndroid Build Coastguard Worker    /* assume renderer protocol supports all extensions if bit 0 is not set */
20*61046927SAndroid Build Coastguard Worker    const bool support_all_exts =
21*61046927SAndroid Build Coastguard Worker       !vn_info_extension_mask_test(renderer_info->vk_extension_mask, 0);
22*61046927SAndroid Build Coastguard Worker 
23*61046927SAndroid Build Coastguard Worker    _vn_cs_renderer_protocol_info.api_version = renderer_info->vk_xml_version;
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker    STATIC_ASSERT(sizeof(renderer_info->vk_extension_mask) >=
26*61046927SAndroid Build Coastguard Worker                  sizeof(_vn_cs_renderer_protocol_info.extension_bitset));
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 1; i <= VN_INFO_EXTENSION_MAX_NUMBER; i++) {
29*61046927SAndroid Build Coastguard Worker       /* use protocl helper to ensure mask decoding matches encoding */
30*61046927SAndroid Build Coastguard Worker       if (support_all_exts ||
31*61046927SAndroid Build Coastguard Worker           vn_info_extension_mask_test(renderer_info->vk_extension_mask, i))
32*61046927SAndroid Build Coastguard Worker          BITSET_SET(_vn_cs_renderer_protocol_info.extension_bitset, i);
33*61046927SAndroid Build Coastguard Worker    }
34*61046927SAndroid Build Coastguard Worker }
35*61046927SAndroid Build Coastguard Worker 
36*61046927SAndroid Build Coastguard Worker void
vn_cs_renderer_protocol_info_init(struct vn_instance * instance)37*61046927SAndroid Build Coastguard Worker vn_cs_renderer_protocol_info_init(struct vn_instance *instance)
38*61046927SAndroid Build Coastguard Worker {
39*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&_vn_cs_renderer_protocol_info.mutex);
40*61046927SAndroid Build Coastguard Worker    if (_vn_cs_renderer_protocol_info.init_once) {
41*61046927SAndroid Build Coastguard Worker       simple_mtx_unlock(&_vn_cs_renderer_protocol_info.mutex);
42*61046927SAndroid Build Coastguard Worker       return;
43*61046927SAndroid Build Coastguard Worker    }
44*61046927SAndroid Build Coastguard Worker 
45*61046927SAndroid Build Coastguard Worker    vn_cs_renderer_protocol_info_init_once(instance);
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker    _vn_cs_renderer_protocol_info.init_once = true;
48*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&_vn_cs_renderer_protocol_info.mutex);
49*61046927SAndroid Build Coastguard Worker }
50*61046927SAndroid Build Coastguard Worker 
51*61046927SAndroid Build Coastguard Worker static void
vn_cs_encoder_sanity_check(struct vn_cs_encoder * enc)52*61046927SAndroid Build Coastguard Worker vn_cs_encoder_sanity_check(struct vn_cs_encoder *enc)
53*61046927SAndroid Build Coastguard Worker {
54*61046927SAndroid Build Coastguard Worker    assert(enc->buffer_count <= enc->buffer_max);
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker    size_t total_committed_size = 0;
57*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < enc->buffer_count; i++)
58*61046927SAndroid Build Coastguard Worker       total_committed_size += enc->buffers[i].committed_size;
59*61046927SAndroid Build Coastguard Worker    assert(enc->total_committed_size == total_committed_size);
60*61046927SAndroid Build Coastguard Worker 
61*61046927SAndroid Build Coastguard Worker    if (enc->buffer_count) {
62*61046927SAndroid Build Coastguard Worker       const struct vn_cs_encoder_buffer *cur_buf =
63*61046927SAndroid Build Coastguard Worker          &enc->buffers[enc->buffer_count - 1];
64*61046927SAndroid Build Coastguard Worker       assert(cur_buf->base <= enc->cur && enc->cur <= enc->end &&
65*61046927SAndroid Build Coastguard Worker              enc->end <= cur_buf->base + enc->current_buffer_size);
66*61046927SAndroid Build Coastguard Worker       if (cur_buf->committed_size)
67*61046927SAndroid Build Coastguard Worker          assert(enc->cur == enc->end);
68*61046927SAndroid Build Coastguard Worker    } else {
69*61046927SAndroid Build Coastguard Worker       assert(!enc->current_buffer_size);
70*61046927SAndroid Build Coastguard Worker       assert(!enc->cur && !enc->end);
71*61046927SAndroid Build Coastguard Worker    }
72*61046927SAndroid Build Coastguard Worker }
73*61046927SAndroid Build Coastguard Worker 
74*61046927SAndroid Build Coastguard Worker static void
vn_cs_encoder_add_buffer(struct vn_cs_encoder * enc,struct vn_renderer_shmem * shmem,size_t offset,void * base,size_t size)75*61046927SAndroid Build Coastguard Worker vn_cs_encoder_add_buffer(struct vn_cs_encoder *enc,
76*61046927SAndroid Build Coastguard Worker                          struct vn_renderer_shmem *shmem,
77*61046927SAndroid Build Coastguard Worker                          size_t offset,
78*61046927SAndroid Build Coastguard Worker                          void *base,
79*61046927SAndroid Build Coastguard Worker                          size_t size)
80*61046927SAndroid Build Coastguard Worker {
81*61046927SAndroid Build Coastguard Worker    /* add a buffer and make it current */
82*61046927SAndroid Build Coastguard Worker    assert(enc->buffer_count < enc->buffer_max);
83*61046927SAndroid Build Coastguard Worker    struct vn_cs_encoder_buffer *cur_buf = &enc->buffers[enc->buffer_count++];
84*61046927SAndroid Build Coastguard Worker    /* shmem ownership transferred */
85*61046927SAndroid Build Coastguard Worker    cur_buf->shmem = shmem;
86*61046927SAndroid Build Coastguard Worker    cur_buf->offset = offset;
87*61046927SAndroid Build Coastguard Worker    cur_buf->base = base;
88*61046927SAndroid Build Coastguard Worker    cur_buf->committed_size = 0;
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker    /* update the write pointer */
91*61046927SAndroid Build Coastguard Worker    enc->cur = base;
92*61046927SAndroid Build Coastguard Worker    enc->end = base + size;
93*61046927SAndroid Build Coastguard Worker }
94*61046927SAndroid Build Coastguard Worker 
95*61046927SAndroid Build Coastguard Worker static void
vn_cs_encoder_commit_buffer(struct vn_cs_encoder * enc)96*61046927SAndroid Build Coastguard Worker vn_cs_encoder_commit_buffer(struct vn_cs_encoder *enc)
97*61046927SAndroid Build Coastguard Worker {
98*61046927SAndroid Build Coastguard Worker    assert(enc->buffer_count);
99*61046927SAndroid Build Coastguard Worker    struct vn_cs_encoder_buffer *cur_buf =
100*61046927SAndroid Build Coastguard Worker       &enc->buffers[enc->buffer_count - 1];
101*61046927SAndroid Build Coastguard Worker    const size_t written_size = enc->cur - cur_buf->base;
102*61046927SAndroid Build Coastguard Worker    if (cur_buf->committed_size) {
103*61046927SAndroid Build Coastguard Worker       assert(cur_buf->committed_size == written_size);
104*61046927SAndroid Build Coastguard Worker    } else {
105*61046927SAndroid Build Coastguard Worker       cur_buf->committed_size = written_size;
106*61046927SAndroid Build Coastguard Worker       enc->total_committed_size += written_size;
107*61046927SAndroid Build Coastguard Worker    }
108*61046927SAndroid Build Coastguard Worker }
109*61046927SAndroid Build Coastguard Worker 
110*61046927SAndroid Build Coastguard Worker static void
vn_cs_encoder_gc_buffers(struct vn_cs_encoder * enc)111*61046927SAndroid Build Coastguard Worker vn_cs_encoder_gc_buffers(struct vn_cs_encoder *enc)
112*61046927SAndroid Build Coastguard Worker {
113*61046927SAndroid Build Coastguard Worker    /* when the shmem pool is used, no need to cache the shmem in cs */
114*61046927SAndroid Build Coastguard Worker    if (enc->storage_type == VN_CS_ENCODER_STORAGE_SHMEM_POOL) {
115*61046927SAndroid Build Coastguard Worker       for (uint32_t i = 0; i < enc->buffer_count; i++) {
116*61046927SAndroid Build Coastguard Worker          vn_renderer_shmem_unref(enc->instance->renderer,
117*61046927SAndroid Build Coastguard Worker                                  enc->buffers[i].shmem);
118*61046927SAndroid Build Coastguard Worker       }
119*61046927SAndroid Build Coastguard Worker 
120*61046927SAndroid Build Coastguard Worker       enc->buffer_count = 0;
121*61046927SAndroid Build Coastguard Worker       enc->total_committed_size = 0;
122*61046927SAndroid Build Coastguard Worker       enc->current_buffer_size = 0;
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker       enc->cur = NULL;
125*61046927SAndroid Build Coastguard Worker       enc->end = NULL;
126*61046927SAndroid Build Coastguard Worker 
127*61046927SAndroid Build Coastguard Worker       return;
128*61046927SAndroid Build Coastguard Worker    }
129*61046927SAndroid Build Coastguard Worker 
130*61046927SAndroid Build Coastguard Worker    /* free all but the current buffer */
131*61046927SAndroid Build Coastguard Worker    assert(enc->buffer_count);
132*61046927SAndroid Build Coastguard Worker    struct vn_cs_encoder_buffer *cur_buf =
133*61046927SAndroid Build Coastguard Worker       &enc->buffers[enc->buffer_count - 1];
134*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < enc->buffer_count - 1; i++)
135*61046927SAndroid Build Coastguard Worker       vn_renderer_shmem_unref(enc->instance->renderer, enc->buffers[i].shmem);
136*61046927SAndroid Build Coastguard Worker 
137*61046927SAndroid Build Coastguard Worker    /* move the current buffer to the beginning, skipping the used part */
138*61046927SAndroid Build Coastguard Worker    const size_t used = cur_buf->offset + cur_buf->committed_size;
139*61046927SAndroid Build Coastguard Worker    enc->buffer_count = 0;
140*61046927SAndroid Build Coastguard Worker    vn_cs_encoder_add_buffer(enc, cur_buf->shmem, used,
141*61046927SAndroid Build Coastguard Worker                             cur_buf->base + cur_buf->committed_size,
142*61046927SAndroid Build Coastguard Worker                             enc->current_buffer_size - used);
143*61046927SAndroid Build Coastguard Worker 
144*61046927SAndroid Build Coastguard Worker    enc->total_committed_size = 0;
145*61046927SAndroid Build Coastguard Worker }
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker void
vn_cs_encoder_init(struct vn_cs_encoder * enc,struct vn_instance * instance,enum vn_cs_encoder_storage_type storage_type,size_t min_size)148*61046927SAndroid Build Coastguard Worker vn_cs_encoder_init(struct vn_cs_encoder *enc,
149*61046927SAndroid Build Coastguard Worker                    struct vn_instance *instance,
150*61046927SAndroid Build Coastguard Worker                    enum vn_cs_encoder_storage_type storage_type,
151*61046927SAndroid Build Coastguard Worker                    size_t min_size)
152*61046927SAndroid Build Coastguard Worker {
153*61046927SAndroid Build Coastguard Worker    /* VN_CS_ENCODER_INITIALIZER* should be used instead */
154*61046927SAndroid Build Coastguard Worker    assert(storage_type != VN_CS_ENCODER_STORAGE_POINTER);
155*61046927SAndroid Build Coastguard Worker 
156*61046927SAndroid Build Coastguard Worker    memset(enc, 0, sizeof(*enc));
157*61046927SAndroid Build Coastguard Worker    enc->instance = instance;
158*61046927SAndroid Build Coastguard Worker    enc->storage_type = storage_type;
159*61046927SAndroid Build Coastguard Worker    enc->min_buffer_size = min_size;
160*61046927SAndroid Build Coastguard Worker }
161*61046927SAndroid Build Coastguard Worker 
162*61046927SAndroid Build Coastguard Worker void
vn_cs_encoder_fini(struct vn_cs_encoder * enc)163*61046927SAndroid Build Coastguard Worker vn_cs_encoder_fini(struct vn_cs_encoder *enc)
164*61046927SAndroid Build Coastguard Worker {
165*61046927SAndroid Build Coastguard Worker    if (unlikely(enc->storage_type == VN_CS_ENCODER_STORAGE_POINTER))
166*61046927SAndroid Build Coastguard Worker       return;
167*61046927SAndroid Build Coastguard Worker 
168*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < enc->buffer_count; i++)
169*61046927SAndroid Build Coastguard Worker       vn_renderer_shmem_unref(enc->instance->renderer, enc->buffers[i].shmem);
170*61046927SAndroid Build Coastguard Worker    if (enc->buffers)
171*61046927SAndroid Build Coastguard Worker       free(enc->buffers);
172*61046927SAndroid Build Coastguard Worker }
173*61046927SAndroid Build Coastguard Worker 
174*61046927SAndroid Build Coastguard Worker /**
175*61046927SAndroid Build Coastguard Worker  * Reset a cs for reuse.
176*61046927SAndroid Build Coastguard Worker  */
177*61046927SAndroid Build Coastguard Worker void
vn_cs_encoder_reset(struct vn_cs_encoder * enc)178*61046927SAndroid Build Coastguard Worker vn_cs_encoder_reset(struct vn_cs_encoder *enc)
179*61046927SAndroid Build Coastguard Worker {
180*61046927SAndroid Build Coastguard Worker    /* enc->error is sticky */
181*61046927SAndroid Build Coastguard Worker    if (likely(enc->buffer_count))
182*61046927SAndroid Build Coastguard Worker       vn_cs_encoder_gc_buffers(enc);
183*61046927SAndroid Build Coastguard Worker }
184*61046927SAndroid Build Coastguard Worker 
185*61046927SAndroid Build Coastguard Worker static uint32_t
next_array_size(uint32_t cur_size,uint32_t min_size)186*61046927SAndroid Build Coastguard Worker next_array_size(uint32_t cur_size, uint32_t min_size)
187*61046927SAndroid Build Coastguard Worker {
188*61046927SAndroid Build Coastguard Worker    const uint32_t next_size = cur_size ? cur_size * 2 : min_size;
189*61046927SAndroid Build Coastguard Worker    return next_size > cur_size ? next_size : 0;
190*61046927SAndroid Build Coastguard Worker }
191*61046927SAndroid Build Coastguard Worker 
192*61046927SAndroid Build Coastguard Worker static size_t
next_buffer_size(size_t cur_size,size_t min_size,size_t need)193*61046927SAndroid Build Coastguard Worker next_buffer_size(size_t cur_size, size_t min_size, size_t need)
194*61046927SAndroid Build Coastguard Worker {
195*61046927SAndroid Build Coastguard Worker    size_t next_size = cur_size ? cur_size * 2 : min_size;
196*61046927SAndroid Build Coastguard Worker    while (next_size < need) {
197*61046927SAndroid Build Coastguard Worker       next_size *= 2;
198*61046927SAndroid Build Coastguard Worker       if (!next_size)
199*61046927SAndroid Build Coastguard Worker          return 0;
200*61046927SAndroid Build Coastguard Worker    }
201*61046927SAndroid Build Coastguard Worker    return next_size;
202*61046927SAndroid Build Coastguard Worker }
203*61046927SAndroid Build Coastguard Worker 
204*61046927SAndroid Build Coastguard Worker static bool
vn_cs_encoder_grow_buffer_array(struct vn_cs_encoder * enc)205*61046927SAndroid Build Coastguard Worker vn_cs_encoder_grow_buffer_array(struct vn_cs_encoder *enc)
206*61046927SAndroid Build Coastguard Worker {
207*61046927SAndroid Build Coastguard Worker    const uint32_t buf_max = next_array_size(enc->buffer_max, 4);
208*61046927SAndroid Build Coastguard Worker    if (!buf_max)
209*61046927SAndroid Build Coastguard Worker       return false;
210*61046927SAndroid Build Coastguard Worker 
211*61046927SAndroid Build Coastguard Worker    void *bufs = realloc(enc->buffers, sizeof(*enc->buffers) * buf_max);
212*61046927SAndroid Build Coastguard Worker    if (!bufs)
213*61046927SAndroid Build Coastguard Worker       return false;
214*61046927SAndroid Build Coastguard Worker 
215*61046927SAndroid Build Coastguard Worker    enc->buffers = bufs;
216*61046927SAndroid Build Coastguard Worker    enc->buffer_max = buf_max;
217*61046927SAndroid Build Coastguard Worker 
218*61046927SAndroid Build Coastguard Worker    return true;
219*61046927SAndroid Build Coastguard Worker }
220*61046927SAndroid Build Coastguard Worker 
221*61046927SAndroid Build Coastguard Worker /**
222*61046927SAndroid Build Coastguard Worker  * Add a new vn_cs_encoder_buffer to a cs.
223*61046927SAndroid Build Coastguard Worker  */
224*61046927SAndroid Build Coastguard Worker bool
vn_cs_encoder_reserve_internal(struct vn_cs_encoder * enc,size_t size)225*61046927SAndroid Build Coastguard Worker vn_cs_encoder_reserve_internal(struct vn_cs_encoder *enc, size_t size)
226*61046927SAndroid Build Coastguard Worker {
227*61046927SAndroid Build Coastguard Worker    VN_TRACE_FUNC();
228*61046927SAndroid Build Coastguard Worker    if (unlikely(enc->storage_type == VN_CS_ENCODER_STORAGE_POINTER))
229*61046927SAndroid Build Coastguard Worker       return false;
230*61046927SAndroid Build Coastguard Worker 
231*61046927SAndroid Build Coastguard Worker    if (enc->buffer_count >= enc->buffer_max) {
232*61046927SAndroid Build Coastguard Worker       if (!vn_cs_encoder_grow_buffer_array(enc))
233*61046927SAndroid Build Coastguard Worker          return false;
234*61046927SAndroid Build Coastguard Worker       assert(enc->buffer_count < enc->buffer_max);
235*61046927SAndroid Build Coastguard Worker    }
236*61046927SAndroid Build Coastguard Worker 
237*61046927SAndroid Build Coastguard Worker    size_t buf_size = 0;
238*61046927SAndroid Build Coastguard Worker    if (likely(enc->buffer_count)) {
239*61046927SAndroid Build Coastguard Worker       vn_cs_encoder_commit_buffer(enc);
240*61046927SAndroid Build Coastguard Worker 
241*61046927SAndroid Build Coastguard Worker       if (enc->storage_type == VN_CS_ENCODER_STORAGE_SHMEM_ARRAY) {
242*61046927SAndroid Build Coastguard Worker          /* if the current buffer is reused from the last vn_cs_encoder_reset
243*61046927SAndroid Build Coastguard Worker           * (i.e., offset != 0), do not double the size
244*61046927SAndroid Build Coastguard Worker           *
245*61046927SAndroid Build Coastguard Worker           * TODO better strategy to grow buffer size
246*61046927SAndroid Build Coastguard Worker           */
247*61046927SAndroid Build Coastguard Worker          const struct vn_cs_encoder_buffer *cur_buf =
248*61046927SAndroid Build Coastguard Worker             &enc->buffers[enc->buffer_count - 1];
249*61046927SAndroid Build Coastguard Worker          if (cur_buf->offset)
250*61046927SAndroid Build Coastguard Worker             buf_size = next_buffer_size(0, enc->current_buffer_size, size);
251*61046927SAndroid Build Coastguard Worker       }
252*61046927SAndroid Build Coastguard Worker    }
253*61046927SAndroid Build Coastguard Worker 
254*61046927SAndroid Build Coastguard Worker    if (!buf_size) {
255*61046927SAndroid Build Coastguard Worker       /* double the size */
256*61046927SAndroid Build Coastguard Worker       buf_size = next_buffer_size(enc->current_buffer_size,
257*61046927SAndroid Build Coastguard Worker                                   enc->min_buffer_size, size);
258*61046927SAndroid Build Coastguard Worker       if (!buf_size)
259*61046927SAndroid Build Coastguard Worker          return false;
260*61046927SAndroid Build Coastguard Worker    }
261*61046927SAndroid Build Coastguard Worker 
262*61046927SAndroid Build Coastguard Worker    struct vn_renderer_shmem *shmem;
263*61046927SAndroid Build Coastguard Worker    size_t buf_offset;
264*61046927SAndroid Build Coastguard Worker    if (enc->storage_type == VN_CS_ENCODER_STORAGE_SHMEM_ARRAY) {
265*61046927SAndroid Build Coastguard Worker       shmem = vn_renderer_shmem_create(enc->instance->renderer, buf_size);
266*61046927SAndroid Build Coastguard Worker       buf_offset = 0;
267*61046927SAndroid Build Coastguard Worker    } else {
268*61046927SAndroid Build Coastguard Worker       assert(enc->storage_type == VN_CS_ENCODER_STORAGE_SHMEM_POOL);
269*61046927SAndroid Build Coastguard Worker       shmem =
270*61046927SAndroid Build Coastguard Worker          vn_instance_cs_shmem_alloc(enc->instance, buf_size, &buf_offset);
271*61046927SAndroid Build Coastguard Worker    }
272*61046927SAndroid Build Coastguard Worker    if (!shmem)
273*61046927SAndroid Build Coastguard Worker       return false;
274*61046927SAndroid Build Coastguard Worker 
275*61046927SAndroid Build Coastguard Worker    vn_cs_encoder_add_buffer(enc, shmem, buf_offset,
276*61046927SAndroid Build Coastguard Worker                             shmem->mmap_ptr + buf_offset, buf_size);
277*61046927SAndroid Build Coastguard Worker    enc->current_buffer_size = buf_size;
278*61046927SAndroid Build Coastguard Worker 
279*61046927SAndroid Build Coastguard Worker    vn_cs_encoder_sanity_check(enc);
280*61046927SAndroid Build Coastguard Worker 
281*61046927SAndroid Build Coastguard Worker    return true;
282*61046927SAndroid Build Coastguard Worker }
283*61046927SAndroid Build Coastguard Worker 
284*61046927SAndroid Build Coastguard Worker /*
285*61046927SAndroid Build Coastguard Worker  * Commit written data.
286*61046927SAndroid Build Coastguard Worker  */
287*61046927SAndroid Build Coastguard Worker void
vn_cs_encoder_commit(struct vn_cs_encoder * enc)288*61046927SAndroid Build Coastguard Worker vn_cs_encoder_commit(struct vn_cs_encoder *enc)
289*61046927SAndroid Build Coastguard Worker {
290*61046927SAndroid Build Coastguard Worker    if (likely(enc->buffer_count)) {
291*61046927SAndroid Build Coastguard Worker       vn_cs_encoder_commit_buffer(enc);
292*61046927SAndroid Build Coastguard Worker 
293*61046927SAndroid Build Coastguard Worker       /* trigger the slow path on next vn_cs_encoder_reserve */
294*61046927SAndroid Build Coastguard Worker       enc->end = enc->cur;
295*61046927SAndroid Build Coastguard Worker    }
296*61046927SAndroid Build Coastguard Worker 
297*61046927SAndroid Build Coastguard Worker    vn_cs_encoder_sanity_check(enc);
298*61046927SAndroid Build Coastguard Worker }
299*61046927SAndroid Build Coastguard Worker 
300*61046927SAndroid Build Coastguard Worker bool
vn_cs_encoder_needs_roundtrip(struct vn_cs_encoder * enc)301*61046927SAndroid Build Coastguard Worker vn_cs_encoder_needs_roundtrip(struct vn_cs_encoder *enc)
302*61046927SAndroid Build Coastguard Worker {
303*61046927SAndroid Build Coastguard Worker    if (!enc->instance->renderer->info.has_guest_vram)
304*61046927SAndroid Build Coastguard Worker       return false;
305*61046927SAndroid Build Coastguard Worker 
306*61046927SAndroid Build Coastguard Worker    /* check pinned shmems for new shmem allocs */
307*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < enc->buffer_count; i++) {
308*61046927SAndroid Build Coastguard Worker       const struct vn_renderer_shmem *shmem = enc->buffers[i].shmem;
309*61046927SAndroid Build Coastguard Worker       if (shmem && !shmem->cache_timestamp)
310*61046927SAndroid Build Coastguard Worker          return true;
311*61046927SAndroid Build Coastguard Worker    }
312*61046927SAndroid Build Coastguard Worker 
313*61046927SAndroid Build Coastguard Worker    return false;
314*61046927SAndroid Build Coastguard Worker }
315