xref: /aosp_15_r20/external/virglrenderer/src/virgl_context.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_CONTEXT_H
26*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_CONTEXT_H
27*bbecb9d1SAndroid Build Coastguard Worker 
28*bbecb9d1SAndroid Build Coastguard Worker #include <stdbool.h>
29*bbecb9d1SAndroid Build Coastguard Worker #include <stddef.h>
30*bbecb9d1SAndroid Build Coastguard Worker #include <stdint.h>
31*bbecb9d1SAndroid Build Coastguard Worker 
32*bbecb9d1SAndroid Build Coastguard Worker #include "virglrenderer_hw.h"
33*bbecb9d1SAndroid Build Coastguard Worker #include "virgl_resource.h"
34*bbecb9d1SAndroid Build Coastguard Worker 
35*bbecb9d1SAndroid Build Coastguard Worker struct vrend_transfer_info;
36*bbecb9d1SAndroid Build Coastguard Worker struct pipe_resource;
37*bbecb9d1SAndroid Build Coastguard Worker 
38*bbecb9d1SAndroid Build Coastguard Worker struct virgl_context_blob {
39*bbecb9d1SAndroid Build Coastguard Worker    /* valid fd or pipe resource */
40*bbecb9d1SAndroid Build Coastguard Worker    enum virgl_resource_fd_type type;
41*bbecb9d1SAndroid Build Coastguard Worker    union {
42*bbecb9d1SAndroid Build Coastguard Worker       int fd;
43*bbecb9d1SAndroid Build Coastguard Worker       uint32_t opaque_handle;
44*bbecb9d1SAndroid Build Coastguard Worker       struct pipe_resource *pipe_resource;
45*bbecb9d1SAndroid Build Coastguard Worker    } u;
46*bbecb9d1SAndroid Build Coastguard Worker 
47*bbecb9d1SAndroid Build Coastguard Worker    uint32_t map_info;
48*bbecb9d1SAndroid Build Coastguard Worker 
49*bbecb9d1SAndroid Build Coastguard Worker    struct virgl_resource_opaque_fd_metadata opaque_fd_metadata;
50*bbecb9d1SAndroid Build Coastguard Worker };
51*bbecb9d1SAndroid Build Coastguard Worker 
52*bbecb9d1SAndroid Build Coastguard Worker struct virgl_context;
53*bbecb9d1SAndroid Build Coastguard Worker 
54*bbecb9d1SAndroid Build Coastguard Worker typedef void (*virgl_context_fence_retire)(struct virgl_context *ctx,
55*bbecb9d1SAndroid Build Coastguard Worker                                            uint32_t ring_idx,
56*bbecb9d1SAndroid Build Coastguard Worker                                            uint64_t fence_id);
57*bbecb9d1SAndroid Build Coastguard Worker 
58*bbecb9d1SAndroid Build Coastguard Worker /**
59*bbecb9d1SAndroid Build Coastguard Worker  * Base class for renderer contexts.  For example, vrend_decode_ctx is a
60*bbecb9d1SAndroid Build Coastguard Worker  * subclass of virgl_context.
61*bbecb9d1SAndroid Build Coastguard Worker  */
62*bbecb9d1SAndroid Build Coastguard Worker struct virgl_context {
63*bbecb9d1SAndroid Build Coastguard Worker    uint32_t ctx_id;
64*bbecb9d1SAndroid Build Coastguard Worker 
65*bbecb9d1SAndroid Build Coastguard Worker    enum virgl_renderer_capset capset_id;
66*bbecb9d1SAndroid Build Coastguard Worker 
67*bbecb9d1SAndroid Build Coastguard Worker    /*
68*bbecb9d1SAndroid Build Coastguard Worker     * Each fence goes through submitted, signaled, and retired.  This callback
69*bbecb9d1SAndroid Build Coastguard Worker     * is called from virgl_context::retire_fences to retire signaled fences of
70*bbecb9d1SAndroid Build Coastguard Worker     * each queue.  When a queue has multiple signaled fences by the time
71*bbecb9d1SAndroid Build Coastguard Worker     * virgl_context::retire_fences is called, this callback might not be called
72*bbecb9d1SAndroid Build Coastguard Worker     * on all fences but only on the latest one, depending on the flags of the
73*bbecb9d1SAndroid Build Coastguard Worker     * fences.
74*bbecb9d1SAndroid Build Coastguard Worker     */
75*bbecb9d1SAndroid Build Coastguard Worker    virgl_context_fence_retire fence_retire;
76*bbecb9d1SAndroid Build Coastguard Worker 
77*bbecb9d1SAndroid Build Coastguard Worker    void (*destroy)(struct virgl_context *ctx);
78*bbecb9d1SAndroid Build Coastguard Worker 
79*bbecb9d1SAndroid Build Coastguard Worker    void (*attach_resource)(struct virgl_context *ctx,
80*bbecb9d1SAndroid Build Coastguard Worker                            struct virgl_resource *res);
81*bbecb9d1SAndroid Build Coastguard Worker    void (*detach_resource)(struct virgl_context *ctx,
82*bbecb9d1SAndroid Build Coastguard Worker                            struct virgl_resource *res);
83*bbecb9d1SAndroid Build Coastguard Worker    enum virgl_resource_fd_type (*export_opaque_handle)(struct virgl_context *ctx,
84*bbecb9d1SAndroid Build Coastguard Worker                                                        struct virgl_resource *res,
85*bbecb9d1SAndroid Build Coastguard Worker                                                        int *out_fd);
86*bbecb9d1SAndroid Build Coastguard Worker 
87*bbecb9d1SAndroid Build Coastguard Worker    int (*transfer_3d)(struct virgl_context *ctx,
88*bbecb9d1SAndroid Build Coastguard Worker                       struct virgl_resource *res,
89*bbecb9d1SAndroid Build Coastguard Worker                       const struct vrend_transfer_info *info,
90*bbecb9d1SAndroid Build Coastguard Worker                       int transfer_mode);
91*bbecb9d1SAndroid Build Coastguard Worker 
92*bbecb9d1SAndroid Build Coastguard Worker    /* These are used to create a virgl_resource from a context object.
93*bbecb9d1SAndroid Build Coastguard Worker     *
94*bbecb9d1SAndroid Build Coastguard Worker     * get_blob returns a virgl_context_blob from which a virgl_resource can be
95*bbecb9d1SAndroid Build Coastguard Worker     * created.
96*bbecb9d1SAndroid Build Coastguard Worker     *
97*bbecb9d1SAndroid Build Coastguard Worker     * Note that get_blob is a one-time thing.  The context object might be
98*bbecb9d1SAndroid Build Coastguard Worker     * destroyed or reject subsequent get_blob calls.
99*bbecb9d1SAndroid Build Coastguard Worker     */
100*bbecb9d1SAndroid Build Coastguard Worker    int (*get_blob)(struct virgl_context *ctx,
101*bbecb9d1SAndroid Build Coastguard Worker                    uint32_t res_id,
102*bbecb9d1SAndroid Build Coastguard Worker                    uint64_t blob_id,
103*bbecb9d1SAndroid Build Coastguard Worker                    uint64_t blob_size,
104*bbecb9d1SAndroid Build Coastguard Worker                    uint32_t blob_flags,
105*bbecb9d1SAndroid Build Coastguard Worker                    struct virgl_context_blob *blob);
106*bbecb9d1SAndroid Build Coastguard Worker 
107*bbecb9d1SAndroid Build Coastguard Worker    int (*submit_cmd)(struct virgl_context *ctx,
108*bbecb9d1SAndroid Build Coastguard Worker                      const void *buffer,
109*bbecb9d1SAndroid Build Coastguard Worker                      size_t size);
110*bbecb9d1SAndroid Build Coastguard Worker 
111*bbecb9d1SAndroid Build Coastguard Worker    /*
112*bbecb9d1SAndroid Build Coastguard Worker     * Return an fd that is readable whenever there is any signaled fence in
113*bbecb9d1SAndroid Build Coastguard Worker     * any queue, or -1 if not supported.
114*bbecb9d1SAndroid Build Coastguard Worker     */
115*bbecb9d1SAndroid Build Coastguard Worker    int (*get_fencing_fd)(struct virgl_context *ctx);
116*bbecb9d1SAndroid Build Coastguard Worker 
117*bbecb9d1SAndroid Build Coastguard Worker    /* retire signaled fences of all queues */
118*bbecb9d1SAndroid Build Coastguard Worker    void (*retire_fences)(struct virgl_context *ctx);
119*bbecb9d1SAndroid Build Coastguard Worker 
120*bbecb9d1SAndroid Build Coastguard Worker    /* submit a fence to the queue identified by queue_id */
121*bbecb9d1SAndroid Build Coastguard Worker    int (*submit_fence)(struct virgl_context *ctx,
122*bbecb9d1SAndroid Build Coastguard Worker                        uint32_t flags,
123*bbecb9d1SAndroid Build Coastguard Worker                        uint32_t ring_idx,
124*bbecb9d1SAndroid Build Coastguard Worker                        uint64_t fence_id);
125*bbecb9d1SAndroid Build Coastguard Worker };
126*bbecb9d1SAndroid Build Coastguard Worker 
127*bbecb9d1SAndroid Build Coastguard Worker struct virgl_context_foreach_args {
128*bbecb9d1SAndroid Build Coastguard Worker    bool (*callback)(struct virgl_context *ctx, void *data);
129*bbecb9d1SAndroid Build Coastguard Worker    void *data;
130*bbecb9d1SAndroid Build Coastguard Worker };
131*bbecb9d1SAndroid Build Coastguard Worker 
132*bbecb9d1SAndroid Build Coastguard Worker int
133*bbecb9d1SAndroid Build Coastguard Worker virgl_context_table_init(void);
134*bbecb9d1SAndroid Build Coastguard Worker 
135*bbecb9d1SAndroid Build Coastguard Worker void
136*bbecb9d1SAndroid Build Coastguard Worker virgl_context_table_cleanup(void);
137*bbecb9d1SAndroid Build Coastguard Worker 
138*bbecb9d1SAndroid Build Coastguard Worker void
139*bbecb9d1SAndroid Build Coastguard Worker virgl_context_table_reset(void);
140*bbecb9d1SAndroid Build Coastguard Worker 
141*bbecb9d1SAndroid Build Coastguard Worker int
142*bbecb9d1SAndroid Build Coastguard Worker virgl_context_add(struct virgl_context *ctx);
143*bbecb9d1SAndroid Build Coastguard Worker 
144*bbecb9d1SAndroid Build Coastguard Worker void
145*bbecb9d1SAndroid Build Coastguard Worker virgl_context_remove(uint32_t ctx_id);
146*bbecb9d1SAndroid Build Coastguard Worker 
147*bbecb9d1SAndroid Build Coastguard Worker struct virgl_context *
148*bbecb9d1SAndroid Build Coastguard Worker virgl_context_lookup(uint32_t ctx_id);
149*bbecb9d1SAndroid Build Coastguard Worker 
150*bbecb9d1SAndroid Build Coastguard Worker void
151*bbecb9d1SAndroid Build Coastguard Worker virgl_context_foreach(const struct virgl_context_foreach_args *args);
152*bbecb9d1SAndroid Build Coastguard Worker 
153*bbecb9d1SAndroid Build Coastguard Worker #endif /* VIRGL_CONTEXT_H */
154