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