1/* 2 * Copyright 2014, 2015 Red Hat. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * on the rights to use, copy, modify, merge, publish, distribute, sub 8 * license, and/or sell copies of the Software, and to permit persons to whom 9 * the Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21 * USE OR OTHER DEALINGS IN THE SOFTWARE. 22 */ 23#ifndef VIRGL_WINSYS_H 24#define VIRGL_WINSYS_H 25 26#include "pipe/p_defines.h" 27#include "virgl_hw.h" 28 29struct pipe_box; 30struct pipe_fence_handle; 31struct winsys_handle; 32struct virgl_hw_res; 33 34#define VIRGL_MAX_TBUF_DWORDS 1024 35#define VIRGL_MAX_CMDBUF_DWORDS ((64 * 1024) + VIRGL_MAX_TBUF_DWORDS) 36 37struct virgl_drm_caps { 38 union virgl_caps caps; 39}; 40 41struct virgl_cmd_buf { 42 unsigned cdw; 43 uint32_t *buf; 44}; 45 46struct virgl_winsys { 47 unsigned pci_id; 48 int supports_fences; /* In/Out fences are supported */ 49 int supports_encoded_transfers; /* Encoded transfers are supported */ 50 51 void (*destroy)(struct virgl_winsys *vws); 52 53 int (*transfer_put)(struct virgl_winsys *vws, 54 struct virgl_hw_res *res, 55 const struct pipe_box *box, 56 uint32_t stride, uint32_t layer_stride, 57 uint32_t buf_offset, uint32_t level); 58 59 int (*transfer_get)(struct virgl_winsys *vws, 60 struct virgl_hw_res *res, 61 const struct pipe_box *box, 62 uint32_t stride, uint32_t layer_stride, 63 uint32_t buf_offset, uint32_t level); 64 65 struct virgl_hw_res *(*resource_create)(struct virgl_winsys *vws, 66 enum pipe_texture_target target, 67 uint32_t format, uint32_t bind, 68 uint32_t width, uint32_t height, 69 uint32_t depth, uint32_t array_size, 70 uint32_t last_level, uint32_t nr_samples, 71 uint32_t size); 72 73 void (*resource_unref)(struct virgl_winsys *vws, struct virgl_hw_res *res); 74 75 void *(*resource_map)(struct virgl_winsys *vws, struct virgl_hw_res *res); 76 void (*resource_wait)(struct virgl_winsys *vws, struct virgl_hw_res *res); 77 78 struct virgl_hw_res *(*resource_create_from_handle)(struct virgl_winsys *vws, 79 struct winsys_handle *whandle); 80 boolean (*resource_get_handle)(struct virgl_winsys *vws, 81 struct virgl_hw_res *res, 82 uint32_t stride, 83 struct winsys_handle *whandle); 84 85 struct virgl_cmd_buf *(*cmd_buf_create)(struct virgl_winsys *ws, uint32_t size); 86 void (*cmd_buf_destroy)(struct virgl_cmd_buf *buf); 87 88 void (*emit_res)(struct virgl_winsys *vws, struct virgl_cmd_buf *buf, struct virgl_hw_res *res, boolean write_buffer); 89 int (*submit_cmd)(struct virgl_winsys *vws, struct virgl_cmd_buf *buf, 90 struct pipe_fence_handle **fence); 91 92 boolean (*res_is_referenced)(struct virgl_winsys *vws, 93 struct virgl_cmd_buf *buf, 94 struct virgl_hw_res *res); 95 96 int (*get_caps)(struct virgl_winsys *vws, struct virgl_drm_caps *caps); 97 98 /* fence */ 99 struct pipe_fence_handle *(*cs_create_fence)(struct virgl_winsys *vws, int fd); 100 bool (*fence_wait)(struct virgl_winsys *vws, 101 struct pipe_fence_handle *fence, 102 uint64_t timeout); 103 104 void (*fence_reference)(struct virgl_winsys *vws, 105 struct pipe_fence_handle **dst, 106 struct pipe_fence_handle *src); 107 108 /* for sw paths */ 109 void (*flush_frontbuffer)(struct virgl_winsys *vws, 110 struct virgl_hw_res *res, 111 unsigned level, unsigned layer, 112 void *winsys_drawable_handle, 113 struct pipe_box *sub_box); 114 void (*fence_server_sync)(struct virgl_winsys *vws, 115 struct virgl_cmd_buf *cbuf, 116 struct pipe_fence_handle *fence); 117 118 int (*fence_get_fd)(struct virgl_winsys *vws, 119 struct pipe_fence_handle *fence); 120}; 121 122/* this defaults all newer caps, 123 * the kernel will overwrite these if newer version is available. 124 */ 125static inline void virgl_ws_fill_new_caps_defaults(struct virgl_drm_caps *caps) 126{ 127 caps->caps.v2.min_aliased_point_size = 1.f; 128 caps->caps.v2.max_aliased_point_size = 255.f; 129 caps->caps.v2.min_smooth_point_size = 1.f; 130 caps->caps.v2.max_smooth_point_size = 190.f; 131 caps->caps.v2.min_aliased_line_width = 1.f; 132 caps->caps.v2.max_aliased_line_width = 10.f; 133 caps->caps.v2.min_smooth_line_width = 0.f; 134 caps->caps.v2.max_smooth_line_width = 10.f; 135 caps->caps.v2.max_texture_lod_bias = 15.0f; 136 caps->caps.v2.max_geom_output_vertices = 256; 137 caps->caps.v2.max_geom_total_output_components = 1024; 138 caps->caps.v2.max_vertex_outputs = 32; 139 caps->caps.v2.max_vertex_attribs = 16; 140 caps->caps.v2.max_shader_patch_varyings = 30; 141 caps->caps.v2.min_texel_offset = -8; 142 caps->caps.v2.max_texel_offset = 7; 143 caps->caps.v2.min_texture_gather_offset = -8; 144 caps->caps.v2.max_texture_gather_offset = 7; 145 caps->caps.v2.texture_buffer_offset_alignment = 0; 146 caps->caps.v2.uniform_buffer_offset_alignment = 256; 147 caps->caps.v2.shader_buffer_offset_alignment = 32; 148 caps->caps.v2.capability_bits = 0; 149 caps->caps.v2.max_vertex_attrib_stride = 0; 150 caps->caps.v2.max_image_samples = 0; 151 caps->caps.v2.max_compute_work_group_invocations = 0; 152 caps->caps.v2.max_compute_shared_memory_size = 0; 153 caps->caps.v2.host_feature_check_version = 0; 154} 155#endif 156