xref: /aosp_15_r20/external/mesa3d/src/virtio/vulkan/vn_renderer.h (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 #ifndef VN_RENDERER_H
7*61046927SAndroid Build Coastguard Worker #define VN_RENDERER_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 struct vn_renderer_shmem {
12*61046927SAndroid Build Coastguard Worker    struct vn_refcount refcount;
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker    uint32_t res_id;
15*61046927SAndroid Build Coastguard Worker    size_t mmap_size; /* for internal use only (i.e., munmap) */
16*61046927SAndroid Build Coastguard Worker    void *mmap_ptr;
17*61046927SAndroid Build Coastguard Worker 
18*61046927SAndroid Build Coastguard Worker    struct list_head cache_head;
19*61046927SAndroid Build Coastguard Worker    int64_t cache_timestamp;
20*61046927SAndroid Build Coastguard Worker };
21*61046927SAndroid Build Coastguard Worker 
22*61046927SAndroid Build Coastguard Worker struct vn_renderer_bo {
23*61046927SAndroid Build Coastguard Worker    struct vn_refcount refcount;
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker    uint32_t res_id;
26*61046927SAndroid Build Coastguard Worker    /* for internal use only */
27*61046927SAndroid Build Coastguard Worker    size_t mmap_size;
28*61046927SAndroid Build Coastguard Worker    void *mmap_ptr;
29*61046927SAndroid Build Coastguard Worker };
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker /*
32*61046927SAndroid Build Coastguard Worker  * A sync consists of a uint64_t counter.  The counter can be updated by CPU
33*61046927SAndroid Build Coastguard Worker  * or by GPU.  It can also be waited on by CPU or by GPU until it reaches
34*61046927SAndroid Build Coastguard Worker  * certain values.
35*61046927SAndroid Build Coastguard Worker  *
36*61046927SAndroid Build Coastguard Worker  * This models after timeline VkSemaphore rather than timeline drm_syncobj.
37*61046927SAndroid Build Coastguard Worker  * The main difference is that drm_syncobj can have unsignaled value 0.
38*61046927SAndroid Build Coastguard Worker  */
39*61046927SAndroid Build Coastguard Worker struct vn_renderer_sync {
40*61046927SAndroid Build Coastguard Worker    uint32_t sync_id;
41*61046927SAndroid Build Coastguard Worker };
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker struct vn_renderer_info {
44*61046927SAndroid Build Coastguard Worker    struct {
45*61046927SAndroid Build Coastguard Worker       VkPhysicalDeviceDrmPropertiesEXT props;
46*61046927SAndroid Build Coastguard Worker    } drm;
47*61046927SAndroid Build Coastguard Worker 
48*61046927SAndroid Build Coastguard Worker    struct {
49*61046927SAndroid Build Coastguard Worker       uint16_t vendor_id;
50*61046927SAndroid Build Coastguard Worker       uint16_t device_id;
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker       bool has_bus_info;
53*61046927SAndroid Build Coastguard Worker       VkPhysicalDevicePCIBusInfoPropertiesEXT props;
54*61046927SAndroid Build Coastguard Worker    } pci;
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker    bool has_dma_buf_import;
57*61046927SAndroid Build Coastguard Worker    bool has_external_sync;
58*61046927SAndroid Build Coastguard Worker    bool has_implicit_fencing;
59*61046927SAndroid Build Coastguard Worker    bool has_guest_vram;
60*61046927SAndroid Build Coastguard Worker 
61*61046927SAndroid Build Coastguard Worker    uint32_t max_timeline_count;
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker    /* hw capset */
64*61046927SAndroid Build Coastguard Worker    uint32_t wire_format_version;
65*61046927SAndroid Build Coastguard Worker    uint32_t vk_xml_version;
66*61046927SAndroid Build Coastguard Worker    uint32_t vk_ext_command_serialization_spec_version;
67*61046927SAndroid Build Coastguard Worker    uint32_t vk_mesa_venus_protocol_spec_version;
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker    /* combined mask for vk_extension_mask1, 2,..., N */
70*61046927SAndroid Build Coastguard Worker    uint32_t vk_extension_mask[32];
71*61046927SAndroid Build Coastguard Worker };
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker struct vn_renderer_submit_batch {
74*61046927SAndroid Build Coastguard Worker    const void *cs_data;
75*61046927SAndroid Build Coastguard Worker    size_t cs_size;
76*61046927SAndroid Build Coastguard Worker 
77*61046927SAndroid Build Coastguard Worker    /*
78*61046927SAndroid Build Coastguard Worker     * Submit cs to the timeline identified by ring_idx. A timeline is
79*61046927SAndroid Build Coastguard Worker     * typically associated with a physical VkQueue and bound to the ring_idx
80*61046927SAndroid Build Coastguard Worker     * during VkQueue creation. After execution completes on the VkQueue, the
81*61046927SAndroid Build Coastguard Worker     * timeline sync point is signaled.
82*61046927SAndroid Build Coastguard Worker     *
83*61046927SAndroid Build Coastguard Worker     * ring_idx 0 is reserved for the context-specific CPU timeline. sync
84*61046927SAndroid Build Coastguard Worker     * points on the CPU timeline are signaled immediately after command
85*61046927SAndroid Build Coastguard Worker     * processing by the renderer.
86*61046927SAndroid Build Coastguard Worker     */
87*61046927SAndroid Build Coastguard Worker    uint32_t ring_idx;
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker    /* syncs to update when the timeline is signaled */
90*61046927SAndroid Build Coastguard Worker    struct vn_renderer_sync *const *syncs;
91*61046927SAndroid Build Coastguard Worker    /* TODO allow NULL when syncs are all binary? */
92*61046927SAndroid Build Coastguard Worker    const uint64_t *sync_values;
93*61046927SAndroid Build Coastguard Worker    uint32_t sync_count;
94*61046927SAndroid Build Coastguard Worker };
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker struct vn_renderer_submit {
97*61046927SAndroid Build Coastguard Worker    /* BOs to pin and to fence implicitly
98*61046927SAndroid Build Coastguard Worker     *
99*61046927SAndroid Build Coastguard Worker     * TODO track all bos and automatically pin them.  We don't do it yet
100*61046927SAndroid Build Coastguard Worker     * because each vn_command_buffer owns a bo.  We can probably make do by
101*61046927SAndroid Build Coastguard Worker     * returning the bos to a bo cache and exclude bo cache from pinning.
102*61046927SAndroid Build Coastguard Worker     */
103*61046927SAndroid Build Coastguard Worker    struct vn_renderer_bo *const *bos;
104*61046927SAndroid Build Coastguard Worker    uint32_t bo_count;
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker    const struct vn_renderer_submit_batch *batches;
107*61046927SAndroid Build Coastguard Worker    uint32_t batch_count;
108*61046927SAndroid Build Coastguard Worker };
109*61046927SAndroid Build Coastguard Worker 
110*61046927SAndroid Build Coastguard Worker struct vn_renderer_wait {
111*61046927SAndroid Build Coastguard Worker    bool wait_any;
112*61046927SAndroid Build Coastguard Worker    uint64_t timeout;
113*61046927SAndroid Build Coastguard Worker 
114*61046927SAndroid Build Coastguard Worker    struct vn_renderer_sync *const *syncs;
115*61046927SAndroid Build Coastguard Worker    /* TODO allow NULL when syncs are all binary? */
116*61046927SAndroid Build Coastguard Worker    const uint64_t *sync_values;
117*61046927SAndroid Build Coastguard Worker    uint32_t sync_count;
118*61046927SAndroid Build Coastguard Worker };
119*61046927SAndroid Build Coastguard Worker 
120*61046927SAndroid Build Coastguard Worker struct vn_renderer_ops {
121*61046927SAndroid Build Coastguard Worker    void (*destroy)(struct vn_renderer *renderer,
122*61046927SAndroid Build Coastguard Worker                    const VkAllocationCallbacks *alloc);
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker    VkResult (*submit)(struct vn_renderer *renderer,
125*61046927SAndroid Build Coastguard Worker                       const struct vn_renderer_submit *submit);
126*61046927SAndroid Build Coastguard Worker 
127*61046927SAndroid Build Coastguard Worker    /*
128*61046927SAndroid Build Coastguard Worker     * On success, returns VK_SUCCESS or VK_TIMEOUT.  On failure, returns
129*61046927SAndroid Build Coastguard Worker     * VK_ERROR_DEVICE_LOST or out of device/host memory.
130*61046927SAndroid Build Coastguard Worker     */
131*61046927SAndroid Build Coastguard Worker    VkResult (*wait)(struct vn_renderer *renderer,
132*61046927SAndroid Build Coastguard Worker                     const struct vn_renderer_wait *wait);
133*61046927SAndroid Build Coastguard Worker };
134*61046927SAndroid Build Coastguard Worker 
135*61046927SAndroid Build Coastguard Worker struct vn_renderer_shmem_ops {
136*61046927SAndroid Build Coastguard Worker    struct vn_renderer_shmem *(*create)(struct vn_renderer *renderer,
137*61046927SAndroid Build Coastguard Worker                                        size_t size);
138*61046927SAndroid Build Coastguard Worker    void (*destroy)(struct vn_renderer *renderer,
139*61046927SAndroid Build Coastguard Worker                    struct vn_renderer_shmem *shmem);
140*61046927SAndroid Build Coastguard Worker };
141*61046927SAndroid Build Coastguard Worker 
142*61046927SAndroid Build Coastguard Worker struct vn_renderer_bo_ops {
143*61046927SAndroid Build Coastguard Worker    VkResult (*create_from_device_memory)(
144*61046927SAndroid Build Coastguard Worker       struct vn_renderer *renderer,
145*61046927SAndroid Build Coastguard Worker       VkDeviceSize size,
146*61046927SAndroid Build Coastguard Worker       vn_object_id mem_id,
147*61046927SAndroid Build Coastguard Worker       VkMemoryPropertyFlags flags,
148*61046927SAndroid Build Coastguard Worker       VkExternalMemoryHandleTypeFlags external_handles,
149*61046927SAndroid Build Coastguard Worker       struct vn_renderer_bo **out_bo);
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker    VkResult (*create_from_dma_buf)(struct vn_renderer *renderer,
152*61046927SAndroid Build Coastguard Worker                                    VkDeviceSize size,
153*61046927SAndroid Build Coastguard Worker                                    int fd,
154*61046927SAndroid Build Coastguard Worker                                    VkMemoryPropertyFlags flags,
155*61046927SAndroid Build Coastguard Worker                                    struct vn_renderer_bo **out_bo);
156*61046927SAndroid Build Coastguard Worker 
157*61046927SAndroid Build Coastguard Worker    bool (*destroy)(struct vn_renderer *renderer, struct vn_renderer_bo *bo);
158*61046927SAndroid Build Coastguard Worker 
159*61046927SAndroid Build Coastguard Worker    int (*export_dma_buf)(struct vn_renderer *renderer,
160*61046927SAndroid Build Coastguard Worker                          struct vn_renderer_bo *bo);
161*61046927SAndroid Build Coastguard Worker 
162*61046927SAndroid Build Coastguard Worker    /* map is not thread-safe */
163*61046927SAndroid Build Coastguard Worker    void *(*map)(struct vn_renderer *renderer, struct vn_renderer_bo *bo);
164*61046927SAndroid Build Coastguard Worker 
165*61046927SAndroid Build Coastguard Worker    void (*flush)(struct vn_renderer *renderer,
166*61046927SAndroid Build Coastguard Worker                  struct vn_renderer_bo *bo,
167*61046927SAndroid Build Coastguard Worker                  VkDeviceSize offset,
168*61046927SAndroid Build Coastguard Worker                  VkDeviceSize size);
169*61046927SAndroid Build Coastguard Worker    void (*invalidate)(struct vn_renderer *renderer,
170*61046927SAndroid Build Coastguard Worker                       struct vn_renderer_bo *bo,
171*61046927SAndroid Build Coastguard Worker                       VkDeviceSize offset,
172*61046927SAndroid Build Coastguard Worker                       VkDeviceSize size);
173*61046927SAndroid Build Coastguard Worker };
174*61046927SAndroid Build Coastguard Worker 
175*61046927SAndroid Build Coastguard Worker enum vn_renderer_sync_flags {
176*61046927SAndroid Build Coastguard Worker    VN_RENDERER_SYNC_SHAREABLE = 1u << 0,
177*61046927SAndroid Build Coastguard Worker    VN_RENDERER_SYNC_BINARY = 1u << 1,
178*61046927SAndroid Build Coastguard Worker };
179*61046927SAndroid Build Coastguard Worker 
180*61046927SAndroid Build Coastguard Worker struct vn_renderer_sync_ops {
181*61046927SAndroid Build Coastguard Worker    VkResult (*create)(struct vn_renderer *renderer,
182*61046927SAndroid Build Coastguard Worker                       uint64_t initial_val,
183*61046927SAndroid Build Coastguard Worker                       uint32_t flags,
184*61046927SAndroid Build Coastguard Worker                       struct vn_renderer_sync **out_sync);
185*61046927SAndroid Build Coastguard Worker 
186*61046927SAndroid Build Coastguard Worker    VkResult (*create_from_syncobj)(struct vn_renderer *renderer,
187*61046927SAndroid Build Coastguard Worker                                    int fd,
188*61046927SAndroid Build Coastguard Worker                                    bool sync_file,
189*61046927SAndroid Build Coastguard Worker                                    struct vn_renderer_sync **out_sync);
190*61046927SAndroid Build Coastguard Worker    void (*destroy)(struct vn_renderer *renderer,
191*61046927SAndroid Build Coastguard Worker                    struct vn_renderer_sync *sync);
192*61046927SAndroid Build Coastguard Worker 
193*61046927SAndroid Build Coastguard Worker    int (*export_syncobj)(struct vn_renderer *renderer,
194*61046927SAndroid Build Coastguard Worker                          struct vn_renderer_sync *sync,
195*61046927SAndroid Build Coastguard Worker                          bool sync_file);
196*61046927SAndroid Build Coastguard Worker 
197*61046927SAndroid Build Coastguard Worker    /* reset the counter */
198*61046927SAndroid Build Coastguard Worker    VkResult (*reset)(struct vn_renderer *renderer,
199*61046927SAndroid Build Coastguard Worker                      struct vn_renderer_sync *sync,
200*61046927SAndroid Build Coastguard Worker                      uint64_t initial_val);
201*61046927SAndroid Build Coastguard Worker 
202*61046927SAndroid Build Coastguard Worker    /* read the current value from the counter */
203*61046927SAndroid Build Coastguard Worker    VkResult (*read)(struct vn_renderer *renderer,
204*61046927SAndroid Build Coastguard Worker                     struct vn_renderer_sync *sync,
205*61046927SAndroid Build Coastguard Worker                     uint64_t *val);
206*61046927SAndroid Build Coastguard Worker 
207*61046927SAndroid Build Coastguard Worker    /* write a new value (larger than the current one) to the counter */
208*61046927SAndroid Build Coastguard Worker    VkResult (*write)(struct vn_renderer *renderer,
209*61046927SAndroid Build Coastguard Worker                      struct vn_renderer_sync *sync,
210*61046927SAndroid Build Coastguard Worker                      uint64_t val);
211*61046927SAndroid Build Coastguard Worker };
212*61046927SAndroid Build Coastguard Worker 
213*61046927SAndroid Build Coastguard Worker struct vn_renderer {
214*61046927SAndroid Build Coastguard Worker    struct vn_renderer_info info;
215*61046927SAndroid Build Coastguard Worker    struct vn_renderer_ops ops;
216*61046927SAndroid Build Coastguard Worker    struct vn_renderer_shmem_ops shmem_ops;
217*61046927SAndroid Build Coastguard Worker    struct vn_renderer_bo_ops bo_ops;
218*61046927SAndroid Build Coastguard Worker    struct vn_renderer_sync_ops sync_ops;
219*61046927SAndroid Build Coastguard Worker };
220*61046927SAndroid Build Coastguard Worker 
221*61046927SAndroid Build Coastguard Worker VkResult
222*61046927SAndroid Build Coastguard Worker vn_renderer_create_virtgpu(struct vn_instance *instance,
223*61046927SAndroid Build Coastguard Worker                            const VkAllocationCallbacks *alloc,
224*61046927SAndroid Build Coastguard Worker                            struct vn_renderer **renderer);
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker VkResult
227*61046927SAndroid Build Coastguard Worker vn_renderer_create_vtest(struct vn_instance *instance,
228*61046927SAndroid Build Coastguard Worker                          const VkAllocationCallbacks *alloc,
229*61046927SAndroid Build Coastguard Worker                          struct vn_renderer **renderer);
230*61046927SAndroid Build Coastguard Worker 
231*61046927SAndroid Build Coastguard Worker static inline VkResult
vn_renderer_create(struct vn_instance * instance,const VkAllocationCallbacks * alloc,struct vn_renderer ** renderer)232*61046927SAndroid Build Coastguard Worker vn_renderer_create(struct vn_instance *instance,
233*61046927SAndroid Build Coastguard Worker                    const VkAllocationCallbacks *alloc,
234*61046927SAndroid Build Coastguard Worker                    struct vn_renderer **renderer)
235*61046927SAndroid Build Coastguard Worker {
236*61046927SAndroid Build Coastguard Worker    if (VN_DEBUG(VTEST)) {
237*61046927SAndroid Build Coastguard Worker       VkResult result = vn_renderer_create_vtest(instance, alloc, renderer);
238*61046927SAndroid Build Coastguard Worker       if (result == VK_SUCCESS)
239*61046927SAndroid Build Coastguard Worker          return VK_SUCCESS;
240*61046927SAndroid Build Coastguard Worker    }
241*61046927SAndroid Build Coastguard Worker 
242*61046927SAndroid Build Coastguard Worker    return vn_renderer_create_virtgpu(instance, alloc, renderer);
243*61046927SAndroid Build Coastguard Worker }
244*61046927SAndroid Build Coastguard Worker 
245*61046927SAndroid Build Coastguard Worker static inline void
vn_renderer_destroy(struct vn_renderer * renderer,const VkAllocationCallbacks * alloc)246*61046927SAndroid Build Coastguard Worker vn_renderer_destroy(struct vn_renderer *renderer,
247*61046927SAndroid Build Coastguard Worker                     const VkAllocationCallbacks *alloc)
248*61046927SAndroid Build Coastguard Worker {
249*61046927SAndroid Build Coastguard Worker    renderer->ops.destroy(renderer, alloc);
250*61046927SAndroid Build Coastguard Worker }
251*61046927SAndroid Build Coastguard Worker 
252*61046927SAndroid Build Coastguard Worker static inline VkResult
vn_renderer_submit(struct vn_renderer * renderer,const struct vn_renderer_submit * submit)253*61046927SAndroid Build Coastguard Worker vn_renderer_submit(struct vn_renderer *renderer,
254*61046927SAndroid Build Coastguard Worker                    const struct vn_renderer_submit *submit)
255*61046927SAndroid Build Coastguard Worker {
256*61046927SAndroid Build Coastguard Worker    return renderer->ops.submit(renderer, submit);
257*61046927SAndroid Build Coastguard Worker }
258*61046927SAndroid Build Coastguard Worker 
259*61046927SAndroid Build Coastguard Worker static inline VkResult
vn_renderer_wait(struct vn_renderer * renderer,const struct vn_renderer_wait * wait)260*61046927SAndroid Build Coastguard Worker vn_renderer_wait(struct vn_renderer *renderer,
261*61046927SAndroid Build Coastguard Worker                  const struct vn_renderer_wait *wait)
262*61046927SAndroid Build Coastguard Worker {
263*61046927SAndroid Build Coastguard Worker    return renderer->ops.wait(renderer, wait);
264*61046927SAndroid Build Coastguard Worker }
265*61046927SAndroid Build Coastguard Worker 
266*61046927SAndroid Build Coastguard Worker static inline struct vn_renderer_shmem *
vn_renderer_shmem_create(struct vn_renderer * renderer,size_t size)267*61046927SAndroid Build Coastguard Worker vn_renderer_shmem_create(struct vn_renderer *renderer, size_t size)
268*61046927SAndroid Build Coastguard Worker {
269*61046927SAndroid Build Coastguard Worker    VN_TRACE_FUNC();
270*61046927SAndroid Build Coastguard Worker    struct vn_renderer_shmem *shmem =
271*61046927SAndroid Build Coastguard Worker       renderer->shmem_ops.create(renderer, size);
272*61046927SAndroid Build Coastguard Worker    if (shmem) {
273*61046927SAndroid Build Coastguard Worker       assert(vn_refcount_is_valid(&shmem->refcount));
274*61046927SAndroid Build Coastguard Worker       assert(shmem->res_id);
275*61046927SAndroid Build Coastguard Worker       assert(shmem->mmap_size >= size);
276*61046927SAndroid Build Coastguard Worker       assert(shmem->mmap_ptr);
277*61046927SAndroid Build Coastguard Worker    }
278*61046927SAndroid Build Coastguard Worker 
279*61046927SAndroid Build Coastguard Worker    return shmem;
280*61046927SAndroid Build Coastguard Worker }
281*61046927SAndroid Build Coastguard Worker 
282*61046927SAndroid Build Coastguard Worker static inline struct vn_renderer_shmem *
vn_renderer_shmem_ref(struct vn_renderer * renderer,struct vn_renderer_shmem * shmem)283*61046927SAndroid Build Coastguard Worker vn_renderer_shmem_ref(struct vn_renderer *renderer,
284*61046927SAndroid Build Coastguard Worker                       struct vn_renderer_shmem *shmem)
285*61046927SAndroid Build Coastguard Worker {
286*61046927SAndroid Build Coastguard Worker    vn_refcount_inc(&shmem->refcount);
287*61046927SAndroid Build Coastguard Worker    return shmem;
288*61046927SAndroid Build Coastguard Worker }
289*61046927SAndroid Build Coastguard Worker 
290*61046927SAndroid Build Coastguard Worker static inline void
vn_renderer_shmem_unref(struct vn_renderer * renderer,struct vn_renderer_shmem * shmem)291*61046927SAndroid Build Coastguard Worker vn_renderer_shmem_unref(struct vn_renderer *renderer,
292*61046927SAndroid Build Coastguard Worker                         struct vn_renderer_shmem *shmem)
293*61046927SAndroid Build Coastguard Worker {
294*61046927SAndroid Build Coastguard Worker    if (vn_refcount_dec(&shmem->refcount))
295*61046927SAndroid Build Coastguard Worker       renderer->shmem_ops.destroy(renderer, shmem);
296*61046927SAndroid Build Coastguard Worker }
297*61046927SAndroid Build Coastguard Worker 
298*61046927SAndroid Build Coastguard Worker static inline VkResult
vn_renderer_bo_create_from_device_memory(struct vn_renderer * renderer,VkDeviceSize size,vn_object_id mem_id,VkMemoryPropertyFlags flags,VkExternalMemoryHandleTypeFlags external_handles,struct vn_renderer_bo ** out_bo)299*61046927SAndroid Build Coastguard Worker vn_renderer_bo_create_from_device_memory(
300*61046927SAndroid Build Coastguard Worker    struct vn_renderer *renderer,
301*61046927SAndroid Build Coastguard Worker    VkDeviceSize size,
302*61046927SAndroid Build Coastguard Worker    vn_object_id mem_id,
303*61046927SAndroid Build Coastguard Worker    VkMemoryPropertyFlags flags,
304*61046927SAndroid Build Coastguard Worker    VkExternalMemoryHandleTypeFlags external_handles,
305*61046927SAndroid Build Coastguard Worker    struct vn_renderer_bo **out_bo)
306*61046927SAndroid Build Coastguard Worker {
307*61046927SAndroid Build Coastguard Worker    struct vn_renderer_bo *bo;
308*61046927SAndroid Build Coastguard Worker    VkResult result = renderer->bo_ops.create_from_device_memory(
309*61046927SAndroid Build Coastguard Worker       renderer, size, mem_id, flags, external_handles, &bo);
310*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
311*61046927SAndroid Build Coastguard Worker       return result;
312*61046927SAndroid Build Coastguard Worker 
313*61046927SAndroid Build Coastguard Worker    assert(vn_refcount_is_valid(&bo->refcount));
314*61046927SAndroid Build Coastguard Worker    assert(bo->res_id);
315*61046927SAndroid Build Coastguard Worker    assert(!bo->mmap_size || bo->mmap_size >= size);
316*61046927SAndroid Build Coastguard Worker 
317*61046927SAndroid Build Coastguard Worker    *out_bo = bo;
318*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
319*61046927SAndroid Build Coastguard Worker }
320*61046927SAndroid Build Coastguard Worker 
321*61046927SAndroid Build Coastguard Worker static inline VkResult
vn_renderer_bo_create_from_dma_buf(struct vn_renderer * renderer,VkDeviceSize size,int fd,VkMemoryPropertyFlags flags,struct vn_renderer_bo ** out_bo)322*61046927SAndroid Build Coastguard Worker vn_renderer_bo_create_from_dma_buf(struct vn_renderer *renderer,
323*61046927SAndroid Build Coastguard Worker                                    VkDeviceSize size,
324*61046927SAndroid Build Coastguard Worker                                    int fd,
325*61046927SAndroid Build Coastguard Worker                                    VkMemoryPropertyFlags flags,
326*61046927SAndroid Build Coastguard Worker                                    struct vn_renderer_bo **out_bo)
327*61046927SAndroid Build Coastguard Worker {
328*61046927SAndroid Build Coastguard Worker    struct vn_renderer_bo *bo;
329*61046927SAndroid Build Coastguard Worker    VkResult result =
330*61046927SAndroid Build Coastguard Worker       renderer->bo_ops.create_from_dma_buf(renderer, size, fd, flags, &bo);
331*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
332*61046927SAndroid Build Coastguard Worker       return result;
333*61046927SAndroid Build Coastguard Worker 
334*61046927SAndroid Build Coastguard Worker    assert(vn_refcount_is_valid(&bo->refcount));
335*61046927SAndroid Build Coastguard Worker    assert(bo->res_id);
336*61046927SAndroid Build Coastguard Worker    assert(!bo->mmap_size || bo->mmap_size >= size);
337*61046927SAndroid Build Coastguard Worker 
338*61046927SAndroid Build Coastguard Worker    *out_bo = bo;
339*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
340*61046927SAndroid Build Coastguard Worker }
341*61046927SAndroid Build Coastguard Worker 
342*61046927SAndroid Build Coastguard Worker static inline struct vn_renderer_bo *
vn_renderer_bo_ref(struct vn_renderer * renderer,struct vn_renderer_bo * bo)343*61046927SAndroid Build Coastguard Worker vn_renderer_bo_ref(struct vn_renderer *renderer, struct vn_renderer_bo *bo)
344*61046927SAndroid Build Coastguard Worker {
345*61046927SAndroid Build Coastguard Worker    vn_refcount_inc(&bo->refcount);
346*61046927SAndroid Build Coastguard Worker    return bo;
347*61046927SAndroid Build Coastguard Worker }
348*61046927SAndroid Build Coastguard Worker 
349*61046927SAndroid Build Coastguard Worker static inline bool
vn_renderer_bo_unref(struct vn_renderer * renderer,struct vn_renderer_bo * bo)350*61046927SAndroid Build Coastguard Worker vn_renderer_bo_unref(struct vn_renderer *renderer, struct vn_renderer_bo *bo)
351*61046927SAndroid Build Coastguard Worker {
352*61046927SAndroid Build Coastguard Worker    if (vn_refcount_dec(&bo->refcount))
353*61046927SAndroid Build Coastguard Worker       return renderer->bo_ops.destroy(renderer, bo);
354*61046927SAndroid Build Coastguard Worker    return false;
355*61046927SAndroid Build Coastguard Worker }
356*61046927SAndroid Build Coastguard Worker 
357*61046927SAndroid Build Coastguard Worker static inline int
vn_renderer_bo_export_dma_buf(struct vn_renderer * renderer,struct vn_renderer_bo * bo)358*61046927SAndroid Build Coastguard Worker vn_renderer_bo_export_dma_buf(struct vn_renderer *renderer,
359*61046927SAndroid Build Coastguard Worker                               struct vn_renderer_bo *bo)
360*61046927SAndroid Build Coastguard Worker {
361*61046927SAndroid Build Coastguard Worker    return renderer->bo_ops.export_dma_buf(renderer, bo);
362*61046927SAndroid Build Coastguard Worker }
363*61046927SAndroid Build Coastguard Worker 
364*61046927SAndroid Build Coastguard Worker static inline void *
vn_renderer_bo_map(struct vn_renderer * renderer,struct vn_renderer_bo * bo)365*61046927SAndroid Build Coastguard Worker vn_renderer_bo_map(struct vn_renderer *renderer, struct vn_renderer_bo *bo)
366*61046927SAndroid Build Coastguard Worker {
367*61046927SAndroid Build Coastguard Worker    return renderer->bo_ops.map(renderer, bo);
368*61046927SAndroid Build Coastguard Worker }
369*61046927SAndroid Build Coastguard Worker 
370*61046927SAndroid Build Coastguard Worker static inline void
vn_renderer_bo_flush(struct vn_renderer * renderer,struct vn_renderer_bo * bo,VkDeviceSize offset,VkDeviceSize end)371*61046927SAndroid Build Coastguard Worker vn_renderer_bo_flush(struct vn_renderer *renderer,
372*61046927SAndroid Build Coastguard Worker                      struct vn_renderer_bo *bo,
373*61046927SAndroid Build Coastguard Worker                      VkDeviceSize offset,
374*61046927SAndroid Build Coastguard Worker                      VkDeviceSize end)
375*61046927SAndroid Build Coastguard Worker {
376*61046927SAndroid Build Coastguard Worker    renderer->bo_ops.flush(renderer, bo, offset, end);
377*61046927SAndroid Build Coastguard Worker }
378*61046927SAndroid Build Coastguard Worker 
379*61046927SAndroid Build Coastguard Worker static inline void
vn_renderer_bo_invalidate(struct vn_renderer * renderer,struct vn_renderer_bo * bo,VkDeviceSize offset,VkDeviceSize size)380*61046927SAndroid Build Coastguard Worker vn_renderer_bo_invalidate(struct vn_renderer *renderer,
381*61046927SAndroid Build Coastguard Worker                           struct vn_renderer_bo *bo,
382*61046927SAndroid Build Coastguard Worker                           VkDeviceSize offset,
383*61046927SAndroid Build Coastguard Worker                           VkDeviceSize size)
384*61046927SAndroid Build Coastguard Worker {
385*61046927SAndroid Build Coastguard Worker    renderer->bo_ops.invalidate(renderer, bo, offset, size);
386*61046927SAndroid Build Coastguard Worker }
387*61046927SAndroid Build Coastguard Worker 
388*61046927SAndroid Build Coastguard Worker static inline VkResult
vn_renderer_sync_create(struct vn_renderer * renderer,uint64_t initial_val,uint32_t flags,struct vn_renderer_sync ** out_sync)389*61046927SAndroid Build Coastguard Worker vn_renderer_sync_create(struct vn_renderer *renderer,
390*61046927SAndroid Build Coastguard Worker                         uint64_t initial_val,
391*61046927SAndroid Build Coastguard Worker                         uint32_t flags,
392*61046927SAndroid Build Coastguard Worker                         struct vn_renderer_sync **out_sync)
393*61046927SAndroid Build Coastguard Worker {
394*61046927SAndroid Build Coastguard Worker    return renderer->sync_ops.create(renderer, initial_val, flags, out_sync);
395*61046927SAndroid Build Coastguard Worker }
396*61046927SAndroid Build Coastguard Worker 
397*61046927SAndroid Build Coastguard Worker static inline VkResult
vn_renderer_sync_create_from_syncobj(struct vn_renderer * renderer,int fd,bool sync_file,struct vn_renderer_sync ** out_sync)398*61046927SAndroid Build Coastguard Worker vn_renderer_sync_create_from_syncobj(struct vn_renderer *renderer,
399*61046927SAndroid Build Coastguard Worker                                      int fd,
400*61046927SAndroid Build Coastguard Worker                                      bool sync_file,
401*61046927SAndroid Build Coastguard Worker                                      struct vn_renderer_sync **out_sync)
402*61046927SAndroid Build Coastguard Worker {
403*61046927SAndroid Build Coastguard Worker    return renderer->sync_ops.create_from_syncobj(renderer, fd, sync_file,
404*61046927SAndroid Build Coastguard Worker                                                  out_sync);
405*61046927SAndroid Build Coastguard Worker }
406*61046927SAndroid Build Coastguard Worker 
407*61046927SAndroid Build Coastguard Worker static inline void
vn_renderer_sync_destroy(struct vn_renderer * renderer,struct vn_renderer_sync * sync)408*61046927SAndroid Build Coastguard Worker vn_renderer_sync_destroy(struct vn_renderer *renderer,
409*61046927SAndroid Build Coastguard Worker                          struct vn_renderer_sync *sync)
410*61046927SAndroid Build Coastguard Worker {
411*61046927SAndroid Build Coastguard Worker    renderer->sync_ops.destroy(renderer, sync);
412*61046927SAndroid Build Coastguard Worker }
413*61046927SAndroid Build Coastguard Worker 
414*61046927SAndroid Build Coastguard Worker static inline int
vn_renderer_sync_export_syncobj(struct vn_renderer * renderer,struct vn_renderer_sync * sync,bool sync_file)415*61046927SAndroid Build Coastguard Worker vn_renderer_sync_export_syncobj(struct vn_renderer *renderer,
416*61046927SAndroid Build Coastguard Worker                                 struct vn_renderer_sync *sync,
417*61046927SAndroid Build Coastguard Worker                                 bool sync_file)
418*61046927SAndroid Build Coastguard Worker {
419*61046927SAndroid Build Coastguard Worker    return renderer->sync_ops.export_syncobj(renderer, sync, sync_file);
420*61046927SAndroid Build Coastguard Worker }
421*61046927SAndroid Build Coastguard Worker 
422*61046927SAndroid Build Coastguard Worker static inline VkResult
vn_renderer_sync_reset(struct vn_renderer * renderer,struct vn_renderer_sync * sync,uint64_t initial_val)423*61046927SAndroid Build Coastguard Worker vn_renderer_sync_reset(struct vn_renderer *renderer,
424*61046927SAndroid Build Coastguard Worker                        struct vn_renderer_sync *sync,
425*61046927SAndroid Build Coastguard Worker                        uint64_t initial_val)
426*61046927SAndroid Build Coastguard Worker {
427*61046927SAndroid Build Coastguard Worker    return renderer->sync_ops.reset(renderer, sync, initial_val);
428*61046927SAndroid Build Coastguard Worker }
429*61046927SAndroid Build Coastguard Worker 
430*61046927SAndroid Build Coastguard Worker static inline VkResult
vn_renderer_sync_read(struct vn_renderer * renderer,struct vn_renderer_sync * sync,uint64_t * val)431*61046927SAndroid Build Coastguard Worker vn_renderer_sync_read(struct vn_renderer *renderer,
432*61046927SAndroid Build Coastguard Worker                       struct vn_renderer_sync *sync,
433*61046927SAndroid Build Coastguard Worker                       uint64_t *val)
434*61046927SAndroid Build Coastguard Worker {
435*61046927SAndroid Build Coastguard Worker    return renderer->sync_ops.read(renderer, sync, val);
436*61046927SAndroid Build Coastguard Worker }
437*61046927SAndroid Build Coastguard Worker 
438*61046927SAndroid Build Coastguard Worker static inline VkResult
vn_renderer_sync_write(struct vn_renderer * renderer,struct vn_renderer_sync * sync,uint64_t val)439*61046927SAndroid Build Coastguard Worker vn_renderer_sync_write(struct vn_renderer *renderer,
440*61046927SAndroid Build Coastguard Worker                        struct vn_renderer_sync *sync,
441*61046927SAndroid Build Coastguard Worker                        uint64_t val)
442*61046927SAndroid Build Coastguard Worker {
443*61046927SAndroid Build Coastguard Worker    return renderer->sync_ops.write(renderer, sync, val);
444*61046927SAndroid Build Coastguard Worker }
445*61046927SAndroid Build Coastguard Worker 
446*61046927SAndroid Build Coastguard Worker #endif /* VN_RENDERER_H */
447