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