xref: /aosp_15_r20/external/virglrenderer/src/virgl_resource.h (revision bbecb9d118dfdb95f99bd754f8fa9be01f189df3)
1*bbecb9d1SAndroid Build Coastguard Worker /**************************************************************************
2*bbecb9d1SAndroid Build Coastguard Worker  *
3*bbecb9d1SAndroid Build Coastguard Worker  * Copyright (C) 2020 Chromium
4*bbecb9d1SAndroid Build Coastguard Worker  *
5*bbecb9d1SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
6*bbecb9d1SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
7*bbecb9d1SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
8*bbecb9d1SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*bbecb9d1SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
10*bbecb9d1SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
11*bbecb9d1SAndroid Build Coastguard Worker  *
12*bbecb9d1SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included
13*bbecb9d1SAndroid Build Coastguard Worker  * in all copies or substantial portions of the Software.
14*bbecb9d1SAndroid Build Coastguard Worker  *
15*bbecb9d1SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16*bbecb9d1SAndroid Build Coastguard Worker  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*bbecb9d1SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*bbecb9d1SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19*bbecb9d1SAndroid Build Coastguard Worker  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20*bbecb9d1SAndroid Build Coastguard Worker  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21*bbecb9d1SAndroid Build Coastguard Worker  * OTHER DEALINGS IN THE SOFTWARE.
22*bbecb9d1SAndroid Build Coastguard Worker  *
23*bbecb9d1SAndroid Build Coastguard Worker  **************************************************************************/
24*bbecb9d1SAndroid Build Coastguard Worker 
25*bbecb9d1SAndroid Build Coastguard Worker #ifndef VIRGL_RESOURCE_H
26*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RESOURCE_H
27*bbecb9d1SAndroid Build Coastguard Worker 
28*bbecb9d1SAndroid Build Coastguard Worker #include <stdint.h>
29*bbecb9d1SAndroid Build Coastguard Worker 
30*bbecb9d1SAndroid Build Coastguard Worker struct iovec;
31*bbecb9d1SAndroid Build Coastguard Worker struct pipe_resource;
32*bbecb9d1SAndroid Build Coastguard Worker struct virgl_context;
33*bbecb9d1SAndroid Build Coastguard Worker 
34*bbecb9d1SAndroid Build Coastguard Worker enum virgl_resource_fd_type {
35*bbecb9d1SAndroid Build Coastguard Worker    VIRGL_RESOURCE_FD_DMABUF,
36*bbecb9d1SAndroid Build Coastguard Worker    VIRGL_RESOURCE_FD_OPAQUE,
37*bbecb9d1SAndroid Build Coastguard Worker    /* mmap()-able, usually memfd or shm */
38*bbecb9d1SAndroid Build Coastguard Worker    VIRGL_RESOURCE_FD_SHM,
39*bbecb9d1SAndroid Build Coastguard Worker 
40*bbecb9d1SAndroid Build Coastguard Worker    /**
41*bbecb9d1SAndroid Build Coastguard Worker     * An opaque handle can be something like a GEM handle, from which a
42*bbecb9d1SAndroid Build Coastguard Worker     * fd can be created upon demand.
43*bbecb9d1SAndroid Build Coastguard Worker     *
44*bbecb9d1SAndroid Build Coastguard Worker     * Renderers which use this type must implement virgl_context::export_fd
45*bbecb9d1SAndroid Build Coastguard Worker     *
46*bbecb9d1SAndroid Build Coastguard Worker     * Do not use this type for resources that are _BLOB_FLAG_USE_SHAREABLE,
47*bbecb9d1SAndroid Build Coastguard Worker     * as the opaque handle can become invalid/stale any time outside of the
48*bbecb9d1SAndroid Build Coastguard Worker     * original context.
49*bbecb9d1SAndroid Build Coastguard Worker     */
50*bbecb9d1SAndroid Build Coastguard Worker    VIRGL_RESOURCE_OPAQUE_HANDLE,
51*bbecb9d1SAndroid Build Coastguard Worker 
52*bbecb9d1SAndroid Build Coastguard Worker    VIRGL_RESOURCE_FD_INVALID = -1,
53*bbecb9d1SAndroid Build Coastguard Worker };
54*bbecb9d1SAndroid Build Coastguard Worker 
55*bbecb9d1SAndroid Build Coastguard Worker struct virgl_resource_opaque_fd_metadata {
56*bbecb9d1SAndroid Build Coastguard Worker     uint8_t driver_uuid[16];
57*bbecb9d1SAndroid Build Coastguard Worker     uint8_t device_uuid[16];
58*bbecb9d1SAndroid Build Coastguard Worker     uint64_t allocation_size;
59*bbecb9d1SAndroid Build Coastguard Worker     uint32_t memory_type_index;
60*bbecb9d1SAndroid Build Coastguard Worker };
61*bbecb9d1SAndroid Build Coastguard Worker 
62*bbecb9d1SAndroid Build Coastguard Worker /**
63*bbecb9d1SAndroid Build Coastguard Worker  * A global cross-context resource.  A virgl_resource is not directly usable
64*bbecb9d1SAndroid Build Coastguard Worker  * by renderer contexts, but must be attached and imported into renderer
65*bbecb9d1SAndroid Build Coastguard Worker  * contexts to create context objects first.  For example, it can be attached
66*bbecb9d1SAndroid Build Coastguard Worker  * and imported into a vrend_decode_ctx to create a vrend_resource.
67*bbecb9d1SAndroid Build Coastguard Worker  *
68*bbecb9d1SAndroid Build Coastguard Worker  * It is also possible to create a virgl_resource from a context object.
69*bbecb9d1SAndroid Build Coastguard Worker  *
70*bbecb9d1SAndroid Build Coastguard Worker  * The underlying storage of a virgl_resource is provided by a pipe_resource
71*bbecb9d1SAndroid Build Coastguard Worker  * and/or a fd.  When it is provided by a pipe_resource, the virgl_resource is
72*bbecb9d1SAndroid Build Coastguard Worker  * said to be typed because pipe_resource also provides the type information.
73*bbecb9d1SAndroid Build Coastguard Worker  *
74*bbecb9d1SAndroid Build Coastguard Worker  * Conventional resources are always typed.  Blob resources by definition do
75*bbecb9d1SAndroid Build Coastguard Worker  * not have nor need type information, but those created from vrend_decode_ctx
76*bbecb9d1SAndroid Build Coastguard Worker  * objects are typed.  That should be considered a convenience rather than
77*bbecb9d1SAndroid Build Coastguard Worker  * something to be relied upon.  Contexts must not assume that every resource is
78*bbecb9d1SAndroid Build Coastguard Worker  * typed when interop is expected.
79*bbecb9d1SAndroid Build Coastguard Worker  */
80*bbecb9d1SAndroid Build Coastguard Worker struct virgl_resource {
81*bbecb9d1SAndroid Build Coastguard Worker    uint32_t res_id;
82*bbecb9d1SAndroid Build Coastguard Worker 
83*bbecb9d1SAndroid Build Coastguard Worker    struct pipe_resource *pipe_resource;
84*bbecb9d1SAndroid Build Coastguard Worker 
85*bbecb9d1SAndroid Build Coastguard Worker    /* valid fd or handle type: */
86*bbecb9d1SAndroid Build Coastguard Worker    enum virgl_resource_fd_type fd_type;
87*bbecb9d1SAndroid Build Coastguard Worker    int fd;
88*bbecb9d1SAndroid Build Coastguard Worker 
89*bbecb9d1SAndroid Build Coastguard Worker    /**
90*bbecb9d1SAndroid Build Coastguard Worker     * For fd_type==VIRGL_RESOURCE_OPAQUE_HANDLE, the id of the context
91*bbecb9d1SAndroid Build Coastguard Worker     * which created this resource
92*bbecb9d1SAndroid Build Coastguard Worker     */
93*bbecb9d1SAndroid Build Coastguard Worker    uint32_t opaque_handle_context_id;
94*bbecb9d1SAndroid Build Coastguard Worker    uint32_t opaque_handle;
95*bbecb9d1SAndroid Build Coastguard Worker 
96*bbecb9d1SAndroid Build Coastguard Worker    const struct iovec *iov;
97*bbecb9d1SAndroid Build Coastguard Worker    int iov_count;
98*bbecb9d1SAndroid Build Coastguard Worker 
99*bbecb9d1SAndroid Build Coastguard Worker    uint32_t map_info;
100*bbecb9d1SAndroid Build Coastguard Worker 
101*bbecb9d1SAndroid Build Coastguard Worker    uint64_t map_size;
102*bbecb9d1SAndroid Build Coastguard Worker    void *mapped;
103*bbecb9d1SAndroid Build Coastguard Worker 
104*bbecb9d1SAndroid Build Coastguard Worker    struct virgl_resource_opaque_fd_metadata opaque_fd_metadata;
105*bbecb9d1SAndroid Build Coastguard Worker 
106*bbecb9d1SAndroid Build Coastguard Worker    void *private_data;
107*bbecb9d1SAndroid Build Coastguard Worker };
108*bbecb9d1SAndroid Build Coastguard Worker 
109*bbecb9d1SAndroid Build Coastguard Worker struct virgl_resource_pipe_callbacks {
110*bbecb9d1SAndroid Build Coastguard Worker    void *data;
111*bbecb9d1SAndroid Build Coastguard Worker 
112*bbecb9d1SAndroid Build Coastguard Worker    void (*unref)(struct pipe_resource *pres, void *data);
113*bbecb9d1SAndroid Build Coastguard Worker 
114*bbecb9d1SAndroid Build Coastguard Worker    void (*attach_iov)(struct pipe_resource *pres,
115*bbecb9d1SAndroid Build Coastguard Worker                       const struct iovec *iov,
116*bbecb9d1SAndroid Build Coastguard Worker                       int iov_count,
117*bbecb9d1SAndroid Build Coastguard Worker                       void *data);
118*bbecb9d1SAndroid Build Coastguard Worker    void (*detach_iov)(struct pipe_resource *pres, void *data);
119*bbecb9d1SAndroid Build Coastguard Worker 
120*bbecb9d1SAndroid Build Coastguard Worker    enum virgl_resource_fd_type (*export_fd)(struct pipe_resource *pres,
121*bbecb9d1SAndroid Build Coastguard Worker                                             int *fd,
122*bbecb9d1SAndroid Build Coastguard Worker                                             void *data);
123*bbecb9d1SAndroid Build Coastguard Worker 
124*bbecb9d1SAndroid Build Coastguard Worker    uint64_t (*get_size)(struct pipe_resource *pres, void *data);
125*bbecb9d1SAndroid Build Coastguard Worker };
126*bbecb9d1SAndroid Build Coastguard Worker 
127*bbecb9d1SAndroid Build Coastguard Worker int
128*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_table_init(const struct virgl_resource_pipe_callbacks *callbacks);
129*bbecb9d1SAndroid Build Coastguard Worker 
130*bbecb9d1SAndroid Build Coastguard Worker void
131*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_table_cleanup(void);
132*bbecb9d1SAndroid Build Coastguard Worker 
133*bbecb9d1SAndroid Build Coastguard Worker void
134*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_table_reset(void);
135*bbecb9d1SAndroid Build Coastguard Worker 
136*bbecb9d1SAndroid Build Coastguard Worker struct virgl_resource *
137*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_create_from_pipe(uint32_t res_id,
138*bbecb9d1SAndroid Build Coastguard Worker                                 struct pipe_resource *pres,
139*bbecb9d1SAndroid Build Coastguard Worker                                 const struct iovec *iov,
140*bbecb9d1SAndroid Build Coastguard Worker                                 int iov_count);
141*bbecb9d1SAndroid Build Coastguard Worker 
142*bbecb9d1SAndroid Build Coastguard Worker struct virgl_resource *
143*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_create_from_fd(uint32_t res_id,
144*bbecb9d1SAndroid Build Coastguard Worker                               enum virgl_resource_fd_type fd_type,
145*bbecb9d1SAndroid Build Coastguard Worker                               int fd,
146*bbecb9d1SAndroid Build Coastguard Worker                               const struct iovec *iov,
147*bbecb9d1SAndroid Build Coastguard Worker                               int iov_count,
148*bbecb9d1SAndroid Build Coastguard Worker                               const struct virgl_resource_opaque_fd_metadata *opaque_fd_metadata);
149*bbecb9d1SAndroid Build Coastguard Worker 
150*bbecb9d1SAndroid Build Coastguard Worker struct virgl_resource *
151*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_create_from_opaque_handle(struct virgl_context *ctx,
152*bbecb9d1SAndroid Build Coastguard Worker                                          uint32_t res_id,
153*bbecb9d1SAndroid Build Coastguard Worker                                          uint32_t opaque_handle);
154*bbecb9d1SAndroid Build Coastguard Worker 
155*bbecb9d1SAndroid Build Coastguard Worker struct virgl_resource *
156*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_create_from_iov(uint32_t res_id,
157*bbecb9d1SAndroid Build Coastguard Worker                                const struct iovec *iov,
158*bbecb9d1SAndroid Build Coastguard Worker                                int iov_count);
159*bbecb9d1SAndroid Build Coastguard Worker 
160*bbecb9d1SAndroid Build Coastguard Worker void
161*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_remove(uint32_t res_id);
162*bbecb9d1SAndroid Build Coastguard Worker 
163*bbecb9d1SAndroid Build Coastguard Worker struct virgl_resource *
164*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_lookup(uint32_t res_id);
165*bbecb9d1SAndroid Build Coastguard Worker 
166*bbecb9d1SAndroid Build Coastguard Worker int
167*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_attach_iov(struct virgl_resource *res,
168*bbecb9d1SAndroid Build Coastguard Worker                           const struct iovec *iov,
169*bbecb9d1SAndroid Build Coastguard Worker                           int iov_count);
170*bbecb9d1SAndroid Build Coastguard Worker 
171*bbecb9d1SAndroid Build Coastguard Worker void
172*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_detach_iov(struct virgl_resource *res);
173*bbecb9d1SAndroid Build Coastguard Worker 
174*bbecb9d1SAndroid Build Coastguard Worker enum virgl_resource_fd_type
175*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_export_fd(struct virgl_resource *res, int *fd);
176*bbecb9d1SAndroid Build Coastguard Worker 
177*bbecb9d1SAndroid Build Coastguard Worker uint64_t
178*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_get_size(struct virgl_resource *res);
179*bbecb9d1SAndroid Build Coastguard Worker 
180*bbecb9d1SAndroid Build Coastguard Worker #endif /* VIRGL_RESOURCE_H */
181