Home | History | Annotate | Download | only in src
      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 #define VIRGL_RENDERER_CALLBACKS_VERSION 2
     48 
     49 struct virgl_renderer_callbacks {
     50    int version;
     51    void (*write_fence)(void *cookie, uint32_t fence);
     52 
     53    /* interact with GL implementation */
     54    virgl_renderer_gl_context (*create_gl_context)(void *cookie, int scanout_idx, struct virgl_renderer_gl_ctx_param *param);
     55    void (*destroy_gl_context)(void *cookie, virgl_renderer_gl_context ctx);
     56    int (*make_current)(void *cookie, int scanout_idx, virgl_renderer_gl_context ctx);
     57 
     58    int (*get_drm_fd)(void *cookie); /* v2, used with flags & VIRGL_RENDERER_USE_EGL */
     59 };
     60 
     61 /* virtio-gpu compatible interface */
     62 #define VIRGL_RENDERER_USE_EGL 1
     63 /*
     64  * Wait for sync objects in thread rather than polling
     65  * need to use virgl_renderer_get_poll_fd to know if this feature is in effect.
     66  */
     67 #define VIRGL_RENDERER_THREAD_SYNC 2
     68 #define VIRGL_RENDERER_USE_GLX (1 << 2)
     69 #define VIRGL_RENDERER_USE_SURFACELESS (1 << 3)
     70 #define VIRGL_RENDERER_USE_GLES (1 << 4)
     71 
     72 VIRGL_EXPORT int virgl_renderer_init(void *cookie, int flags, struct virgl_renderer_callbacks *cb);
     73 VIRGL_EXPORT void virgl_renderer_poll(void); /* force fences */
     74 
     75 /* we need to give qemu the cursor resource contents */
     76 VIRGL_EXPORT void *virgl_renderer_get_cursor_data(uint32_t resource_id, uint32_t *width, uint32_t *height);
     77 
     78 VIRGL_EXPORT void virgl_renderer_get_rect(int resource_id, struct iovec *iov, unsigned int num_iovs,
     79                                           uint32_t offset, int x, int y, int width, int height);
     80 
     81 VIRGL_EXPORT int virgl_renderer_get_fd_for_texture(uint32_t tex_id, int *fd);
     82 VIRGL_EXPORT int virgl_renderer_get_fd_for_texture2(uint32_t tex_id, int *fd, int *stride, int *offset);
     83 
     84 /*
     85  * These are only here for compatibility-reasons. In the future, use the flags
     86  * from virgl_hw.h instead.
     87  */
     88 #define VIRGL_RES_BIND_DEPTH_STENCIL (1 << 0)
     89 #define VIRGL_RES_BIND_RENDER_TARGET (1 << 1)
     90 #define VIRGL_RES_BIND_SAMPLER_VIEW  (1 << 3)
     91 #define VIRGL_RES_BIND_VERTEX_BUFFER (1 << 4)
     92 #define VIRGL_RES_BIND_INDEX_BUFFER  (1 << 5)
     93 #define VIRGL_RES_BIND_CONSTANT_BUFFER (1 << 6)
     94 #define VIRGL_RES_BIND_STREAM_OUTPUT (1 << 11)
     95 #define VIRGL_RES_BIND_CURSOR        (1 << 16)
     96 #define VIRGL_RES_BIND_CUSTOM        (1 << 17)
     97 
     98 struct virgl_renderer_resource_create_args {
     99    uint32_t handle;
    100    uint32_t target;
    101    uint32_t format;
    102    uint32_t bind;
    103    uint32_t width;
    104    uint32_t height;
    105    uint32_t depth;
    106    uint32_t array_size;
    107    uint32_t last_level;
    108    uint32_t nr_samples;
    109    uint32_t flags;
    110 };
    111 
    112 /* new API */
    113 
    114 VIRGL_EXPORT int virgl_renderer_resource_create(struct virgl_renderer_resource_create_args *args, struct iovec *iov, uint32_t num_iovs);
    115 VIRGL_EXPORT int virgl_renderer_resource_import_eglimage(struct virgl_renderer_resource_create_args *args, void *image);
    116 VIRGL_EXPORT void virgl_renderer_resource_unref(uint32_t res_handle);
    117 
    118 VIRGL_EXPORT int virgl_renderer_context_create(uint32_t handle, uint32_t nlen, const char *name);
    119 VIRGL_EXPORT void virgl_renderer_context_destroy(uint32_t handle);
    120 
    121 VIRGL_EXPORT int virgl_renderer_submit_cmd(void *buffer,
    122                                            int ctx_id,
    123                                            int ndw);
    124 
    125 VIRGL_EXPORT int virgl_renderer_transfer_read_iov(uint32_t handle, uint32_t ctx_id,
    126                                                   uint32_t level, uint32_t stride,
    127                                                   uint32_t layer_stride,
    128                                                   struct virgl_box *box,
    129                                                   uint64_t offset, struct iovec *iov,
    130                                                   int iovec_cnt);
    131 
    132 VIRGL_EXPORT int virgl_renderer_transfer_write_iov(uint32_t handle,
    133                                                    uint32_t ctx_id,
    134                                                    int level,
    135                                                    uint32_t stride,
    136                                                    uint32_t layer_stride,
    137                                                    struct virgl_box *box,
    138                                                    uint64_t offset,
    139                                                    struct iovec *iovec,
    140                                                    unsigned int iovec_cnt);
    141 
    142 VIRGL_EXPORT void virgl_renderer_get_cap_set(uint32_t set, uint32_t *max_ver,
    143                                              uint32_t *max_size);
    144 
    145 VIRGL_EXPORT void virgl_renderer_fill_caps(uint32_t set, uint32_t version,
    146                                            void *caps);
    147 
    148 VIRGL_EXPORT int virgl_renderer_resource_attach_iov(int res_handle, struct iovec *iov,
    149                                                     int num_iovs);
    150 VIRGL_EXPORT void virgl_renderer_resource_detach_iov(int res_handle, struct iovec **iov, int *num_iovs);
    151 
    152 VIRGL_EXPORT int virgl_renderer_create_fence(int client_fence_id, uint32_t ctx_id);
    153 
    154 VIRGL_EXPORT void virgl_renderer_force_ctx_0(void);
    155 
    156 VIRGL_EXPORT void virgl_renderer_ctx_attach_resource(int ctx_id, int res_handle);
    157 VIRGL_EXPORT void virgl_renderer_ctx_detach_resource(int ctx_id, int res_handle);
    158 
    159 /* return information about a resource */
    160 
    161 struct virgl_renderer_resource_info {
    162    uint32_t handle;
    163    uint32_t virgl_format;
    164    uint32_t width;
    165    uint32_t height;
    166    uint32_t depth;
    167    uint32_t flags;
    168    uint32_t tex_id;
    169    uint32_t stride;
    170    int drm_fourcc;
    171 };
    172 
    173 VIRGL_EXPORT int virgl_renderer_resource_get_info(int res_handle,
    174                                                   struct virgl_renderer_resource_info *info);
    175 
    176 VIRGL_EXPORT void virgl_renderer_cleanup(void *cookie);
    177 
    178 /* reset the rendererer - destroy all contexts and resource */
    179 VIRGL_EXPORT void virgl_renderer_reset(void);
    180 
    181 VIRGL_EXPORT int virgl_renderer_get_poll_fd(void);
    182 
    183 #endif
    184