1*bbecb9d1SAndroid Build Coastguard Worker /*
2*bbecb9d1SAndroid Build Coastguard Worker * Copyright 2020 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 #include "vkr_transport.h"
7*bbecb9d1SAndroid Build Coastguard Worker
8*bbecb9d1SAndroid Build Coastguard Worker #include "venus-protocol/vn_protocol_renderer_dispatches.h"
9*bbecb9d1SAndroid Build Coastguard Worker #include "venus-protocol/vn_protocol_renderer_transport.h"
10*bbecb9d1SAndroid Build Coastguard Worker #include "vrend_iov.h"
11*bbecb9d1SAndroid Build Coastguard Worker
12*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_context.h"
13*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_ring.h"
14*bbecb9d1SAndroid Build Coastguard Worker
15*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkSetReplyCommandStreamMESA(struct vn_dispatch_context * dispatch,struct vn_command_vkSetReplyCommandStreamMESA * args)16*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkSetReplyCommandStreamMESA(
17*bbecb9d1SAndroid Build Coastguard Worker struct vn_dispatch_context *dispatch,
18*bbecb9d1SAndroid Build Coastguard Worker struct vn_command_vkSetReplyCommandStreamMESA *args)
19*bbecb9d1SAndroid Build Coastguard Worker {
20*bbecb9d1SAndroid Build Coastguard Worker struct vkr_context *ctx = dispatch->data;
21*bbecb9d1SAndroid Build Coastguard Worker struct vkr_resource_attachment *att;
22*bbecb9d1SAndroid Build Coastguard Worker
23*bbecb9d1SAndroid Build Coastguard Worker att = vkr_context_get_resource(ctx, args->pStream->resourceId);
24*bbecb9d1SAndroid Build Coastguard Worker if (!att) {
25*bbecb9d1SAndroid Build Coastguard Worker vkr_log("failed to set reply stream: invalid res_id %u", args->pStream->resourceId);
26*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_set_fatal(&ctx->decoder);
27*bbecb9d1SAndroid Build Coastguard Worker return;
28*bbecb9d1SAndroid Build Coastguard Worker }
29*bbecb9d1SAndroid Build Coastguard Worker
30*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_encoder_set_stream(&ctx->encoder, att, args->pStream->offset,
31*bbecb9d1SAndroid Build Coastguard Worker args->pStream->size);
32*bbecb9d1SAndroid Build Coastguard Worker }
33*bbecb9d1SAndroid Build Coastguard Worker
34*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkSeekReplyCommandStreamMESA(struct vn_dispatch_context * dispatch,struct vn_command_vkSeekReplyCommandStreamMESA * args)35*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkSeekReplyCommandStreamMESA(
36*bbecb9d1SAndroid Build Coastguard Worker struct vn_dispatch_context *dispatch,
37*bbecb9d1SAndroid Build Coastguard Worker struct vn_command_vkSeekReplyCommandStreamMESA *args)
38*bbecb9d1SAndroid Build Coastguard Worker {
39*bbecb9d1SAndroid Build Coastguard Worker struct vkr_context *ctx = dispatch->data;
40*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_encoder_seek_stream(&ctx->encoder, args->position);
41*bbecb9d1SAndroid Build Coastguard Worker }
42*bbecb9d1SAndroid Build Coastguard Worker
43*bbecb9d1SAndroid Build Coastguard Worker static void *
copy_command_stream(struct vkr_context * ctx,const VkCommandStreamDescriptionMESA * stream)44*bbecb9d1SAndroid Build Coastguard Worker copy_command_stream(struct vkr_context *ctx, const VkCommandStreamDescriptionMESA *stream)
45*bbecb9d1SAndroid Build Coastguard Worker {
46*bbecb9d1SAndroid Build Coastguard Worker struct vkr_resource_attachment *att;
47*bbecb9d1SAndroid Build Coastguard Worker
48*bbecb9d1SAndroid Build Coastguard Worker att = vkr_context_get_resource(ctx, stream->resourceId);
49*bbecb9d1SAndroid Build Coastguard Worker if (!att) {
50*bbecb9d1SAndroid Build Coastguard Worker vkr_log("failed to copy command stream: invalid res_id %u", stream->resourceId);
51*bbecb9d1SAndroid Build Coastguard Worker return NULL;
52*bbecb9d1SAndroid Build Coastguard Worker }
53*bbecb9d1SAndroid Build Coastguard Worker
54*bbecb9d1SAndroid Build Coastguard Worker /* seek to offset */
55*bbecb9d1SAndroid Build Coastguard Worker size_t iov_offset = stream->offset;
56*bbecb9d1SAndroid Build Coastguard Worker const struct iovec *iov = NULL;
57*bbecb9d1SAndroid Build Coastguard Worker for (int i = 0; i < att->iov_count; i++) {
58*bbecb9d1SAndroid Build Coastguard Worker if (iov_offset < att->iov[i].iov_len) {
59*bbecb9d1SAndroid Build Coastguard Worker iov = &att->iov[i];
60*bbecb9d1SAndroid Build Coastguard Worker break;
61*bbecb9d1SAndroid Build Coastguard Worker }
62*bbecb9d1SAndroid Build Coastguard Worker iov_offset -= att->iov[i].iov_len;
63*bbecb9d1SAndroid Build Coastguard Worker }
64*bbecb9d1SAndroid Build Coastguard Worker if (!iov) {
65*bbecb9d1SAndroid Build Coastguard Worker vkr_log("failed to copy command stream: invalid offset %zu", stream->offset);
66*bbecb9d1SAndroid Build Coastguard Worker return NULL;
67*bbecb9d1SAndroid Build Coastguard Worker }
68*bbecb9d1SAndroid Build Coastguard Worker
69*bbecb9d1SAndroid Build Coastguard Worker /* XXX until the decoder supports scatter-gather and is robust enough,
70*bbecb9d1SAndroid Build Coastguard Worker * always make a copy in case the caller modifies the commands while we
71*bbecb9d1SAndroid Build Coastguard Worker * parse
72*bbecb9d1SAndroid Build Coastguard Worker */
73*bbecb9d1SAndroid Build Coastguard Worker uint8_t *data = malloc(stream->size);
74*bbecb9d1SAndroid Build Coastguard Worker if (!data) {
75*bbecb9d1SAndroid Build Coastguard Worker vkr_log("failed to copy command stream: malloc(%zu) failed", stream->size);
76*bbecb9d1SAndroid Build Coastguard Worker return NULL;
77*bbecb9d1SAndroid Build Coastguard Worker }
78*bbecb9d1SAndroid Build Coastguard Worker
79*bbecb9d1SAndroid Build Coastguard Worker uint32_t copied = 0;
80*bbecb9d1SAndroid Build Coastguard Worker while (true) {
81*bbecb9d1SAndroid Build Coastguard Worker const size_t s = MIN2(stream->size - copied, iov->iov_len - iov_offset);
82*bbecb9d1SAndroid Build Coastguard Worker memcpy(data + copied, (const uint8_t *)iov->iov_base + iov_offset, s);
83*bbecb9d1SAndroid Build Coastguard Worker
84*bbecb9d1SAndroid Build Coastguard Worker copied += s;
85*bbecb9d1SAndroid Build Coastguard Worker if (copied == stream->size) {
86*bbecb9d1SAndroid Build Coastguard Worker break;
87*bbecb9d1SAndroid Build Coastguard Worker } else if (iov == &att->iov[att->iov_count - 1]) {
88*bbecb9d1SAndroid Build Coastguard Worker vkr_log("failed to copy command stream: invalid size %zu", stream->size);
89*bbecb9d1SAndroid Build Coastguard Worker free(data);
90*bbecb9d1SAndroid Build Coastguard Worker return NULL;
91*bbecb9d1SAndroid Build Coastguard Worker }
92*bbecb9d1SAndroid Build Coastguard Worker
93*bbecb9d1SAndroid Build Coastguard Worker iov++;
94*bbecb9d1SAndroid Build Coastguard Worker iov_offset = 0;
95*bbecb9d1SAndroid Build Coastguard Worker }
96*bbecb9d1SAndroid Build Coastguard Worker
97*bbecb9d1SAndroid Build Coastguard Worker return data;
98*bbecb9d1SAndroid Build Coastguard Worker }
99*bbecb9d1SAndroid Build Coastguard Worker
100*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkExecuteCommandStreamsMESA(struct vn_dispatch_context * dispatch,struct vn_command_vkExecuteCommandStreamsMESA * args)101*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkExecuteCommandStreamsMESA(
102*bbecb9d1SAndroid Build Coastguard Worker struct vn_dispatch_context *dispatch,
103*bbecb9d1SAndroid Build Coastguard Worker struct vn_command_vkExecuteCommandStreamsMESA *args)
104*bbecb9d1SAndroid Build Coastguard Worker {
105*bbecb9d1SAndroid Build Coastguard Worker struct vkr_context *ctx = dispatch->data;
106*bbecb9d1SAndroid Build Coastguard Worker
107*bbecb9d1SAndroid Build Coastguard Worker if (unlikely(!args->streamCount)) {
108*bbecb9d1SAndroid Build Coastguard Worker vkr_log("failed to execute command streams: no stream specified");
109*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_set_fatal(&ctx->decoder);
110*bbecb9d1SAndroid Build Coastguard Worker return;
111*bbecb9d1SAndroid Build Coastguard Worker }
112*bbecb9d1SAndroid Build Coastguard Worker
113*bbecb9d1SAndroid Build Coastguard Worker /* note that nested vkExecuteCommandStreamsMESA is not allowed */
114*bbecb9d1SAndroid Build Coastguard Worker if (unlikely(!vkr_cs_decoder_push_state(&ctx->decoder))) {
115*bbecb9d1SAndroid Build Coastguard Worker vkr_log("failed to execute command streams: nested execution");
116*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_set_fatal(&ctx->decoder);
117*bbecb9d1SAndroid Build Coastguard Worker return;
118*bbecb9d1SAndroid Build Coastguard Worker }
119*bbecb9d1SAndroid Build Coastguard Worker
120*bbecb9d1SAndroid Build Coastguard Worker for (uint32_t i = 0; i < args->streamCount; i++) {
121*bbecb9d1SAndroid Build Coastguard Worker const VkCommandStreamDescriptionMESA *stream = &args->pStreams[i];
122*bbecb9d1SAndroid Build Coastguard Worker
123*bbecb9d1SAndroid Build Coastguard Worker if (args->pReplyPositions)
124*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_encoder_seek_stream(&ctx->encoder, args->pReplyPositions[i]);
125*bbecb9d1SAndroid Build Coastguard Worker
126*bbecb9d1SAndroid Build Coastguard Worker if (!stream->size)
127*bbecb9d1SAndroid Build Coastguard Worker continue;
128*bbecb9d1SAndroid Build Coastguard Worker
129*bbecb9d1SAndroid Build Coastguard Worker void *data = copy_command_stream(ctx, stream);
130*bbecb9d1SAndroid Build Coastguard Worker if (!data) {
131*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_set_fatal(&ctx->decoder);
132*bbecb9d1SAndroid Build Coastguard Worker break;
133*bbecb9d1SAndroid Build Coastguard Worker }
134*bbecb9d1SAndroid Build Coastguard Worker
135*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_set_stream(&ctx->decoder, data, stream->size);
136*bbecb9d1SAndroid Build Coastguard Worker while (vkr_cs_decoder_has_command(&ctx->decoder)) {
137*bbecb9d1SAndroid Build Coastguard Worker vn_dispatch_command(&ctx->dispatch);
138*bbecb9d1SAndroid Build Coastguard Worker if (vkr_cs_decoder_get_fatal(&ctx->decoder))
139*bbecb9d1SAndroid Build Coastguard Worker break;
140*bbecb9d1SAndroid Build Coastguard Worker }
141*bbecb9d1SAndroid Build Coastguard Worker
142*bbecb9d1SAndroid Build Coastguard Worker free(data);
143*bbecb9d1SAndroid Build Coastguard Worker
144*bbecb9d1SAndroid Build Coastguard Worker if (vkr_cs_decoder_get_fatal(&ctx->decoder))
145*bbecb9d1SAndroid Build Coastguard Worker break;
146*bbecb9d1SAndroid Build Coastguard Worker }
147*bbecb9d1SAndroid Build Coastguard Worker
148*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_pop_state(&ctx->decoder);
149*bbecb9d1SAndroid Build Coastguard Worker }
150*bbecb9d1SAndroid Build Coastguard Worker
151*bbecb9d1SAndroid Build Coastguard Worker static struct vkr_ring *
lookup_ring(struct vkr_context * ctx,uint64_t ring_id)152*bbecb9d1SAndroid Build Coastguard Worker lookup_ring(struct vkr_context *ctx, uint64_t ring_id)
153*bbecb9d1SAndroid Build Coastguard Worker {
154*bbecb9d1SAndroid Build Coastguard Worker struct vkr_ring *ring;
155*bbecb9d1SAndroid Build Coastguard Worker LIST_FOR_EACH_ENTRY (ring, &ctx->rings, head) {
156*bbecb9d1SAndroid Build Coastguard Worker if (ring->id == ring_id)
157*bbecb9d1SAndroid Build Coastguard Worker return ring;
158*bbecb9d1SAndroid Build Coastguard Worker }
159*bbecb9d1SAndroid Build Coastguard Worker return NULL;
160*bbecb9d1SAndroid Build Coastguard Worker }
161*bbecb9d1SAndroid Build Coastguard Worker
162*bbecb9d1SAndroid Build Coastguard Worker static bool
vkr_ring_layout_init(struct vkr_ring_layout * layout,const struct vkr_resource_attachment * att,const VkRingCreateInfoMESA * info)163*bbecb9d1SAndroid Build Coastguard Worker vkr_ring_layout_init(struct vkr_ring_layout *layout,
164*bbecb9d1SAndroid Build Coastguard Worker const struct vkr_resource_attachment *att,
165*bbecb9d1SAndroid Build Coastguard Worker const VkRingCreateInfoMESA *info)
166*bbecb9d1SAndroid Build Coastguard Worker {
167*bbecb9d1SAndroid Build Coastguard Worker /* clang-format off */
168*bbecb9d1SAndroid Build Coastguard Worker *layout = (struct vkr_ring_layout){
169*bbecb9d1SAndroid Build Coastguard Worker .attachment = att,
170*bbecb9d1SAndroid Build Coastguard Worker .head = VKR_REGION_INIT(info->offset + info->headOffset, sizeof(uint32_t)),
171*bbecb9d1SAndroid Build Coastguard Worker .tail = VKR_REGION_INIT(info->offset + info->tailOffset, sizeof(uint32_t)),
172*bbecb9d1SAndroid Build Coastguard Worker .status = VKR_REGION_INIT(info->offset + info->statusOffset, sizeof(uint32_t)),
173*bbecb9d1SAndroid Build Coastguard Worker .buffer = VKR_REGION_INIT(info->offset + info->bufferOffset, info->bufferSize),
174*bbecb9d1SAndroid Build Coastguard Worker .extra = VKR_REGION_INIT(info->offset + info->extraOffset, info->extraSize),
175*bbecb9d1SAndroid Build Coastguard Worker };
176*bbecb9d1SAndroid Build Coastguard Worker
177*bbecb9d1SAndroid Build Coastguard Worker const struct vkr_region res_region = VKR_REGION_INIT(info->offset, info->size);
178*bbecb9d1SAndroid Build Coastguard Worker const struct vkr_region *regions[] = {
179*bbecb9d1SAndroid Build Coastguard Worker &layout->head,
180*bbecb9d1SAndroid Build Coastguard Worker &layout->tail,
181*bbecb9d1SAndroid Build Coastguard Worker &layout->status,
182*bbecb9d1SAndroid Build Coastguard Worker &layout->buffer,
183*bbecb9d1SAndroid Build Coastguard Worker &layout->extra,
184*bbecb9d1SAndroid Build Coastguard Worker };
185*bbecb9d1SAndroid Build Coastguard Worker /* clang-format on */
186*bbecb9d1SAndroid Build Coastguard Worker
187*bbecb9d1SAndroid Build Coastguard Worker const struct vkr_region res_size =
188*bbecb9d1SAndroid Build Coastguard Worker VKR_REGION_INIT(0, vrend_get_iovec_size(att->iov, att->iov_count));
189*bbecb9d1SAndroid Build Coastguard Worker if (!vkr_region_is_valid(&res_region) || !vkr_region_is_within(&res_region, &res_size))
190*bbecb9d1SAndroid Build Coastguard Worker return false;
191*bbecb9d1SAndroid Build Coastguard Worker
192*bbecb9d1SAndroid Build Coastguard Worker for (size_t i = 0; i < ARRAY_SIZE(regions); i++) {
193*bbecb9d1SAndroid Build Coastguard Worker const struct vkr_region *region = regions[i];
194*bbecb9d1SAndroid Build Coastguard Worker
195*bbecb9d1SAndroid Build Coastguard Worker if (!vkr_region_is_valid(region) || !vkr_region_is_within(region, &res_region)) {
196*bbecb9d1SAndroid Build Coastguard Worker vkr_log("ring buffer control variable (begin=%lu, end=%lu) placed"
197*bbecb9d1SAndroid Build Coastguard Worker " out-of-bounds in shared memory layout",
198*bbecb9d1SAndroid Build Coastguard Worker region->begin, region->end);
199*bbecb9d1SAndroid Build Coastguard Worker return false;
200*bbecb9d1SAndroid Build Coastguard Worker }
201*bbecb9d1SAndroid Build Coastguard Worker
202*bbecb9d1SAndroid Build Coastguard Worker if (!vkr_region_is_aligned(region, 4)) {
203*bbecb9d1SAndroid Build Coastguard Worker vkr_log("ring buffer control variable (begin=%lu, end=%lu) must be"
204*bbecb9d1SAndroid Build Coastguard Worker " 32-bit aligned in shared memory layout",
205*bbecb9d1SAndroid Build Coastguard Worker region->begin, region->end);
206*bbecb9d1SAndroid Build Coastguard Worker return false;
207*bbecb9d1SAndroid Build Coastguard Worker }
208*bbecb9d1SAndroid Build Coastguard Worker }
209*bbecb9d1SAndroid Build Coastguard Worker
210*bbecb9d1SAndroid Build Coastguard Worker /* assumes region->size == 0 is valid */
211*bbecb9d1SAndroid Build Coastguard Worker for (size_t i = 0; i < ARRAY_SIZE(regions); i++) {
212*bbecb9d1SAndroid Build Coastguard Worker const struct vkr_region *region = regions[i];
213*bbecb9d1SAndroid Build Coastguard Worker
214*bbecb9d1SAndroid Build Coastguard Worker for (size_t j = i + 1; j < ARRAY_SIZE(regions); j++) {
215*bbecb9d1SAndroid Build Coastguard Worker const struct vkr_region *other = regions[j];
216*bbecb9d1SAndroid Build Coastguard Worker
217*bbecb9d1SAndroid Build Coastguard Worker if (!vkr_region_is_disjoint(region, other)) {
218*bbecb9d1SAndroid Build Coastguard Worker vkr_log("ring buffer control variable (begin=%lu, end=%lu)"
219*bbecb9d1SAndroid Build Coastguard Worker " overlaps with control variable (begin=%lu, end=%lu)",
220*bbecb9d1SAndroid Build Coastguard Worker other->begin, other->end, region->begin, region->end);
221*bbecb9d1SAndroid Build Coastguard Worker return false;
222*bbecb9d1SAndroid Build Coastguard Worker }
223*bbecb9d1SAndroid Build Coastguard Worker }
224*bbecb9d1SAndroid Build Coastguard Worker }
225*bbecb9d1SAndroid Build Coastguard Worker
226*bbecb9d1SAndroid Build Coastguard Worker const size_t buf_size = vkr_region_size(&layout->buffer);
227*bbecb9d1SAndroid Build Coastguard Worker if (buf_size > VKR_RING_BUFFER_MAX_SIZE || !util_is_power_of_two_nonzero(buf_size)) {
228*bbecb9d1SAndroid Build Coastguard Worker vkr_log("ring buffer size (%z) must be a power of two and not exceed %lu", buf_size,
229*bbecb9d1SAndroid Build Coastguard Worker VKR_RING_BUFFER_MAX_SIZE);
230*bbecb9d1SAndroid Build Coastguard Worker return false;
231*bbecb9d1SAndroid Build Coastguard Worker }
232*bbecb9d1SAndroid Build Coastguard Worker
233*bbecb9d1SAndroid Build Coastguard Worker return true;
234*bbecb9d1SAndroid Build Coastguard Worker }
235*bbecb9d1SAndroid Build Coastguard Worker
236*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkCreateRingMESA(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateRingMESA * args)237*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkCreateRingMESA(struct vn_dispatch_context *dispatch,
238*bbecb9d1SAndroid Build Coastguard Worker struct vn_command_vkCreateRingMESA *args)
239*bbecb9d1SAndroid Build Coastguard Worker {
240*bbecb9d1SAndroid Build Coastguard Worker struct vkr_context *ctx = dispatch->data;
241*bbecb9d1SAndroid Build Coastguard Worker const VkRingCreateInfoMESA *info = args->pCreateInfo;
242*bbecb9d1SAndroid Build Coastguard Worker const struct vkr_resource_attachment *att;
243*bbecb9d1SAndroid Build Coastguard Worker struct vkr_ring *ring;
244*bbecb9d1SAndroid Build Coastguard Worker
245*bbecb9d1SAndroid Build Coastguard Worker att = vkr_context_get_resource(ctx, info->resourceId);
246*bbecb9d1SAndroid Build Coastguard Worker if (!att) {
247*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_set_fatal(&ctx->decoder);
248*bbecb9d1SAndroid Build Coastguard Worker return;
249*bbecb9d1SAndroid Build Coastguard Worker }
250*bbecb9d1SAndroid Build Coastguard Worker
251*bbecb9d1SAndroid Build Coastguard Worker struct vkr_ring_layout layout;
252*bbecb9d1SAndroid Build Coastguard Worker if (!vkr_ring_layout_init(&layout, att, info)) {
253*bbecb9d1SAndroid Build Coastguard Worker vkr_log("vkCreateRingMESA supplied with invalid buffer layout parameters");
254*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_set_fatal(&ctx->decoder);
255*bbecb9d1SAndroid Build Coastguard Worker return;
256*bbecb9d1SAndroid Build Coastguard Worker }
257*bbecb9d1SAndroid Build Coastguard Worker
258*bbecb9d1SAndroid Build Coastguard Worker ring = vkr_ring_create(&layout, &ctx->base, info->idleTimeout);
259*bbecb9d1SAndroid Build Coastguard Worker if (!ring) {
260*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_set_fatal(&ctx->decoder);
261*bbecb9d1SAndroid Build Coastguard Worker return;
262*bbecb9d1SAndroid Build Coastguard Worker }
263*bbecb9d1SAndroid Build Coastguard Worker
264*bbecb9d1SAndroid Build Coastguard Worker ring->id = args->ring;
265*bbecb9d1SAndroid Build Coastguard Worker list_addtail(&ring->head, &ctx->rings);
266*bbecb9d1SAndroid Build Coastguard Worker
267*bbecb9d1SAndroid Build Coastguard Worker vkr_ring_start(ring);
268*bbecb9d1SAndroid Build Coastguard Worker }
269*bbecb9d1SAndroid Build Coastguard Worker
270*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkDestroyRingMESA(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroyRingMESA * args)271*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkDestroyRingMESA(struct vn_dispatch_context *dispatch,
272*bbecb9d1SAndroid Build Coastguard Worker struct vn_command_vkDestroyRingMESA *args)
273*bbecb9d1SAndroid Build Coastguard Worker {
274*bbecb9d1SAndroid Build Coastguard Worker struct vkr_context *ctx = dispatch->data;
275*bbecb9d1SAndroid Build Coastguard Worker struct vkr_ring *ring = lookup_ring(ctx, args->ring);
276*bbecb9d1SAndroid Build Coastguard Worker if (!ring || !vkr_ring_stop(ring)) {
277*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_set_fatal(&ctx->decoder);
278*bbecb9d1SAndroid Build Coastguard Worker return;
279*bbecb9d1SAndroid Build Coastguard Worker }
280*bbecb9d1SAndroid Build Coastguard Worker
281*bbecb9d1SAndroid Build Coastguard Worker vkr_ring_destroy(ring);
282*bbecb9d1SAndroid Build Coastguard Worker }
283*bbecb9d1SAndroid Build Coastguard Worker
284*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkNotifyRingMESA(struct vn_dispatch_context * dispatch,struct vn_command_vkNotifyRingMESA * args)285*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkNotifyRingMESA(struct vn_dispatch_context *dispatch,
286*bbecb9d1SAndroid Build Coastguard Worker struct vn_command_vkNotifyRingMESA *args)
287*bbecb9d1SAndroid Build Coastguard Worker {
288*bbecb9d1SAndroid Build Coastguard Worker struct vkr_context *ctx = dispatch->data;
289*bbecb9d1SAndroid Build Coastguard Worker struct vkr_ring *ring = lookup_ring(ctx, args->ring);
290*bbecb9d1SAndroid Build Coastguard Worker if (!ring) {
291*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_set_fatal(&ctx->decoder);
292*bbecb9d1SAndroid Build Coastguard Worker return;
293*bbecb9d1SAndroid Build Coastguard Worker }
294*bbecb9d1SAndroid Build Coastguard Worker
295*bbecb9d1SAndroid Build Coastguard Worker vkr_ring_notify(ring);
296*bbecb9d1SAndroid Build Coastguard Worker }
297*bbecb9d1SAndroid Build Coastguard Worker
298*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkWriteRingExtraMESA(struct vn_dispatch_context * dispatch,struct vn_command_vkWriteRingExtraMESA * args)299*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkWriteRingExtraMESA(struct vn_dispatch_context *dispatch,
300*bbecb9d1SAndroid Build Coastguard Worker struct vn_command_vkWriteRingExtraMESA *args)
301*bbecb9d1SAndroid Build Coastguard Worker {
302*bbecb9d1SAndroid Build Coastguard Worker struct vkr_context *ctx = dispatch->data;
303*bbecb9d1SAndroid Build Coastguard Worker struct vkr_ring *ring = lookup_ring(ctx, args->ring);
304*bbecb9d1SAndroid Build Coastguard Worker if (!ring) {
305*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_set_fatal(&ctx->decoder);
306*bbecb9d1SAndroid Build Coastguard Worker return;
307*bbecb9d1SAndroid Build Coastguard Worker }
308*bbecb9d1SAndroid Build Coastguard Worker
309*bbecb9d1SAndroid Build Coastguard Worker if (!vkr_ring_write_extra(ring, args->offset, args->value))
310*bbecb9d1SAndroid Build Coastguard Worker vkr_cs_decoder_set_fatal(&ctx->decoder);
311*bbecb9d1SAndroid Build Coastguard Worker }
312*bbecb9d1SAndroid Build Coastguard Worker
313*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkGetVenusExperimentalFeatureData100000MESA(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetVenusExperimentalFeatureData100000MESA * args)314*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkGetVenusExperimentalFeatureData100000MESA(
315*bbecb9d1SAndroid Build Coastguard Worker UNUSED struct vn_dispatch_context *dispatch,
316*bbecb9d1SAndroid Build Coastguard Worker struct vn_command_vkGetVenusExperimentalFeatureData100000MESA *args)
317*bbecb9d1SAndroid Build Coastguard Worker {
318*bbecb9d1SAndroid Build Coastguard Worker const VkVenusExperimentalFeatures100000MESA features = {
319*bbecb9d1SAndroid Build Coastguard Worker .memoryResourceAllocationSize = VK_TRUE,
320*bbecb9d1SAndroid Build Coastguard Worker .globalFencing = VK_FALSE,
321*bbecb9d1SAndroid Build Coastguard Worker .largeRing = VK_TRUE,
322*bbecb9d1SAndroid Build Coastguard Worker .syncFdFencing = VK_TRUE,
323*bbecb9d1SAndroid Build Coastguard Worker };
324*bbecb9d1SAndroid Build Coastguard Worker
325*bbecb9d1SAndroid Build Coastguard Worker vn_replace_vkGetVenusExperimentalFeatureData100000MESA_args_handle(args);
326*bbecb9d1SAndroid Build Coastguard Worker
327*bbecb9d1SAndroid Build Coastguard Worker if (!args->pData) {
328*bbecb9d1SAndroid Build Coastguard Worker *args->pDataSize = sizeof(features);
329*bbecb9d1SAndroid Build Coastguard Worker return;
330*bbecb9d1SAndroid Build Coastguard Worker }
331*bbecb9d1SAndroid Build Coastguard Worker
332*bbecb9d1SAndroid Build Coastguard Worker *args->pDataSize = MIN2(*args->pDataSize, sizeof(features));
333*bbecb9d1SAndroid Build Coastguard Worker memcpy(args->pData, &features, *args->pDataSize);
334*bbecb9d1SAndroid Build Coastguard Worker }
335*bbecb9d1SAndroid Build Coastguard Worker
336*bbecb9d1SAndroid Build Coastguard Worker void
vkr_context_init_transport_dispatch(struct vkr_context * ctx)337*bbecb9d1SAndroid Build Coastguard Worker vkr_context_init_transport_dispatch(struct vkr_context *ctx)
338*bbecb9d1SAndroid Build Coastguard Worker {
339*bbecb9d1SAndroid Build Coastguard Worker struct vn_dispatch_context *dispatch = &ctx->dispatch;
340*bbecb9d1SAndroid Build Coastguard Worker
341*bbecb9d1SAndroid Build Coastguard Worker dispatch->dispatch_vkSetReplyCommandStreamMESA =
342*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkSetReplyCommandStreamMESA;
343*bbecb9d1SAndroid Build Coastguard Worker dispatch->dispatch_vkSeekReplyCommandStreamMESA =
344*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkSeekReplyCommandStreamMESA;
345*bbecb9d1SAndroid Build Coastguard Worker dispatch->dispatch_vkExecuteCommandStreamsMESA =
346*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkExecuteCommandStreamsMESA;
347*bbecb9d1SAndroid Build Coastguard Worker dispatch->dispatch_vkCreateRingMESA = vkr_dispatch_vkCreateRingMESA;
348*bbecb9d1SAndroid Build Coastguard Worker dispatch->dispatch_vkDestroyRingMESA = vkr_dispatch_vkDestroyRingMESA;
349*bbecb9d1SAndroid Build Coastguard Worker dispatch->dispatch_vkNotifyRingMESA = vkr_dispatch_vkNotifyRingMESA;
350*bbecb9d1SAndroid Build Coastguard Worker dispatch->dispatch_vkWriteRingExtraMESA = vkr_dispatch_vkWriteRingExtraMESA;
351*bbecb9d1SAndroid Build Coastguard Worker
352*bbecb9d1SAndroid Build Coastguard Worker dispatch->dispatch_vkGetVenusExperimentalFeatureData100000MESA =
353*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkGetVenusExperimentalFeatureData100000MESA;
354*bbecb9d1SAndroid Build Coastguard Worker }
355