• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**************************************************************************
2  *
3  * Copyright (C) 2014 Red Hat Inc.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included
13  * in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21  * OTHER DEALINGS IN THE SOFTWARE.
22  *
23  **************************************************************************/
24 
25 /* library interface from QEMU to virglrenderer */
26 
27 #ifndef VIRGLRENDERER_H
28 #define VIRGLRENDERER_H
29 
30 #include <stdint.h>
31 #include <stdbool.h>
32 
33 struct virgl_box;
34 struct iovec;
35 
36 #define VIRGL_EXPORT  __attribute__((visibility("default")))
37 
38 typedef void *virgl_renderer_gl_context;
39 
40 struct virgl_renderer_gl_ctx_param {
41    int version;
42    bool shared;
43    int major_ver;
44    int minor_ver;
45 };
46 
47 struct virgl_renderer_callbacks {
48    int version;
49    void (*write_fence)(void *cookie, uint32_t fence);
50 
51    /* interact with GL implementation */
52    virgl_renderer_gl_context (*create_gl_context)(void *cookie, int scanout_idx, struct virgl_renderer_gl_ctx_param *param);
53    void (*destroy_gl_context)(void *cookie, virgl_renderer_gl_context ctx);
54    int (*make_current)(void *cookie, int scanout_idx, virgl_renderer_gl_context ctx);
55 };
56 
57 /* virtio-gpu compatible interface */
58 #define VIRGL_RENDERER_USE_EGL 1
59 /*
60  * Wait for sync objects in thread rather than polling
61  * need to use virgl_renderer_get_poll_fd to know if this feature is in effect.
62  */
63 #define VIRGL_RENDERER_THREAD_SYNC 2
64 #define VIRGL_RENDERER_USE_GLX (1 << 2)
65 
66 VIRGL_EXPORT int virgl_renderer_init(void *cookie, int flags, struct virgl_renderer_callbacks *cb);
67 VIRGL_EXPORT void virgl_renderer_poll(void); /* force fences */
68 
69 /* we need to give qemu the cursor resource contents */
70 VIRGL_EXPORT void *virgl_renderer_get_cursor_data(uint32_t resource_id, uint32_t *width, uint32_t *height);
71 
72 VIRGL_EXPORT void virgl_renderer_get_rect(int resource_id, struct iovec *iov, unsigned int num_iovs,
73                                           uint32_t offset, int x, int y, int width, int height);
74 
75 VIRGL_EXPORT int virgl_renderer_get_fd_for_texture(uint32_t tex_id, int *fd);
76 
77 /* virgl bind flags - these are compatible with mesa 10.5 gallium.
78    but are fixed, no other should be passed to virgl either. */
79 #define VIRGL_RES_BIND_DEPTH_STENCIL (1 << 0)
80 #define VIRGL_RES_BIND_RENDER_TARGET (1 << 1)
81 #define VIRGL_RES_BIND_SAMPLER_VIEW  (1 << 3)
82 #define VIRGL_RES_BIND_VERTEX_BUFFER (1 << 4)
83 #define VIRGL_RES_BIND_INDEX_BUFFER  (1 << 5)
84 #define VIRGL_RES_BIND_CONSTANT_BUFFER (1 << 6)
85 #define VIRGL_RES_BIND_STREAM_OUTPUT (1 << 11)
86 #define VIRGL_RES_BIND_CURSOR        (1 << 16)
87 #define VIRGL_RES_BIND_CUSTOM        (1 << 17)
88 
89 struct virgl_renderer_resource_create_args {
90    uint32_t handle;
91    uint32_t target;
92    uint32_t format;
93    uint32_t bind;
94    uint32_t width;
95    uint32_t height;
96    uint32_t depth;
97    uint32_t array_size;
98    uint32_t last_level;
99    uint32_t nr_samples;
100    uint32_t flags;
101 };
102 
103 /* new API */
104 
105 VIRGL_EXPORT int virgl_renderer_resource_create(struct virgl_renderer_resource_create_args *args, struct iovec *iov, uint32_t num_iovs);
106 VIRGL_EXPORT void virgl_renderer_resource_unref(uint32_t res_handle);
107 
108 VIRGL_EXPORT int virgl_renderer_context_create(uint32_t handle, uint32_t nlen, const char *name);
109 VIRGL_EXPORT void virgl_renderer_context_destroy(uint32_t handle);
110 
111 VIRGL_EXPORT int virgl_renderer_submit_cmd(void *buffer,
112                                            int ctx_id,
113                                            int ndw);
114 
115 VIRGL_EXPORT int virgl_renderer_transfer_read_iov(uint32_t handle, uint32_t ctx_id,
116                                                   uint32_t level, uint32_t stride,
117                                                   uint32_t layer_stride,
118                                                   struct virgl_box *box,
119                                                   uint64_t offset, struct iovec *iov,
120                                                   int iovec_cnt);
121 
122 VIRGL_EXPORT int virgl_renderer_transfer_write_iov(uint32_t handle,
123                                                    uint32_t ctx_id,
124                                                    int level,
125                                                    uint32_t stride,
126                                                    uint32_t layer_stride,
127                                                    struct virgl_box *box,
128                                                    uint64_t offset,
129                                                    struct iovec *iovec,
130                                                    unsigned int iovec_cnt);
131 
132 VIRGL_EXPORT void virgl_renderer_get_cap_set(uint32_t set, uint32_t *max_ver,
133                                              uint32_t *max_size);
134 
135 VIRGL_EXPORT void virgl_renderer_fill_caps(uint32_t set, uint32_t version,
136                                            void *caps);
137 
138 VIRGL_EXPORT int virgl_renderer_resource_attach_iov(int res_handle, struct iovec *iov,
139                                                     int num_iovs);
140 VIRGL_EXPORT void virgl_renderer_resource_detach_iov(int res_handle, struct iovec **iov, int *num_iovs);
141 
142 VIRGL_EXPORT int virgl_renderer_create_fence(int client_fence_id, uint32_t ctx_id);
143 
144 VIRGL_EXPORT void virgl_renderer_force_ctx_0(void);
145 
146 VIRGL_EXPORT void virgl_renderer_ctx_attach_resource(int ctx_id, int res_handle);
147 VIRGL_EXPORT void virgl_renderer_ctx_detach_resource(int ctx_id, int res_handle);
148 
149 /* return information about a resource */
150 
151 struct virgl_renderer_resource_info {
152    uint32_t handle;
153    uint32_t virgl_format;
154    uint32_t width;
155    uint32_t height;
156    uint32_t depth;
157    uint32_t flags;
158    uint32_t tex_id;
159    uint32_t stride;
160    int drm_fourcc;
161 };
162 
163 VIRGL_EXPORT int virgl_renderer_resource_get_info(int res_handle,
164                                                   struct virgl_renderer_resource_info *info);
165 
166 VIRGL_EXPORT int virgl_renderer_resource_create_v2(unsigned int res_handle, uint64_t hvaId);
167 VIRGL_EXPORT int virgl_renderer_resource_map(unsigned int res_handle, void** hvaOut, uint64_t* sizeOut);
168 VIRGL_EXPORT int virgl_renderer_resource_unmap(unsigned int res_handle);
169 
170 VIRGL_EXPORT void virgl_renderer_cleanup(void *cookie);
171 
172 /* reset the rendererer - destroy all contexts and resource */
173 VIRGL_EXPORT void virgl_renderer_reset(void);
174 
175 VIRGL_EXPORT int virgl_renderer_get_poll_fd(void);
176 
177 /* Struct of virglrenderer API calls in order to be able to switch between
178  * different virgl API impls, or different devices altogether that use
179  * the virglrenderer API (e.g., goldfish pipe) */
180 
181 typedef int (*virgl_renderer_init_t)(
182     void *cookie, int flags, struct virgl_renderer_callbacks *cb);
183 typedef void (*virgl_renderer_poll_t)(void); /* force fences */
184 typedef void* (*virgl_renderer_get_cursor_data_t)(
185     uint32_t resource_id, uint32_t *width, uint32_t *height);
186 typedef int (*virgl_renderer_resource_create_t)(
187     struct virgl_renderer_resource_create_args *args,
188     struct iovec *iov, uint32_t num_iovs);
189 typedef void (*virgl_renderer_resource_unref_t)(uint32_t res_handle);
190 typedef int (*virgl_renderer_context_create_t)(
191     uint32_t handle, uint32_t nlen, const char *name);
192 typedef void (*virgl_renderer_context_destroy_t)(uint32_t handle);
193 typedef int (*virgl_renderer_submit_cmd_t)(void *buffer,
194                                            int ctx_id,
195                                            int ndw);
196 typedef int (*virgl_renderer_transfer_read_iov_t)(
197     uint32_t handle, uint32_t ctx_id,
198     uint32_t level, uint32_t stride,
199     uint32_t layer_stride,
200     struct virgl_box *box,
201     uint64_t offset, struct iovec *iov,
202     int iovec_cnt);
203 typedef int (*virgl_renderer_transfer_write_iov_t)(
204     uint32_t handle,
205     uint32_t ctx_id,
206     int level,
207     uint32_t stride,
208     uint32_t layer_stride,
209     struct virgl_box *box,
210     uint64_t offset,
211     struct iovec *iovec,
212     unsigned int iovec_cnt);
213 typedef void (*virgl_renderer_get_cap_set_t)(uint32_t set, uint32_t *max_ver,
214                                              uint32_t *max_size);
215 
216 typedef void (*virgl_renderer_fill_caps_t)(uint32_t set, uint32_t version,
217                                            void *caps);
218 
219 typedef int (*virgl_renderer_resource_attach_iov_t)(
220     int res_handle, struct iovec *iov,
221     int num_iovs);
222 typedef void (*virgl_renderer_resource_detach_iov_t)(
223     int res_handle, struct iovec **iov, int *num_iovs);
224 
225 typedef int (*virgl_renderer_create_fence_t)(
226     int client_fence_id, uint32_t ctx_id);
227 
228 typedef void (*virgl_renderer_force_ctx_0_t)(void);
229 
230 typedef void (*virgl_renderer_ctx_attach_resource_t)(
231     int ctx_id, int res_handle);
232 typedef void (*virgl_renderer_ctx_detach_resource_t)(
233     int ctx_id, int res_handle);
234 typedef int (*virgl_renderer_resource_get_info_t)(
235     int res_handle,
236     struct virgl_renderer_resource_info *info);
237 typedef int (*virgl_renderer_resource_create_v2_t)(unsigned int res_handle, uint64_t hvaId);
238 typedef int (*virgl_renderer_resource_map_t)(unsigned int res_handle, void** hvaOut, uint64_t* sizeOut);
239 typedef int (*virgl_renderer_resource_unmap_t)(unsigned int res_handle);
240 
241 #define LIST_VIRGLRENDERER_API(f) \
242 f(virgl_renderer_init) \
243 f(virgl_renderer_poll) \
244 f(virgl_renderer_get_cursor_data) \
245 f(virgl_renderer_resource_create) \
246 f(virgl_renderer_resource_unref) \
247 f(virgl_renderer_context_create) \
248 f(virgl_renderer_context_destroy) \
249 f(virgl_renderer_submit_cmd) \
250 f(virgl_renderer_transfer_read_iov) \
251 f(virgl_renderer_transfer_write_iov) \
252 f(virgl_renderer_get_cap_set) \
253 f(virgl_renderer_fill_caps) \
254 f(virgl_renderer_resource_attach_iov) \
255 f(virgl_renderer_resource_detach_iov) \
256 f(virgl_renderer_create_fence) \
257 f(virgl_renderer_force_ctx_0) \
258 f(virgl_renderer_ctx_attach_resource) \
259 f(virgl_renderer_ctx_detach_resource) \
260 f(virgl_renderer_resource_get_info) \
261 f(virgl_renderer_resource_create_v2) \
262 f(virgl_renderer_resource_map) \
263 f(virgl_renderer_resource_unmap) \
264 
265 #define VIRGLRENDERER_API_DEFINE_STRUCT_FIELD(api) \
266     api##_t api;
267 
268 struct virgl_renderer_virtio_interface {
269     LIST_VIRGLRENDERER_API(VIRGLRENDERER_API_DEFINE_STRUCT_FIELD)
270 };
271 
272 struct virgl_renderer_virtio_interface* get_default_virtio_interface();
273 
274 #endif
275