xref: /aosp_15_r20/external/virglrenderer/src/virgl_resource.c (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 #include "virgl_resource.h"
26*bbecb9d1SAndroid Build Coastguard Worker 
27*bbecb9d1SAndroid Build Coastguard Worker #include <assert.h>
28*bbecb9d1SAndroid Build Coastguard Worker #include <errno.h>
29*bbecb9d1SAndroid Build Coastguard Worker #include <fcntl.h>
30*bbecb9d1SAndroid Build Coastguard Worker #include <string.h>
31*bbecb9d1SAndroid Build Coastguard Worker #include <unistd.h>
32*bbecb9d1SAndroid Build Coastguard Worker 
33*bbecb9d1SAndroid Build Coastguard Worker #include "util/os_file.h"
34*bbecb9d1SAndroid Build Coastguard Worker #include "util/u_hash_table.h"
35*bbecb9d1SAndroid Build Coastguard Worker #include "util/u_pointer.h"
36*bbecb9d1SAndroid Build Coastguard Worker #include "virgl_util.h"
37*bbecb9d1SAndroid Build Coastguard Worker #include "virgl_context.h"
38*bbecb9d1SAndroid Build Coastguard Worker 
39*bbecb9d1SAndroid Build Coastguard Worker static struct util_hash_table *virgl_resource_table;
40*bbecb9d1SAndroid Build Coastguard Worker static struct virgl_resource_pipe_callbacks pipe_callbacks;
41*bbecb9d1SAndroid Build Coastguard Worker 
42*bbecb9d1SAndroid Build Coastguard Worker static void
virgl_resource_destroy_func(void * val)43*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_destroy_func(void *val)
44*bbecb9d1SAndroid Build Coastguard Worker {
45*bbecb9d1SAndroid Build Coastguard Worker    struct virgl_resource *res = (struct virgl_resource *)val;
46*bbecb9d1SAndroid Build Coastguard Worker 
47*bbecb9d1SAndroid Build Coastguard Worker    if (res->pipe_resource)
48*bbecb9d1SAndroid Build Coastguard Worker       pipe_callbacks.unref(res->pipe_resource, pipe_callbacks.data);
49*bbecb9d1SAndroid Build Coastguard Worker    if ((res->fd_type != VIRGL_RESOURCE_FD_INVALID) &&
50*bbecb9d1SAndroid Build Coastguard Worker        (res->fd_type != VIRGL_RESOURCE_OPAQUE_HANDLE))
51*bbecb9d1SAndroid Build Coastguard Worker       close(res->fd);
52*bbecb9d1SAndroid Build Coastguard Worker 
53*bbecb9d1SAndroid Build Coastguard Worker    free(res);
54*bbecb9d1SAndroid Build Coastguard Worker }
55*bbecb9d1SAndroid Build Coastguard Worker 
56*bbecb9d1SAndroid Build Coastguard Worker int
virgl_resource_table_init(const struct virgl_resource_pipe_callbacks * callbacks)57*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_table_init(const struct virgl_resource_pipe_callbacks *callbacks)
58*bbecb9d1SAndroid Build Coastguard Worker {
59*bbecb9d1SAndroid Build Coastguard Worker    virgl_resource_table = util_hash_table_create(hash_func_u32,
60*bbecb9d1SAndroid Build Coastguard Worker                                                  equal_func,
61*bbecb9d1SAndroid Build Coastguard Worker                                                  virgl_resource_destroy_func);
62*bbecb9d1SAndroid Build Coastguard Worker    if (!virgl_resource_table)
63*bbecb9d1SAndroid Build Coastguard Worker       return ENOMEM;
64*bbecb9d1SAndroid Build Coastguard Worker 
65*bbecb9d1SAndroid Build Coastguard Worker    if (callbacks)
66*bbecb9d1SAndroid Build Coastguard Worker       pipe_callbacks = *callbacks;
67*bbecb9d1SAndroid Build Coastguard Worker 
68*bbecb9d1SAndroid Build Coastguard Worker    return 0;
69*bbecb9d1SAndroid Build Coastguard Worker }
70*bbecb9d1SAndroid Build Coastguard Worker 
71*bbecb9d1SAndroid Build Coastguard Worker void
virgl_resource_table_cleanup(void)72*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_table_cleanup(void)
73*bbecb9d1SAndroid Build Coastguard Worker {
74*bbecb9d1SAndroid Build Coastguard Worker    util_hash_table_destroy(virgl_resource_table);
75*bbecb9d1SAndroid Build Coastguard Worker    virgl_resource_table = NULL;
76*bbecb9d1SAndroid Build Coastguard Worker    memset(&pipe_callbacks, 0, sizeof(pipe_callbacks));
77*bbecb9d1SAndroid Build Coastguard Worker }
78*bbecb9d1SAndroid Build Coastguard Worker 
79*bbecb9d1SAndroid Build Coastguard Worker void
virgl_resource_table_reset(void)80*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_table_reset(void)
81*bbecb9d1SAndroid Build Coastguard Worker {
82*bbecb9d1SAndroid Build Coastguard Worker    util_hash_table_clear(virgl_resource_table);
83*bbecb9d1SAndroid Build Coastguard Worker }
84*bbecb9d1SAndroid Build Coastguard Worker 
85*bbecb9d1SAndroid Build Coastguard Worker static struct virgl_resource *
virgl_resource_create(uint32_t res_id)86*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_create(uint32_t res_id)
87*bbecb9d1SAndroid Build Coastguard Worker {
88*bbecb9d1SAndroid Build Coastguard Worker    struct virgl_resource *res;
89*bbecb9d1SAndroid Build Coastguard Worker    enum pipe_error err;
90*bbecb9d1SAndroid Build Coastguard Worker 
91*bbecb9d1SAndroid Build Coastguard Worker    res = calloc(1, sizeof(*res));
92*bbecb9d1SAndroid Build Coastguard Worker    if (!res)
93*bbecb9d1SAndroid Build Coastguard Worker       return NULL;
94*bbecb9d1SAndroid Build Coastguard Worker 
95*bbecb9d1SAndroid Build Coastguard Worker    err = util_hash_table_set(virgl_resource_table,
96*bbecb9d1SAndroid Build Coastguard Worker                              uintptr_to_pointer(res_id),
97*bbecb9d1SAndroid Build Coastguard Worker                              res);
98*bbecb9d1SAndroid Build Coastguard Worker    if (err != PIPE_OK) {
99*bbecb9d1SAndroid Build Coastguard Worker       free(res);
100*bbecb9d1SAndroid Build Coastguard Worker       return NULL;
101*bbecb9d1SAndroid Build Coastguard Worker    }
102*bbecb9d1SAndroid Build Coastguard Worker 
103*bbecb9d1SAndroid Build Coastguard Worker    res->res_id = res_id;
104*bbecb9d1SAndroid Build Coastguard Worker    res->fd_type = VIRGL_RESOURCE_FD_INVALID;
105*bbecb9d1SAndroid Build Coastguard Worker    res->fd = -1;
106*bbecb9d1SAndroid Build Coastguard Worker 
107*bbecb9d1SAndroid Build Coastguard Worker    return res;
108*bbecb9d1SAndroid Build Coastguard Worker }
109*bbecb9d1SAndroid Build Coastguard Worker 
110*bbecb9d1SAndroid Build Coastguard Worker struct virgl_resource *
virgl_resource_create_from_pipe(uint32_t res_id,struct pipe_resource * pres,const struct iovec * iov,int iov_count)111*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_create_from_pipe(uint32_t res_id,
112*bbecb9d1SAndroid Build Coastguard Worker                                 struct pipe_resource *pres,
113*bbecb9d1SAndroid Build Coastguard Worker                                 const struct iovec *iov,
114*bbecb9d1SAndroid Build Coastguard Worker                                 int iov_count)
115*bbecb9d1SAndroid Build Coastguard Worker {
116*bbecb9d1SAndroid Build Coastguard Worker    struct virgl_resource *res;
117*bbecb9d1SAndroid Build Coastguard Worker 
118*bbecb9d1SAndroid Build Coastguard Worker    res = virgl_resource_create(res_id);
119*bbecb9d1SAndroid Build Coastguard Worker    if (!res)
120*bbecb9d1SAndroid Build Coastguard Worker       return NULL;
121*bbecb9d1SAndroid Build Coastguard Worker 
122*bbecb9d1SAndroid Build Coastguard Worker    /* take ownership */
123*bbecb9d1SAndroid Build Coastguard Worker    res->pipe_resource = pres;
124*bbecb9d1SAndroid Build Coastguard Worker 
125*bbecb9d1SAndroid Build Coastguard Worker    res->iov = iov;
126*bbecb9d1SAndroid Build Coastguard Worker    res->iov_count = iov_count;
127*bbecb9d1SAndroid Build Coastguard Worker 
128*bbecb9d1SAndroid Build Coastguard Worker    return res;
129*bbecb9d1SAndroid Build Coastguard Worker }
130*bbecb9d1SAndroid Build Coastguard Worker 
131*bbecb9d1SAndroid Build Coastguard Worker struct virgl_resource *
virgl_resource_create_from_fd(uint32_t res_id,enum virgl_resource_fd_type fd_type,int fd,const struct iovec * iov,int iov_count,const struct virgl_resource_opaque_fd_metadata * opaque_fd_metadata)132*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_create_from_fd(uint32_t res_id,
133*bbecb9d1SAndroid Build Coastguard Worker                               enum virgl_resource_fd_type fd_type,
134*bbecb9d1SAndroid Build Coastguard Worker                               int fd,
135*bbecb9d1SAndroid Build Coastguard Worker                               const struct iovec *iov,
136*bbecb9d1SAndroid Build Coastguard Worker                               int iov_count,
137*bbecb9d1SAndroid Build Coastguard Worker                               const struct virgl_resource_opaque_fd_metadata *opaque_fd_metadata)
138*bbecb9d1SAndroid Build Coastguard Worker {
139*bbecb9d1SAndroid Build Coastguard Worker    struct virgl_resource *res;
140*bbecb9d1SAndroid Build Coastguard Worker 
141*bbecb9d1SAndroid Build Coastguard Worker    assert(fd_type != VIRGL_RESOURCE_FD_INVALID  && fd >= 0);
142*bbecb9d1SAndroid Build Coastguard Worker 
143*bbecb9d1SAndroid Build Coastguard Worker    res = virgl_resource_create(res_id);
144*bbecb9d1SAndroid Build Coastguard Worker    if (!res)
145*bbecb9d1SAndroid Build Coastguard Worker       return NULL;
146*bbecb9d1SAndroid Build Coastguard Worker 
147*bbecb9d1SAndroid Build Coastguard Worker    res->fd_type = fd_type;
148*bbecb9d1SAndroid Build Coastguard Worker    /* take ownership */
149*bbecb9d1SAndroid Build Coastguard Worker    res->fd = fd;
150*bbecb9d1SAndroid Build Coastguard Worker 
151*bbecb9d1SAndroid Build Coastguard Worker    res->iov = iov;
152*bbecb9d1SAndroid Build Coastguard Worker    res->iov_count = iov_count;
153*bbecb9d1SAndroid Build Coastguard Worker 
154*bbecb9d1SAndroid Build Coastguard Worker    if (opaque_fd_metadata && fd_type == VIRGL_RESOURCE_FD_OPAQUE)
155*bbecb9d1SAndroid Build Coastguard Worker       res->opaque_fd_metadata = *opaque_fd_metadata;
156*bbecb9d1SAndroid Build Coastguard Worker 
157*bbecb9d1SAndroid Build Coastguard Worker    return res;
158*bbecb9d1SAndroid Build Coastguard Worker }
159*bbecb9d1SAndroid Build Coastguard Worker 
160*bbecb9d1SAndroid Build Coastguard Worker struct virgl_resource *
virgl_resource_create_from_opaque_handle(struct virgl_context * ctx,uint32_t res_id,uint32_t opaque_handle)161*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_create_from_opaque_handle(struct virgl_context *ctx,
162*bbecb9d1SAndroid Build Coastguard Worker                                          uint32_t res_id,
163*bbecb9d1SAndroid Build Coastguard Worker                                          uint32_t opaque_handle)
164*bbecb9d1SAndroid Build Coastguard Worker {
165*bbecb9d1SAndroid Build Coastguard Worker    struct virgl_resource *res;
166*bbecb9d1SAndroid Build Coastguard Worker 
167*bbecb9d1SAndroid Build Coastguard Worker    res = virgl_resource_create(res_id);
168*bbecb9d1SAndroid Build Coastguard Worker    if (!res)
169*bbecb9d1SAndroid Build Coastguard Worker       return NULL;
170*bbecb9d1SAndroid Build Coastguard Worker 
171*bbecb9d1SAndroid Build Coastguard Worker    res->fd_type = VIRGL_RESOURCE_OPAQUE_HANDLE;
172*bbecb9d1SAndroid Build Coastguard Worker    res->opaque_handle = opaque_handle;
173*bbecb9d1SAndroid Build Coastguard Worker 
174*bbecb9d1SAndroid Build Coastguard Worker    /* We need the ctx to get an fd from handle (which we don't want to do
175*bbecb9d1SAndroid Build Coastguard Worker     * until asked, to avoid file descriptor limits)
176*bbecb9d1SAndroid Build Coastguard Worker     *
177*bbecb9d1SAndroid Build Coastguard Worker     * Shareable resources should not use OPAQUE_HANDLE, to avoid lifetime
178*bbecb9d1SAndroid Build Coastguard Worker     * issues (ie. resource outliving the context which created it).
179*bbecb9d1SAndroid Build Coastguard Worker     */
180*bbecb9d1SAndroid Build Coastguard Worker    res->opaque_handle_context_id = ctx->ctx_id;
181*bbecb9d1SAndroid Build Coastguard Worker 
182*bbecb9d1SAndroid Build Coastguard Worker    return res;
183*bbecb9d1SAndroid Build Coastguard Worker }
184*bbecb9d1SAndroid Build Coastguard Worker 
185*bbecb9d1SAndroid Build Coastguard Worker struct virgl_resource *
virgl_resource_create_from_iov(uint32_t res_id,const struct iovec * iov,int iov_count)186*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_create_from_iov(uint32_t res_id,
187*bbecb9d1SAndroid Build Coastguard Worker                                const struct iovec *iov,
188*bbecb9d1SAndroid Build Coastguard Worker                                int iov_count)
189*bbecb9d1SAndroid Build Coastguard Worker {
190*bbecb9d1SAndroid Build Coastguard Worker    struct virgl_resource *res;
191*bbecb9d1SAndroid Build Coastguard Worker 
192*bbecb9d1SAndroid Build Coastguard Worker    if (iov_count)
193*bbecb9d1SAndroid Build Coastguard Worker       assert(iov);
194*bbecb9d1SAndroid Build Coastguard Worker 
195*bbecb9d1SAndroid Build Coastguard Worker    res = virgl_resource_create(res_id);
196*bbecb9d1SAndroid Build Coastguard Worker    if (!res)
197*bbecb9d1SAndroid Build Coastguard Worker       return NULL;
198*bbecb9d1SAndroid Build Coastguard Worker 
199*bbecb9d1SAndroid Build Coastguard Worker    res->iov = iov;
200*bbecb9d1SAndroid Build Coastguard Worker    res->iov_count = iov_count;
201*bbecb9d1SAndroid Build Coastguard Worker 
202*bbecb9d1SAndroid Build Coastguard Worker    return res;
203*bbecb9d1SAndroid Build Coastguard Worker }
204*bbecb9d1SAndroid Build Coastguard Worker 
205*bbecb9d1SAndroid Build Coastguard Worker void
virgl_resource_remove(uint32_t res_id)206*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_remove(uint32_t res_id)
207*bbecb9d1SAndroid Build Coastguard Worker {
208*bbecb9d1SAndroid Build Coastguard Worker    util_hash_table_remove(virgl_resource_table, uintptr_to_pointer(res_id));
209*bbecb9d1SAndroid Build Coastguard Worker }
210*bbecb9d1SAndroid Build Coastguard Worker 
virgl_resource_lookup(uint32_t res_id)211*bbecb9d1SAndroid Build Coastguard Worker struct virgl_resource *virgl_resource_lookup(uint32_t res_id)
212*bbecb9d1SAndroid Build Coastguard Worker {
213*bbecb9d1SAndroid Build Coastguard Worker    return util_hash_table_get(virgl_resource_table,
214*bbecb9d1SAndroid Build Coastguard Worker                               uintptr_to_pointer(res_id));
215*bbecb9d1SAndroid Build Coastguard Worker }
216*bbecb9d1SAndroid Build Coastguard Worker 
217*bbecb9d1SAndroid Build Coastguard Worker int
virgl_resource_attach_iov(struct virgl_resource * res,const struct iovec * iov,int iov_count)218*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_attach_iov(struct virgl_resource *res,
219*bbecb9d1SAndroid Build Coastguard Worker                           const struct iovec *iov,
220*bbecb9d1SAndroid Build Coastguard Worker                           int iov_count)
221*bbecb9d1SAndroid Build Coastguard Worker {
222*bbecb9d1SAndroid Build Coastguard Worker    if (res->iov)
223*bbecb9d1SAndroid Build Coastguard Worker       return EINVAL;
224*bbecb9d1SAndroid Build Coastguard Worker 
225*bbecb9d1SAndroid Build Coastguard Worker    res->iov = iov;
226*bbecb9d1SAndroid Build Coastguard Worker    res->iov_count = iov_count;
227*bbecb9d1SAndroid Build Coastguard Worker 
228*bbecb9d1SAndroid Build Coastguard Worker    if (res->pipe_resource) {
229*bbecb9d1SAndroid Build Coastguard Worker       pipe_callbacks.attach_iov(res->pipe_resource,
230*bbecb9d1SAndroid Build Coastguard Worker                                 iov,
231*bbecb9d1SAndroid Build Coastguard Worker                                 iov_count,
232*bbecb9d1SAndroid Build Coastguard Worker                                 pipe_callbacks.data);
233*bbecb9d1SAndroid Build Coastguard Worker    }
234*bbecb9d1SAndroid Build Coastguard Worker 
235*bbecb9d1SAndroid Build Coastguard Worker    return 0;
236*bbecb9d1SAndroid Build Coastguard Worker }
237*bbecb9d1SAndroid Build Coastguard Worker 
238*bbecb9d1SAndroid Build Coastguard Worker void
virgl_resource_detach_iov(struct virgl_resource * res)239*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_detach_iov(struct virgl_resource *res)
240*bbecb9d1SAndroid Build Coastguard Worker {
241*bbecb9d1SAndroid Build Coastguard Worker    if (!res->iov)
242*bbecb9d1SAndroid Build Coastguard Worker       return;
243*bbecb9d1SAndroid Build Coastguard Worker 
244*bbecb9d1SAndroid Build Coastguard Worker    if (res->pipe_resource)
245*bbecb9d1SAndroid Build Coastguard Worker       pipe_callbacks.detach_iov(res->pipe_resource, pipe_callbacks.data);
246*bbecb9d1SAndroid Build Coastguard Worker 
247*bbecb9d1SAndroid Build Coastguard Worker    res->iov = NULL;
248*bbecb9d1SAndroid Build Coastguard Worker    res->iov_count = 0;
249*bbecb9d1SAndroid Build Coastguard Worker }
250*bbecb9d1SAndroid Build Coastguard Worker 
251*bbecb9d1SAndroid Build Coastguard Worker enum virgl_resource_fd_type
virgl_resource_export_fd(struct virgl_resource * res,int * fd)252*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_export_fd(struct virgl_resource *res, int *fd)
253*bbecb9d1SAndroid Build Coastguard Worker {
254*bbecb9d1SAndroid Build Coastguard Worker    if (res->fd_type == VIRGL_RESOURCE_OPAQUE_HANDLE) {
255*bbecb9d1SAndroid Build Coastguard Worker       struct virgl_context *ctx;
256*bbecb9d1SAndroid Build Coastguard Worker 
257*bbecb9d1SAndroid Build Coastguard Worker       ctx = virgl_context_lookup(res->opaque_handle_context_id);
258*bbecb9d1SAndroid Build Coastguard Worker       if (!ctx)
259*bbecb9d1SAndroid Build Coastguard Worker          return VIRGL_RESOURCE_FD_INVALID;
260*bbecb9d1SAndroid Build Coastguard Worker 
261*bbecb9d1SAndroid Build Coastguard Worker       return ctx->export_opaque_handle(ctx, res, fd);
262*bbecb9d1SAndroid Build Coastguard Worker    } else if (res->fd_type != VIRGL_RESOURCE_FD_INVALID) {
263*bbecb9d1SAndroid Build Coastguard Worker       *fd = os_dupfd_cloexec(res->fd);
264*bbecb9d1SAndroid Build Coastguard Worker       return *fd >= 0 ? res->fd_type : VIRGL_RESOURCE_FD_INVALID;
265*bbecb9d1SAndroid Build Coastguard Worker    } else if (res->pipe_resource) {
266*bbecb9d1SAndroid Build Coastguard Worker       return pipe_callbacks.export_fd(res->pipe_resource,
267*bbecb9d1SAndroid Build Coastguard Worker                                       fd,
268*bbecb9d1SAndroid Build Coastguard Worker                                       pipe_callbacks.data);
269*bbecb9d1SAndroid Build Coastguard Worker    }
270*bbecb9d1SAndroid Build Coastguard Worker 
271*bbecb9d1SAndroid Build Coastguard Worker    return VIRGL_RESOURCE_FD_INVALID;
272*bbecb9d1SAndroid Build Coastguard Worker }
273*bbecb9d1SAndroid Build Coastguard Worker 
274*bbecb9d1SAndroid Build Coastguard Worker uint64_t
virgl_resource_get_size(struct virgl_resource * res)275*bbecb9d1SAndroid Build Coastguard Worker virgl_resource_get_size(struct virgl_resource *res)
276*bbecb9d1SAndroid Build Coastguard Worker {
277*bbecb9d1SAndroid Build Coastguard Worker    if (res->map_size)
278*bbecb9d1SAndroid Build Coastguard Worker       return res->map_size;
279*bbecb9d1SAndroid Build Coastguard Worker 
280*bbecb9d1SAndroid Build Coastguard Worker    if (res->pipe_resource)
281*bbecb9d1SAndroid Build Coastguard Worker       return pipe_callbacks.get_size(res->pipe_resource, pipe_callbacks.data);
282*bbecb9d1SAndroid Build Coastguard Worker 
283*bbecb9d1SAndroid Build Coastguard Worker    return 0;
284*bbecb9d1SAndroid Build Coastguard Worker }
285