1*bbecb9d1SAndroid Build Coastguard Worker /************************************************************************** 2*bbecb9d1SAndroid Build Coastguard Worker * 3*bbecb9d1SAndroid Build Coastguard Worker * Copyright (C) 2014 Red Hat Inc. 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 /* library interface from QEMU to virglrenderer */ 26*bbecb9d1SAndroid Build Coastguard Worker 27*bbecb9d1SAndroid Build Coastguard Worker #ifndef VIRGLRENDERER_H 28*bbecb9d1SAndroid Build Coastguard Worker #define VIRGLRENDERER_H 29*bbecb9d1SAndroid Build Coastguard Worker 30*bbecb9d1SAndroid Build Coastguard Worker #include <stdint.h> 31*bbecb9d1SAndroid Build Coastguard Worker #include <stdbool.h> 32*bbecb9d1SAndroid Build Coastguard Worker #include <stdarg.h> 33*bbecb9d1SAndroid Build Coastguard Worker 34*bbecb9d1SAndroid Build Coastguard Worker struct virgl_box; 35*bbecb9d1SAndroid Build Coastguard Worker struct iovec; 36*bbecb9d1SAndroid Build Coastguard Worker 37*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_EXPORT __attribute__((visibility("default"))) 38*bbecb9d1SAndroid Build Coastguard Worker 39*bbecb9d1SAndroid Build Coastguard Worker typedef void *virgl_renderer_gl_context; 40*bbecb9d1SAndroid Build Coastguard Worker 41*bbecb9d1SAndroid Build Coastguard Worker struct virgl_renderer_gl_ctx_param { 42*bbecb9d1SAndroid Build Coastguard Worker int version; 43*bbecb9d1SAndroid Build Coastguard Worker bool shared; 44*bbecb9d1SAndroid Build Coastguard Worker int major_ver; 45*bbecb9d1SAndroid Build Coastguard Worker int minor_ver; 46*bbecb9d1SAndroid Build Coastguard Worker }; 47*bbecb9d1SAndroid Build Coastguard Worker 48*bbecb9d1SAndroid Build Coastguard Worker #ifdef VIRGL_RENDERER_UNSTABLE_APIS 49*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_CALLBACKS_VERSION 4 50*bbecb9d1SAndroid Build Coastguard Worker #else 51*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_CALLBACKS_VERSION 2 52*bbecb9d1SAndroid Build Coastguard Worker #endif 53*bbecb9d1SAndroid Build Coastguard Worker 54*bbecb9d1SAndroid Build Coastguard Worker struct virgl_renderer_callbacks { 55*bbecb9d1SAndroid Build Coastguard Worker int version; 56*bbecb9d1SAndroid Build Coastguard Worker void (*write_fence)(void *cookie, uint32_t fence); 57*bbecb9d1SAndroid Build Coastguard Worker 58*bbecb9d1SAndroid Build Coastguard Worker /* 59*bbecb9d1SAndroid Build Coastguard Worker * The following 3 callbacks allows virglrenderer to 60*bbecb9d1SAndroid Build Coastguard Worker * use winsys from caller, instead of initializing it's own 61*bbecb9d1SAndroid Build Coastguard Worker * winsys (flag VIRGL_RENDERER_USE_EGL or VIRGL_RENDERER_USE_GLX). 62*bbecb9d1SAndroid Build Coastguard Worker */ 63*bbecb9d1SAndroid Build Coastguard Worker 64*bbecb9d1SAndroid Build Coastguard Worker /* create a GL/GLES context */ 65*bbecb9d1SAndroid Build Coastguard Worker virgl_renderer_gl_context (*create_gl_context)(void *cookie, int scanout_idx, struct virgl_renderer_gl_ctx_param *param); 66*bbecb9d1SAndroid Build Coastguard Worker /* destroy a GL/GLES context */ 67*bbecb9d1SAndroid Build Coastguard Worker void (*destroy_gl_context)(void *cookie, virgl_renderer_gl_context ctx); 68*bbecb9d1SAndroid Build Coastguard Worker /* make a context current */ 69*bbecb9d1SAndroid Build Coastguard Worker int (*make_current)(void *cookie, int scanout_idx, virgl_renderer_gl_context ctx); 70*bbecb9d1SAndroid Build Coastguard Worker 71*bbecb9d1SAndroid Build Coastguard Worker /* 72*bbecb9d1SAndroid Build Coastguard Worker * v2, used with flags & VIRGL_RENDERER_USE_EGL 73*bbecb9d1SAndroid Build Coastguard Worker * Chose the drm fd, that will be used by virglrenderer 74*bbecb9d1SAndroid Build Coastguard Worker * for winsys initialization. Virglrenderer takes ownership of the fd 75*bbecb9d1SAndroid Build Coastguard Worker * that is returned and is responsible to close() it. This should not 76*bbecb9d1SAndroid Build Coastguard Worker * return the same fd each time it is call, if called multiple times. 77*bbecb9d1SAndroid Build Coastguard Worker */ 78*bbecb9d1SAndroid Build Coastguard Worker int (*get_drm_fd)(void *cookie); 79*bbecb9d1SAndroid Build Coastguard Worker 80*bbecb9d1SAndroid Build Coastguard Worker #ifdef VIRGL_RENDERER_UNSTABLE_APIS 81*bbecb9d1SAndroid Build Coastguard Worker void (*write_context_fence)(void *cookie, uint32_t ctx_id, uint32_t ring_idx, uint64_t fence_id); 82*bbecb9d1SAndroid Build Coastguard Worker 83*bbecb9d1SAndroid Build Coastguard Worker /* version 0: a connected socket of type SOCK_SEQPACKET */ 84*bbecb9d1SAndroid Build Coastguard Worker int (*get_server_fd)(void *cookie, uint32_t version); 85*bbecb9d1SAndroid Build Coastguard Worker 86*bbecb9d1SAndroid Build Coastguard Worker /* 87*bbecb9d1SAndroid Build Coastguard Worker * Get the EGLDisplay from caller. It requires create_gl_context, 88*bbecb9d1SAndroid Build Coastguard Worker * destroy_gl_context, make_current to be implemented by caller. 89*bbecb9d1SAndroid Build Coastguard Worker */ 90*bbecb9d1SAndroid Build Coastguard Worker void *(*get_egl_display)(void *cookie); 91*bbecb9d1SAndroid Build Coastguard Worker #endif 92*bbecb9d1SAndroid Build Coastguard Worker }; 93*bbecb9d1SAndroid Build Coastguard Worker 94*bbecb9d1SAndroid Build Coastguard Worker /* virtio-gpu compatible interface */ 95*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_USE_EGL 1 96*bbecb9d1SAndroid Build Coastguard Worker /* 97*bbecb9d1SAndroid Build Coastguard Worker * Wait for sync objects in thread rather than polling 98*bbecb9d1SAndroid Build Coastguard Worker * need to use virgl_renderer_get_poll_fd to know if this feature is in effect. 99*bbecb9d1SAndroid Build Coastguard Worker */ 100*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_THREAD_SYNC 2 101*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_USE_GLX (1 << 2) 102*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_USE_SURFACELESS (1 << 3) 103*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_USE_GLES (1 << 4) 104*bbecb9d1SAndroid Build Coastguard Worker 105*bbecb9d1SAndroid Build Coastguard Worker #ifdef VIRGL_RENDERER_UNSTABLE_APIS 106*bbecb9d1SAndroid Build Coastguard Worker /* 107*bbecb9d1SAndroid Build Coastguard Worker * Blob resources used with the 3D driver must be able to be represented as file descriptors. 108*bbecb9d1SAndroid Build Coastguard Worker * The typical use case is the virtual machine manager (or vtest) is running in a multiprocess 109*bbecb9d1SAndroid Build Coastguard Worker * mode. In a standard Linux setup, that means the KVM process is different from the process that 110*bbecb9d1SAndroid Build Coastguard Worker * instantiated virglrenderer. For zero-copy capability to work, file descriptors must be used. 111*bbecb9d1SAndroid Build Coastguard Worker * 112*bbecb9d1SAndroid Build Coastguard Worker * VMMs that advertise support for the virtio-gpu feature VIRTIO_GPU_F_RESOURCE_BLOB and run in 113*bbecb9d1SAndroid Build Coastguard Worker * a multi-process mode *must* specify this flag. 114*bbecb9d1SAndroid Build Coastguard Worker */ 115*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_USE_EXTERNAL_BLOB (1 << 5) 116*bbecb9d1SAndroid Build Coastguard Worker 117*bbecb9d1SAndroid Build Coastguard Worker /* Enable venus renderer. 118*bbecb9d1SAndroid Build Coastguard Worker */ 119*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_VENUS (1 << 6) 120*bbecb9d1SAndroid Build Coastguard Worker 121*bbecb9d1SAndroid Build Coastguard Worker /* Disable virgl renderer. 122*bbecb9d1SAndroid Build Coastguard Worker */ 123*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_NO_VIRGL (1 << 7) 124*bbecb9d1SAndroid Build Coastguard Worker 125*bbecb9d1SAndroid Build Coastguard Worker /* 126*bbecb9d1SAndroid Build Coastguard Worker * Used in conjonction with VIRGL_RENDERER_THREAD_SYNC; 127*bbecb9d1SAndroid Build Coastguard Worker * write_fence callback is executed directly from the polling thread. When enabled, 128*bbecb9d1SAndroid Build Coastguard Worker * virgl_renderer_get_poll_fd should not be used to watch for retired fences. 129*bbecb9d1SAndroid Build Coastguard Worker */ 130*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_ASYNC_FENCE_CB (1 << 8) 131*bbecb9d1SAndroid Build Coastguard Worker 132*bbecb9d1SAndroid Build Coastguard Worker /* Start a render server and move GPU rendering to the render server. 133*bbecb9d1SAndroid Build Coastguard Worker * 134*bbecb9d1SAndroid Build Coastguard Worker * This is respected by the venus renderer but ignored by the virgl renderer. 135*bbecb9d1SAndroid Build Coastguard Worker */ 136*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_RENDER_SERVER (1 << 9) 137*bbecb9d1SAndroid Build Coastguard Worker 138*bbecb9d1SAndroid Build Coastguard Worker /* 139*bbecb9d1SAndroid Build Coastguard Worker * Enable drm renderer. 140*bbecb9d1SAndroid Build Coastguard Worker */ 141*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_DRM (1 << 10) 142*bbecb9d1SAndroid Build Coastguard Worker 143*bbecb9d1SAndroid Build Coastguard Worker /* Video encode/decode */ 144*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_USE_VIDEO (1 << 11) 145*bbecb9d1SAndroid Build Coastguard Worker 146*bbecb9d1SAndroid Build Coastguard Worker 147*bbecb9d1SAndroid Build Coastguard Worker #endif /* VIRGL_RENDERER_UNSTABLE_APIS */ 148*bbecb9d1SAndroid Build Coastguard Worker 149*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int virgl_renderer_init(void *cookie, int flags, struct virgl_renderer_callbacks *cb); 150*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT void virgl_renderer_poll(void); /* force fences */ 151*bbecb9d1SAndroid Build Coastguard Worker 152*bbecb9d1SAndroid Build Coastguard Worker /* we need to give qemu the cursor resource contents */ 153*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT void *virgl_renderer_get_cursor_data(uint32_t resource_id, uint32_t *width, uint32_t *height); 154*bbecb9d1SAndroid Build Coastguard Worker 155*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT void virgl_renderer_get_rect(int resource_id, struct iovec *iov, unsigned int num_iovs, 156*bbecb9d1SAndroid Build Coastguard Worker uint32_t offset, int x, int y, int width, int height); 157*bbecb9d1SAndroid Build Coastguard Worker 158*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int virgl_renderer_get_fd_for_texture(uint32_t tex_id, int *fd); 159*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int virgl_renderer_get_fd_for_texture2(uint32_t tex_id, int *fd, int *stride, int *offset); 160*bbecb9d1SAndroid Build Coastguard Worker 161*bbecb9d1SAndroid Build Coastguard Worker /* 162*bbecb9d1SAndroid Build Coastguard Worker * These are only here for compatibility-reasons. In the future, use the flags 163*bbecb9d1SAndroid Build Coastguard Worker * from virgl_hw.h instead. 164*bbecb9d1SAndroid Build Coastguard Worker */ 165*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RES_BIND_DEPTH_STENCIL (1 << 0) 166*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RES_BIND_RENDER_TARGET (1 << 1) 167*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RES_BIND_SAMPLER_VIEW (1 << 3) 168*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RES_BIND_VERTEX_BUFFER (1 << 4) 169*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RES_BIND_INDEX_BUFFER (1 << 5) 170*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RES_BIND_CONSTANT_BUFFER (1 << 6) 171*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RES_BIND_STREAM_OUTPUT (1 << 11) 172*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RES_BIND_CURSOR (1 << 16) 173*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RES_BIND_CUSTOM (1 << 17) 174*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RES_BIND_SCANOUT (1 << 18) 175*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RES_BIND_SHARED (1 << 20) 176*bbecb9d1SAndroid Build Coastguard Worker 177*bbecb9d1SAndroid Build Coastguard Worker enum virgl_renderer_structure_type_v0 { 178*bbecb9d1SAndroid Build Coastguard Worker VIRGL_RENDERER_STRUCTURE_TYPE_NONE = 0, 179*bbecb9d1SAndroid Build Coastguard Worker VIRGL_RENDERER_STRUCTURE_TYPE_EXPORT_QUERY = (1 << 0), 180*bbecb9d1SAndroid Build Coastguard Worker VIRGL_RENDERER_STRUCTURE_TYPE_SUPPORTED_STRUCTURES = (1 << 1), 181*bbecb9d1SAndroid Build Coastguard Worker }; 182*bbecb9d1SAndroid Build Coastguard Worker 183*bbecb9d1SAndroid Build Coastguard Worker struct virgl_renderer_resource_create_args { 184*bbecb9d1SAndroid Build Coastguard Worker uint32_t handle; 185*bbecb9d1SAndroid Build Coastguard Worker uint32_t target; 186*bbecb9d1SAndroid Build Coastguard Worker uint32_t format; 187*bbecb9d1SAndroid Build Coastguard Worker uint32_t bind; 188*bbecb9d1SAndroid Build Coastguard Worker uint32_t width; 189*bbecb9d1SAndroid Build Coastguard Worker uint32_t height; 190*bbecb9d1SAndroid Build Coastguard Worker uint32_t depth; 191*bbecb9d1SAndroid Build Coastguard Worker uint32_t array_size; 192*bbecb9d1SAndroid Build Coastguard Worker uint32_t last_level; 193*bbecb9d1SAndroid Build Coastguard Worker uint32_t nr_samples; 194*bbecb9d1SAndroid Build Coastguard Worker uint32_t flags; 195*bbecb9d1SAndroid Build Coastguard Worker }; 196*bbecb9d1SAndroid Build Coastguard Worker 197*bbecb9d1SAndroid Build Coastguard Worker struct virgl_renderer_hdr { 198*bbecb9d1SAndroid Build Coastguard Worker uint32_t stype; 199*bbecb9d1SAndroid Build Coastguard Worker uint32_t stype_version; 200*bbecb9d1SAndroid Build Coastguard Worker uint32_t size; 201*bbecb9d1SAndroid Build Coastguard Worker }; 202*bbecb9d1SAndroid Build Coastguard Worker 203*bbecb9d1SAndroid Build Coastguard Worker /* 204*bbecb9d1SAndroid Build Coastguard Worker * "out_num_fds" represents the number of distinct kernel buffers backing an 205*bbecb9d1SAndroid Build Coastguard Worker * allocation. If this number or 'out_fourcc' is zero, the resource is not 206*bbecb9d1SAndroid Build Coastguard Worker * exportable. The "out_fds" field will be populated with "out_num_fds" file 207*bbecb9d1SAndroid Build Coastguard Worker * descriptors if "in_export_fds" is non-zero. 208*bbecb9d1SAndroid Build Coastguard Worker */ 209*bbecb9d1SAndroid Build Coastguard Worker struct virgl_renderer_export_query { 210*bbecb9d1SAndroid Build Coastguard Worker struct virgl_renderer_hdr hdr; 211*bbecb9d1SAndroid Build Coastguard Worker uint32_t in_resource_id; 212*bbecb9d1SAndroid Build Coastguard Worker 213*bbecb9d1SAndroid Build Coastguard Worker uint32_t out_num_fds; 214*bbecb9d1SAndroid Build Coastguard Worker uint32_t in_export_fds; 215*bbecb9d1SAndroid Build Coastguard Worker uint32_t out_fourcc; 216*bbecb9d1SAndroid Build Coastguard Worker uint32_t pad; 217*bbecb9d1SAndroid Build Coastguard Worker 218*bbecb9d1SAndroid Build Coastguard Worker int32_t out_fds[4]; 219*bbecb9d1SAndroid Build Coastguard Worker uint32_t out_strides[4]; 220*bbecb9d1SAndroid Build Coastguard Worker uint32_t out_offsets[4]; 221*bbecb9d1SAndroid Build Coastguard Worker uint64_t out_modifier; 222*bbecb9d1SAndroid Build Coastguard Worker }; 223*bbecb9d1SAndroid Build Coastguard Worker 224*bbecb9d1SAndroid Build Coastguard Worker /* 225*bbecb9d1SAndroid Build Coastguard Worker * "out_supported_structures_mask" is a bitmask representing the structures that 226*bbecb9d1SAndroid Build Coastguard Worker * virglrenderer knows how to handle for a given "in_stype_version". 227*bbecb9d1SAndroid Build Coastguard Worker */ 228*bbecb9d1SAndroid Build Coastguard Worker 229*bbecb9d1SAndroid Build Coastguard Worker struct virgl_renderer_supported_structures { 230*bbecb9d1SAndroid Build Coastguard Worker struct virgl_renderer_hdr hdr; 231*bbecb9d1SAndroid Build Coastguard Worker uint32_t in_stype_version; 232*bbecb9d1SAndroid Build Coastguard Worker uint32_t out_supported_structures_mask; 233*bbecb9d1SAndroid Build Coastguard Worker }; 234*bbecb9d1SAndroid Build Coastguard Worker 235*bbecb9d1SAndroid Build Coastguard Worker /* new API */ 236*bbecb9d1SAndroid Build Coastguard Worker /* This typedef must be kept in sync with vrend_debug.h */ 237*bbecb9d1SAndroid Build Coastguard Worker typedef void (*virgl_debug_callback_type)(const char *fmt, va_list ap); 238*bbecb9d1SAndroid Build Coastguard Worker 239*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int virgl_renderer_resource_create(struct virgl_renderer_resource_create_args *args, struct iovec *iov, uint32_t num_iovs); 240*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int virgl_renderer_resource_import_eglimage(struct virgl_renderer_resource_create_args *args, void *image); 241*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT void virgl_renderer_resource_unref(uint32_t res_handle); 242*bbecb9d1SAndroid Build Coastguard Worker 243*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT void virgl_renderer_resource_set_priv(uint32_t res_handle, void *priv); 244*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT void *virgl_renderer_resource_get_priv(uint32_t res_handle); 245*bbecb9d1SAndroid Build Coastguard Worker 246*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int virgl_renderer_context_create(uint32_t handle, uint32_t nlen, const char *name); 247*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT void virgl_renderer_context_destroy(uint32_t handle); 248*bbecb9d1SAndroid Build Coastguard Worker 249*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int virgl_renderer_submit_cmd(void *buffer, 250*bbecb9d1SAndroid Build Coastguard Worker int ctx_id, 251*bbecb9d1SAndroid Build Coastguard Worker int ndw); 252*bbecb9d1SAndroid Build Coastguard Worker 253*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int virgl_renderer_transfer_read_iov(uint32_t handle, uint32_t ctx_id, 254*bbecb9d1SAndroid Build Coastguard Worker uint32_t level, uint32_t stride, 255*bbecb9d1SAndroid Build Coastguard Worker uint32_t layer_stride, 256*bbecb9d1SAndroid Build Coastguard Worker struct virgl_box *box, 257*bbecb9d1SAndroid Build Coastguard Worker uint64_t offset, struct iovec *iov, 258*bbecb9d1SAndroid Build Coastguard Worker int iovec_cnt); 259*bbecb9d1SAndroid Build Coastguard Worker 260*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int virgl_renderer_transfer_write_iov(uint32_t handle, 261*bbecb9d1SAndroid Build Coastguard Worker uint32_t ctx_id, 262*bbecb9d1SAndroid Build Coastguard Worker int level, 263*bbecb9d1SAndroid Build Coastguard Worker uint32_t stride, 264*bbecb9d1SAndroid Build Coastguard Worker uint32_t layer_stride, 265*bbecb9d1SAndroid Build Coastguard Worker struct virgl_box *box, 266*bbecb9d1SAndroid Build Coastguard Worker uint64_t offset, 267*bbecb9d1SAndroid Build Coastguard Worker struct iovec *iovec, 268*bbecb9d1SAndroid Build Coastguard Worker unsigned int iovec_cnt); 269*bbecb9d1SAndroid Build Coastguard Worker 270*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT void virgl_renderer_get_cap_set(uint32_t set, uint32_t *max_ver, 271*bbecb9d1SAndroid Build Coastguard Worker uint32_t *max_size); 272*bbecb9d1SAndroid Build Coastguard Worker 273*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT void virgl_renderer_fill_caps(uint32_t set, uint32_t version, 274*bbecb9d1SAndroid Build Coastguard Worker void *caps); 275*bbecb9d1SAndroid Build Coastguard Worker 276*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int virgl_renderer_resource_attach_iov(int res_handle, struct iovec *iov, 277*bbecb9d1SAndroid Build Coastguard Worker int num_iovs); 278*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT void virgl_renderer_resource_detach_iov(int res_handle, struct iovec **iov, int *num_iovs); 279*bbecb9d1SAndroid Build Coastguard Worker 280*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int virgl_renderer_create_fence(int client_fence_id, uint32_t ctx_id); 281*bbecb9d1SAndroid Build Coastguard Worker 282*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT void virgl_renderer_force_ctx_0(void); 283*bbecb9d1SAndroid Build Coastguard Worker 284*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT void virgl_renderer_ctx_attach_resource(int ctx_id, int res_handle); 285*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT void virgl_renderer_ctx_detach_resource(int ctx_id, int res_handle); 286*bbecb9d1SAndroid Build Coastguard Worker 287*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT virgl_debug_callback_type virgl_set_debug_callback(virgl_debug_callback_type cb); 288*bbecb9d1SAndroid Build Coastguard Worker 289*bbecb9d1SAndroid Build Coastguard Worker /* return information about a resource */ 290*bbecb9d1SAndroid Build Coastguard Worker 291*bbecb9d1SAndroid Build Coastguard Worker struct virgl_renderer_resource_info { 292*bbecb9d1SAndroid Build Coastguard Worker uint32_t handle; 293*bbecb9d1SAndroid Build Coastguard Worker uint32_t virgl_format; 294*bbecb9d1SAndroid Build Coastguard Worker uint32_t width; 295*bbecb9d1SAndroid Build Coastguard Worker uint32_t height; 296*bbecb9d1SAndroid Build Coastguard Worker uint32_t depth; 297*bbecb9d1SAndroid Build Coastguard Worker uint32_t flags; 298*bbecb9d1SAndroid Build Coastguard Worker uint32_t tex_id; 299*bbecb9d1SAndroid Build Coastguard Worker uint32_t stride; 300*bbecb9d1SAndroid Build Coastguard Worker int drm_fourcc; 301*bbecb9d1SAndroid Build Coastguard Worker }; 302*bbecb9d1SAndroid Build Coastguard Worker 303*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int virgl_renderer_resource_get_info(int res_handle, 304*bbecb9d1SAndroid Build Coastguard Worker struct virgl_renderer_resource_info *info); 305*bbecb9d1SAndroid Build Coastguard Worker 306*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT void virgl_renderer_cleanup(void *cookie); 307*bbecb9d1SAndroid Build Coastguard Worker 308*bbecb9d1SAndroid Build Coastguard Worker /* reset the rendererer - destroy all contexts and resource */ 309*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT void virgl_renderer_reset(void); 310*bbecb9d1SAndroid Build Coastguard Worker 311*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int virgl_renderer_get_poll_fd(void); 312*bbecb9d1SAndroid Build Coastguard Worker 313*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int virgl_renderer_execute(void *execute_args, uint32_t execute_size); 314*bbecb9d1SAndroid Build Coastguard Worker 315*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_CONTEXT_FLAG_CAPSET_ID_MASK 0xff 316*bbecb9d1SAndroid Build Coastguard Worker 317*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int virgl_renderer_context_create_with_flags(uint32_t ctx_id, 318*bbecb9d1SAndroid Build Coastguard Worker uint32_t ctx_flags, 319*bbecb9d1SAndroid Build Coastguard Worker uint32_t nlen, 320*bbecb9d1SAndroid Build Coastguard Worker const char *name); 321*bbecb9d1SAndroid Build Coastguard Worker 322*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_BLOB_MEM_GUEST 0x0001 323*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_BLOB_MEM_HOST3D 0x0002 324*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_BLOB_MEM_HOST3D_GUEST 0x0003 325*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_BLOB_MEM_GUEST_VRAM 0x0004 326*bbecb9d1SAndroid Build Coastguard Worker 327*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_BLOB_FLAG_USE_MAPPABLE 0x0001 328*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_BLOB_FLAG_USE_SHAREABLE 0x0002 329*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_BLOB_FLAG_USE_CROSS_DEVICE 0x0004 330*bbecb9d1SAndroid Build Coastguard Worker 331*bbecb9d1SAndroid Build Coastguard Worker struct virgl_renderer_resource_create_blob_args 332*bbecb9d1SAndroid Build Coastguard Worker { 333*bbecb9d1SAndroid Build Coastguard Worker uint32_t res_handle; 334*bbecb9d1SAndroid Build Coastguard Worker uint32_t ctx_id; 335*bbecb9d1SAndroid Build Coastguard Worker uint32_t blob_mem; 336*bbecb9d1SAndroid Build Coastguard Worker uint32_t blob_flags; 337*bbecb9d1SAndroid Build Coastguard Worker uint64_t blob_id; 338*bbecb9d1SAndroid Build Coastguard Worker uint64_t size; 339*bbecb9d1SAndroid Build Coastguard Worker const struct iovec *iovecs; 340*bbecb9d1SAndroid Build Coastguard Worker uint32_t num_iovs; 341*bbecb9d1SAndroid Build Coastguard Worker }; 342*bbecb9d1SAndroid Build Coastguard Worker 343*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int 344*bbecb9d1SAndroid Build Coastguard Worker virgl_renderer_resource_create_blob(const struct virgl_renderer_resource_create_blob_args *args); 345*bbecb9d1SAndroid Build Coastguard Worker 346*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int virgl_renderer_resource_map(uint32_t res_handle, void **map, uint64_t *out_size); 347*bbecb9d1SAndroid Build Coastguard Worker 348*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int virgl_renderer_resource_unmap(uint32_t res_handle); 349*bbecb9d1SAndroid Build Coastguard Worker 350*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_MAP_CACHE_MASK 0x0f 351*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_MAP_CACHE_NONE 0x00 352*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_MAP_CACHE_CACHED 0x01 353*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_MAP_CACHE_UNCACHED 0x02 354*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_MAP_CACHE_WC 0x03 355*bbecb9d1SAndroid Build Coastguard Worker 356*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int virgl_renderer_resource_get_map_info(uint32_t res_handle, uint32_t *map_info); 357*bbecb9d1SAndroid Build Coastguard Worker 358*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_BLOB_FD_TYPE_DMABUF 0x0001 359*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_BLOB_FD_TYPE_OPAQUE 0x0002 360*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_BLOB_FD_TYPE_SHM 0x0003 361*bbecb9d1SAndroid Build Coastguard Worker 362*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int 363*bbecb9d1SAndroid Build Coastguard Worker virgl_renderer_resource_export_blob(uint32_t res_id, uint32_t *fd_type, int *fd); 364*bbecb9d1SAndroid Build Coastguard Worker 365*bbecb9d1SAndroid Build Coastguard Worker /* 366*bbecb9d1SAndroid Build Coastguard Worker * These are unstable APIs for development only. Use these for development/testing purposes 367*bbecb9d1SAndroid Build Coastguard Worker * only, not in production 368*bbecb9d1SAndroid Build Coastguard Worker */ 369*bbecb9d1SAndroid Build Coastguard Worker #ifdef VIRGL_RENDERER_UNSTABLE_APIS 370*bbecb9d1SAndroid Build Coastguard Worker 371*bbecb9d1SAndroid Build Coastguard Worker struct virgl_renderer_resource_import_blob_args 372*bbecb9d1SAndroid Build Coastguard Worker { 373*bbecb9d1SAndroid Build Coastguard Worker uint32_t res_handle; 374*bbecb9d1SAndroid Build Coastguard Worker uint32_t blob_mem; 375*bbecb9d1SAndroid Build Coastguard Worker uint32_t fd_type; 376*bbecb9d1SAndroid Build Coastguard Worker int fd; 377*bbecb9d1SAndroid Build Coastguard Worker uint64_t size; 378*bbecb9d1SAndroid Build Coastguard Worker }; 379*bbecb9d1SAndroid Build Coastguard Worker 380*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int 381*bbecb9d1SAndroid Build Coastguard Worker virgl_renderer_resource_import_blob(const struct virgl_renderer_resource_import_blob_args *args); 382*bbecb9d1SAndroid Build Coastguard Worker 383*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int 384*bbecb9d1SAndroid Build Coastguard Worker virgl_renderer_export_fence(uint32_t client_fence_id, int *fd); 385*bbecb9d1SAndroid Build Coastguard Worker 386*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_RENDERER_FENCE_FLAG_MERGEABLE (1 << 0) 387*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int virgl_renderer_context_create_fence(uint32_t ctx_id, 388*bbecb9d1SAndroid Build Coastguard Worker uint32_t flags, 389*bbecb9d1SAndroid Build Coastguard Worker uint32_t ring_idx, 390*bbecb9d1SAndroid Build Coastguard Worker uint64_t fence_id); 391*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT void virgl_renderer_context_poll(uint32_t ctx_id); /* force fences */ 392*bbecb9d1SAndroid Build Coastguard Worker VIRGL_EXPORT int virgl_renderer_context_get_poll_fd(uint32_t ctx_id); 393*bbecb9d1SAndroid Build Coastguard Worker 394*bbecb9d1SAndroid Build Coastguard Worker #endif /* VIRGL_RENDERER_UNSTABLE_APIS */ 395*bbecb9d1SAndroid Build Coastguard Worker 396*bbecb9d1SAndroid Build Coastguard Worker #endif 397