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 int (*get_drm_fd)(void *cookie); 57 #ifdef VIRGL_RENDERER_UNSTABLE_APIS 58 void (*write_context_fence)(void *cookie, uint64_t fence, uint32_t ctx_id, uint8_t ring_idx); 59 #endif 60 }; 61 62 /* virtio-gpu compatible interface */ 63 #define VIRGL_RENDERER_USE_EGL 1 64 /* 65 * Wait for sync objects in thread rather than polling 66 * need to use virgl_renderer_get_poll_fd to know if this feature is in effect. 67 */ 68 #define VIRGL_RENDERER_THREAD_SYNC 2 69 #define VIRGL_RENDERER_USE_GLX (1 << 2) 70 71 VIRGL_EXPORT int virgl_renderer_init(void *cookie, int flags, struct virgl_renderer_callbacks *cb); 72 VIRGL_EXPORT void virgl_renderer_poll(void); /* force fences */ 73 74 /* we need to give qemu the cursor resource contents */ 75 VIRGL_EXPORT void *virgl_renderer_get_cursor_data(uint32_t resource_id, uint32_t *width, uint32_t *height); 76 77 VIRGL_EXPORT void virgl_renderer_get_rect(int resource_id, struct iovec *iov, unsigned int num_iovs, 78 uint32_t offset, int x, int y, int width, int height); 79 80 VIRGL_EXPORT int virgl_renderer_get_fd_for_texture(uint32_t tex_id, int *fd); 81 82 /* virgl bind flags - these are compatible with mesa 10.5 gallium. 83 but are fixed, no other should be passed to virgl either. */ 84 #define VIRGL_RES_BIND_DEPTH_STENCIL (1 << 0) 85 #define VIRGL_RES_BIND_RENDER_TARGET (1 << 1) 86 #define VIRGL_RES_BIND_SAMPLER_VIEW (1 << 3) 87 #define VIRGL_RES_BIND_VERTEX_BUFFER (1 << 4) 88 #define VIRGL_RES_BIND_INDEX_BUFFER (1 << 5) 89 #define VIRGL_RES_BIND_CONSTANT_BUFFER (1 << 6) 90 #define VIRGL_RES_BIND_STREAM_OUTPUT (1 << 11) 91 #define VIRGL_RES_BIND_CURSOR (1 << 16) 92 #define VIRGL_RES_BIND_CUSTOM (1 << 17) 93 94 struct virgl_renderer_resource_create_args { 95 uint32_t handle; 96 uint32_t target; 97 uint32_t format; 98 uint32_t bind; 99 uint32_t width; 100 uint32_t height; 101 uint32_t depth; 102 uint32_t array_size; 103 uint32_t last_level; 104 uint32_t nr_samples; 105 uint32_t flags; 106 }; 107 108 /* new API */ 109 110 VIRGL_EXPORT int virgl_renderer_resource_create(struct virgl_renderer_resource_create_args *args, struct iovec *iov, uint32_t num_iovs); 111 VIRGL_EXPORT void virgl_renderer_resource_unref(uint32_t res_handle); 112 113 VIRGL_EXPORT int virgl_renderer_context_create(uint32_t handle, uint32_t nlen, const char *name); 114 VIRGL_EXPORT void virgl_renderer_context_destroy(uint32_t handle); 115 116 VIRGL_EXPORT int virgl_renderer_submit_cmd(void *buffer, 117 int ctx_id, 118 int ndw); 119 120 VIRGL_EXPORT int virgl_renderer_transfer_read_iov(uint32_t handle, uint32_t ctx_id, 121 uint32_t level, uint32_t stride, 122 uint32_t layer_stride, 123 struct virgl_box *box, 124 uint64_t offset, struct iovec *iov, 125 int iovec_cnt); 126 127 VIRGL_EXPORT int virgl_renderer_transfer_write_iov(uint32_t handle, 128 uint32_t ctx_id, 129 int level, 130 uint32_t stride, 131 uint32_t layer_stride, 132 struct virgl_box *box, 133 uint64_t offset, 134 struct iovec *iovec, 135 unsigned int iovec_cnt); 136 137 VIRGL_EXPORT void virgl_renderer_get_cap_set(uint32_t set, uint32_t *max_ver, 138 uint32_t *max_size); 139 140 VIRGL_EXPORT void virgl_renderer_fill_caps(uint32_t set, uint32_t version, 141 void *caps); 142 143 VIRGL_EXPORT int virgl_renderer_resource_attach_iov(int res_handle, struct iovec *iov, 144 int num_iovs); 145 VIRGL_EXPORT void virgl_renderer_resource_detach_iov(int res_handle, struct iovec **iov, int *num_iovs); 146 147 VIRGL_EXPORT int virgl_renderer_create_fence(int client_fence_id, uint32_t ctx_id); 148 149 VIRGL_EXPORT void virgl_renderer_force_ctx_0(void); 150 151 VIRGL_EXPORT void virgl_renderer_ctx_attach_resource(int ctx_id, int res_handle); 152 VIRGL_EXPORT void virgl_renderer_ctx_detach_resource(int ctx_id, int res_handle); 153 154 /* return information about a resource */ 155 156 struct virgl_renderer_resource_info { 157 uint32_t handle; 158 uint32_t virgl_format; 159 uint32_t width; 160 uint32_t height; 161 uint32_t depth; 162 uint32_t flags; 163 uint32_t tex_id; 164 uint32_t stride; 165 int drm_fourcc; 166 }; 167 168 VIRGL_EXPORT int virgl_renderer_resource_get_info(int res_handle, 169 struct virgl_renderer_resource_info *info); 170 171 VIRGL_EXPORT int virgl_renderer_resource_map(unsigned int res_handle, void** hvaOut, uint64_t* sizeOut); 172 VIRGL_EXPORT int virgl_renderer_resource_unmap(unsigned int res_handle); 173 174 VIRGL_EXPORT void virgl_renderer_cleanup(void *cookie); 175 176 /* reset the rendererer - destroy all contexts and resource */ 177 VIRGL_EXPORT void virgl_renderer_reset(void); 178 179 VIRGL_EXPORT int virgl_renderer_get_poll_fd(void); 180 181 /* Struct of virglrenderer API calls in order to be able to switch between 182 * different virgl API impls, or different devices altogether that use 183 * the virglrenderer API (e.g., goldfish pipe) */ 184 185 typedef int (*virgl_renderer_init_t)( 186 void *cookie, int flags, struct virgl_renderer_callbacks *cb); 187 typedef void (*virgl_renderer_poll_t)(void); /* force fences */ 188 typedef void* (*virgl_renderer_get_cursor_data_t)( 189 uint32_t resource_id, uint32_t *width, uint32_t *height); 190 typedef int (*virgl_renderer_resource_create_t)( 191 struct virgl_renderer_resource_create_args *args, 192 struct iovec *iov, uint32_t num_iovs); 193 typedef void (*virgl_renderer_resource_unref_t)(uint32_t res_handle); 194 typedef int (*virgl_renderer_context_create_t)( 195 uint32_t handle, uint32_t nlen, const char *name); 196 typedef void (*virgl_renderer_context_destroy_t)(uint32_t handle); 197 typedef int (*virgl_renderer_submit_cmd_t)(void *buffer, 198 int ctx_id, 199 int ndw); 200 typedef int (*virgl_renderer_transfer_read_iov_t)( 201 uint32_t handle, uint32_t ctx_id, 202 uint32_t level, uint32_t stride, 203 uint32_t layer_stride, 204 struct virgl_box *box, 205 uint64_t offset, struct iovec *iov, 206 int iovec_cnt); 207 typedef int (*virgl_renderer_transfer_write_iov_t)( 208 uint32_t handle, 209 uint32_t ctx_id, 210 int level, 211 uint32_t stride, 212 uint32_t layer_stride, 213 struct virgl_box *box, 214 uint64_t offset, 215 struct iovec *iovec, 216 unsigned int iovec_cnt); 217 typedef void (*virgl_renderer_get_cap_set_t)(uint32_t set, uint32_t *max_ver, 218 uint32_t *max_size); 219 220 typedef void (*virgl_renderer_fill_caps_t)(uint32_t set, uint32_t version, 221 void *caps); 222 223 typedef int (*virgl_renderer_resource_attach_iov_t)( 224 int res_handle, struct iovec *iov, 225 int num_iovs); 226 typedef void (*virgl_renderer_resource_detach_iov_t)( 227 int res_handle, struct iovec **iov, int *num_iovs); 228 229 typedef int (*virgl_renderer_create_fence_t)( 230 int client_fence_id, uint32_t ctx_id); 231 232 typedef void (*virgl_renderer_force_ctx_0_t)(void); 233 234 typedef void (*virgl_renderer_ctx_attach_resource_t)( 235 int ctx_id, int res_handle); 236 typedef void (*virgl_renderer_ctx_detach_resource_t)( 237 int ctx_id, int res_handle); 238 typedef int (*virgl_renderer_resource_get_info_t)( 239 int res_handle, 240 struct virgl_renderer_resource_info *info); 241 typedef int (*virgl_renderer_resource_map_t)(unsigned int res_handle, void** hvaOut, uint64_t* sizeOut); 242 typedef int (*virgl_renderer_resource_unmap_t)(unsigned int res_handle); 243 244 #define LIST_VIRGLRENDERER_API(f) \ 245 f(virgl_renderer_init) \ 246 f(virgl_renderer_poll) \ 247 f(virgl_renderer_get_cursor_data) \ 248 f(virgl_renderer_resource_create) \ 249 f(virgl_renderer_resource_unref) \ 250 f(virgl_renderer_context_create) \ 251 f(virgl_renderer_context_destroy) \ 252 f(virgl_renderer_submit_cmd) \ 253 f(virgl_renderer_transfer_read_iov) \ 254 f(virgl_renderer_transfer_write_iov) \ 255 f(virgl_renderer_get_cap_set) \ 256 f(virgl_renderer_fill_caps) \ 257 f(virgl_renderer_resource_attach_iov) \ 258 f(virgl_renderer_resource_detach_iov) \ 259 f(virgl_renderer_create_fence) \ 260 f(virgl_renderer_force_ctx_0) \ 261 f(virgl_renderer_ctx_attach_resource) \ 262 f(virgl_renderer_ctx_detach_resource) \ 263 f(virgl_renderer_resource_get_info) \ 264 f(virgl_renderer_resource_map) \ 265 f(virgl_renderer_resource_unmap) \ 266 267 #define VIRGLRENDERER_API_DEFINE_STRUCT_FIELD(api) \ 268 api##_t api; 269 270 struct virgl_renderer_virtio_interface { 271 LIST_VIRGLRENDERER_API(VIRGLRENDERER_API_DEFINE_STRUCT_FIELD) 272 }; 273 274 struct virgl_renderer_virtio_interface* get_default_virtio_interface(); 275 276 #endif 277