xref: /aosp_15_r20/external/mesa3d/src/virtio/vulkan/vn_ring.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2021 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 #ifndef VN_RING_H
7*61046927SAndroid Build Coastguard Worker #define VN_RING_H
8*61046927SAndroid Build Coastguard Worker 
9*61046927SAndroid Build Coastguard Worker #include "vn_common.h"
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker #include "vn_cs.h"
12*61046927SAndroid Build Coastguard Worker 
13*61046927SAndroid Build Coastguard Worker /**
14*61046927SAndroid Build Coastguard Worker  * A ring is a single-producer and single-consumer circular buffer.  The data
15*61046927SAndroid Build Coastguard Worker  * in the buffer are produced and consumed in order.  An externally-defined
16*61046927SAndroid Build Coastguard Worker  * mechanism is required for ring setup and notifications in both directions.
17*61046927SAndroid Build Coastguard Worker  * Notifications for new data from the producer are needed only when the
18*61046927SAndroid Build Coastguard Worker  * consumer is not actively polling, which is indicated by the ring status.
19*61046927SAndroid Build Coastguard Worker  *
20*61046927SAndroid Build Coastguard Worker  * For venus, the data are plain venus commands.  When a venus command is
21*61046927SAndroid Build Coastguard Worker  * consumed from the ring's perspective, there can still be ongoing CPU and/or
22*61046927SAndroid Build Coastguard Worker  * GPU works.  This is not an issue when the works generated by following
23*61046927SAndroid Build Coastguard Worker  * venus commands are correctly queued after the ongoing works.  There are
24*61046927SAndroid Build Coastguard Worker  * also venus commands that facilitate polling or waiting for ongoing works.
25*61046927SAndroid Build Coastguard Worker  */
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker /* the layout of a ring in a shmem */
28*61046927SAndroid Build Coastguard Worker struct vn_ring_layout {
29*61046927SAndroid Build Coastguard Worker    size_t head_offset;
30*61046927SAndroid Build Coastguard Worker    size_t tail_offset;
31*61046927SAndroid Build Coastguard Worker    size_t status_offset;
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker    size_t buffer_offset;
34*61046927SAndroid Build Coastguard Worker    size_t buffer_size;
35*61046927SAndroid Build Coastguard Worker 
36*61046927SAndroid Build Coastguard Worker    size_t extra_offset;
37*61046927SAndroid Build Coastguard Worker    size_t extra_size;
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker    size_t shmem_size;
40*61046927SAndroid Build Coastguard Worker };
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker void
43*61046927SAndroid Build Coastguard Worker vn_ring_get_layout(size_t buf_size,
44*61046927SAndroid Build Coastguard Worker                    size_t extra_size,
45*61046927SAndroid Build Coastguard Worker                    struct vn_ring_layout *layout);
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker struct vn_ring *
48*61046927SAndroid Build Coastguard Worker vn_ring_create(struct vn_instance *instance,
49*61046927SAndroid Build Coastguard Worker                const struct vn_ring_layout *layout,
50*61046927SAndroid Build Coastguard Worker                uint8_t direct_order,
51*61046927SAndroid Build Coastguard Worker                bool is_tls_ring);
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker void
54*61046927SAndroid Build Coastguard Worker vn_ring_destroy(struct vn_ring *ring);
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker uint64_t
57*61046927SAndroid Build Coastguard Worker vn_ring_get_id(struct vn_ring *ring);
58*61046927SAndroid Build Coastguard Worker 
59*61046927SAndroid Build Coastguard Worker uint32_t
60*61046927SAndroid Build Coastguard Worker vn_ring_load_status(const struct vn_ring *ring);
61*61046927SAndroid Build Coastguard Worker 
62*61046927SAndroid Build Coastguard Worker void
63*61046927SAndroid Build Coastguard Worker vn_ring_unset_status_bits(struct vn_ring *ring, uint32_t mask);
64*61046927SAndroid Build Coastguard Worker 
65*61046927SAndroid Build Coastguard Worker bool
66*61046927SAndroid Build Coastguard Worker vn_ring_get_seqno_status(struct vn_ring *ring, uint32_t seqno);
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker void
69*61046927SAndroid Build Coastguard Worker vn_ring_wait_all(struct vn_ring *ring);
70*61046927SAndroid Build Coastguard Worker 
71*61046927SAndroid Build Coastguard Worker struct vn_ring_submit_command {
72*61046927SAndroid Build Coastguard Worker    /* empty command implies errors */
73*61046927SAndroid Build Coastguard Worker    struct vn_cs_encoder command;
74*61046927SAndroid Build Coastguard Worker    struct vn_cs_encoder_buffer buffer;
75*61046927SAndroid Build Coastguard Worker    /* non-zero implies waiting */
76*61046927SAndroid Build Coastguard Worker    size_t reply_size;
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker    /* when reply_size is non-zero, NULL can be returned on errors */
79*61046927SAndroid Build Coastguard Worker    struct vn_renderer_shmem *reply_shmem;
80*61046927SAndroid Build Coastguard Worker    struct vn_cs_decoder reply;
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker    /* valid when ring submission succeeds */
83*61046927SAndroid Build Coastguard Worker    bool ring_seqno_valid;
84*61046927SAndroid Build Coastguard Worker    uint32_t ring_seqno;
85*61046927SAndroid Build Coastguard Worker };
86*61046927SAndroid Build Coastguard Worker 
87*61046927SAndroid Build Coastguard Worker static inline struct vn_cs_encoder *
vn_ring_submit_command_init(struct vn_ring * ring,struct vn_ring_submit_command * submit,void * cmd_data,size_t cmd_size,size_t reply_size)88*61046927SAndroid Build Coastguard Worker vn_ring_submit_command_init(struct vn_ring *ring,
89*61046927SAndroid Build Coastguard Worker                             struct vn_ring_submit_command *submit,
90*61046927SAndroid Build Coastguard Worker                             void *cmd_data,
91*61046927SAndroid Build Coastguard Worker                             size_t cmd_size,
92*61046927SAndroid Build Coastguard Worker                             size_t reply_size)
93*61046927SAndroid Build Coastguard Worker {
94*61046927SAndroid Build Coastguard Worker    submit->buffer = VN_CS_ENCODER_BUFFER_INITIALIZER(cmd_data);
95*61046927SAndroid Build Coastguard Worker    submit->command = VN_CS_ENCODER_INITIALIZER(&submit->buffer, cmd_size);
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker    submit->reply_size = reply_size;
98*61046927SAndroid Build Coastguard Worker    submit->reply_shmem = NULL;
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker    submit->ring_seqno_valid = false;
101*61046927SAndroid Build Coastguard Worker 
102*61046927SAndroid Build Coastguard Worker    return &submit->command;
103*61046927SAndroid Build Coastguard Worker }
104*61046927SAndroid Build Coastguard Worker 
105*61046927SAndroid Build Coastguard Worker static inline struct vn_cs_decoder *
vn_ring_get_command_reply(struct vn_ring * ring,struct vn_ring_submit_command * submit)106*61046927SAndroid Build Coastguard Worker vn_ring_get_command_reply(struct vn_ring *ring,
107*61046927SAndroid Build Coastguard Worker                           struct vn_ring_submit_command *submit)
108*61046927SAndroid Build Coastguard Worker {
109*61046927SAndroid Build Coastguard Worker    return submit->reply_shmem ? &submit->reply : NULL;
110*61046927SAndroid Build Coastguard Worker }
111*61046927SAndroid Build Coastguard Worker 
112*61046927SAndroid Build Coastguard Worker void
113*61046927SAndroid Build Coastguard Worker vn_ring_free_command_reply(struct vn_ring *ring,
114*61046927SAndroid Build Coastguard Worker                            struct vn_ring_submit_command *submit);
115*61046927SAndroid Build Coastguard Worker 
116*61046927SAndroid Build Coastguard Worker void
117*61046927SAndroid Build Coastguard Worker vn_ring_submit_command(struct vn_ring *ring,
118*61046927SAndroid Build Coastguard Worker                        struct vn_ring_submit_command *submit);
119*61046927SAndroid Build Coastguard Worker 
120*61046927SAndroid Build Coastguard Worker VkResult
121*61046927SAndroid Build Coastguard Worker vn_ring_submit_command_simple(struct vn_ring *ring,
122*61046927SAndroid Build Coastguard Worker                               const struct vn_cs_encoder *cs);
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker VkResult
125*61046927SAndroid Build Coastguard Worker vn_ring_submit_roundtrip(struct vn_ring *ring, uint64_t *roundtrip_seqno);
126*61046927SAndroid Build Coastguard Worker 
127*61046927SAndroid Build Coastguard Worker void
128*61046927SAndroid Build Coastguard Worker vn_ring_wait_roundtrip(struct vn_ring *ring, uint64_t roundtrip_seqno);
129*61046927SAndroid Build Coastguard Worker 
130*61046927SAndroid Build Coastguard Worker static inline void
vn_ring_roundtrip(struct vn_ring * ring)131*61046927SAndroid Build Coastguard Worker vn_ring_roundtrip(struct vn_ring *ring)
132*61046927SAndroid Build Coastguard Worker {
133*61046927SAndroid Build Coastguard Worker    uint64_t roundtrip_seqno;
134*61046927SAndroid Build Coastguard Worker    if (vn_ring_submit_roundtrip(ring, &roundtrip_seqno) == VK_SUCCESS)
135*61046927SAndroid Build Coastguard Worker       vn_ring_wait_roundtrip(ring, roundtrip_seqno);
136*61046927SAndroid Build Coastguard Worker }
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker #endif /* VN_RING_H */
139