1 /********************************************************** 2 * Copyright 2008-2009 VMware, Inc. All rights reserved. 3 * 4 * Permission is hereby granted, free of charge, to any person 5 * obtaining a copy of this software and associated documentation 6 * files (the "Software"), to deal in the Software without 7 * restriction, including without limitation the rights to use, copy, 8 * modify, merge, publish, distribute, sublicense, and/or sell copies 9 * of the Software, and to permit persons to whom the Software is 10 * furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be 13 * included in all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 19 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 20 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 * SOFTWARE. 23 * 24 **********************************************************/ 25 26 /** 27 * @file 28 * VMware SVGA specific winsys interface. 29 * 30 * @author Jose Fonseca <jfonseca (at) vmware.com> 31 * 32 * Documentation taken from the VMware SVGA DDK. 33 */ 34 35 #ifndef SVGA_WINSYS_H_ 36 #define SVGA_WINSYS_H_ 37 38 39 #include "svga_types.h" 40 #include "svga_reg.h" 41 #include "svga3d_reg.h" 42 43 #include "pipe/p_compiler.h" 44 #include "pipe/p_defines.h" 45 46 47 struct svga_winsys_screen; 48 struct svga_winsys_buffer; 49 struct pipe_screen; 50 struct pipe_context; 51 struct pipe_fence_handle; 52 struct pipe_resource; 53 struct svga_region; 54 struct winsys_handle; 55 56 57 #define SVGA_BUFFER_USAGE_PINNED (1 << 0) 58 #define SVGA_BUFFER_USAGE_WRAPPED (1 << 1) 59 60 61 #define SVGA_RELOC_WRITE 0x1 62 #define SVGA_RELOC_READ 0x2 63 64 #define SVGA_FENCE_FLAG_EXEC (1 << 0) 65 #define SVGA_FENCE_FLAG_QUERY (1 << 1) 66 67 /** Opaque surface handle */ 68 struct svga_winsys_surface; 69 70 71 /** 72 * SVGA per-context winsys interface. 73 */ 74 struct svga_winsys_context 75 { 76 void 77 (*destroy)(struct svga_winsys_context *swc); 78 79 void * 80 (*reserve)(struct svga_winsys_context *swc, 81 uint32_t nr_bytes, uint32_t nr_relocs ); 82 83 /** 84 * Emit a relocation for a host surface. 85 * 86 * @param flags bitmask of SVGA_RELOC_* flags 87 * 88 * NOTE: Order of this call does matter. It should be the same order 89 * as relocations appear in the command buffer. 90 */ 91 void 92 (*surface_relocation)(struct svga_winsys_context *swc, 93 uint32 *sid, 94 struct svga_winsys_surface *surface, 95 unsigned flags); 96 97 /** 98 * Emit a relocation for a guest memory region. 99 * 100 * @param flags bitmask of SVGA_RELOC_* flags 101 * 102 * NOTE: Order of this call does matter. It should be the same order 103 * as relocations appear in the command buffer. 104 */ 105 void 106 (*region_relocation)(struct svga_winsys_context *swc, 107 struct SVGAGuestPtr *ptr, 108 struct svga_winsys_buffer *buffer, 109 uint32 offset, 110 unsigned flags); 111 112 void 113 (*commit)(struct svga_winsys_context *swc); 114 115 enum pipe_error 116 (*flush)(struct svga_winsys_context *swc, 117 struct pipe_fence_handle **pfence); 118 119 /** 120 * Context ID used to fill in the commands 121 * 122 * Context IDs are arbitrary small non-negative integers, 123 * global to the entire SVGA device. 124 */ 125 uint32 cid; 126 }; 127 128 129 /** 130 * SVGA per-screen winsys interface. 131 */ 132 struct svga_winsys_screen 133 { 134 void 135 (*destroy)(struct svga_winsys_screen *sws); 136 137 SVGA3dHardwareVersion 138 (*get_hw_version)(struct svga_winsys_screen *sws); 139 140 boolean 141 (*get_cap)(struct svga_winsys_screen *sws, 142 SVGA3dDevCapIndex index, 143 SVGA3dDevCapResult *result); 144 145 /** 146 * Create a new context. 147 * 148 * Context objects encapsulate all render state, and shader 149 * objects are per-context. 150 * 151 * Surfaces are not per-context. The same surface can be shared 152 * between multiple contexts, and surface operations can occur 153 * without a context. 154 */ 155 struct svga_winsys_context * 156 (*context_create)(struct svga_winsys_screen *sws); 157 158 159 /** 160 * This creates a "surface" object in the SVGA3D device, 161 * and returns the surface ID (sid). Surfaces are generic 162 * containers for host VRAM objects like textures, vertex 163 * buffers, and depth/stencil buffers. 164 * 165 * Surfaces are hierarchial: 166 * 167 * - Surface may have multiple faces (for cube maps) 168 * 169 * - Each face has a list of mipmap levels 170 * 171 * - Each mipmap image may have multiple volume 172 * slices, if the image is three dimensional. 173 * 174 * - Each slice is a 2D array of 'blocks' 175 * 176 * - Each block may be one or more pixels. 177 * (Usually 1, more for DXT or YUV formats.) 178 * 179 * Surfaces are generic host VRAM objects. The SVGA3D device 180 * may optimize surfaces according to the format they were 181 * created with, but this format does not limit the ways in 182 * which the surface may be used. For example, a depth surface 183 * can be used as a texture, or a floating point image may 184 * be used as a vertex buffer. Some surface usages may be 185 * lower performance, due to software emulation, but any 186 * usage should work with any surface. 187 */ 188 struct svga_winsys_surface * 189 (*surface_create)(struct svga_winsys_screen *sws, 190 SVGA3dSurfaceFlags flags, 191 SVGA3dSurfaceFormat format, 192 SVGA3dSize size, 193 uint32 numFaces, 194 uint32 numMipLevels); 195 196 /** 197 * Creates a surface from a winsys handle. 198 * Used to implement pipe_screen::resource_from_handle. 199 */ 200 struct svga_winsys_surface * 201 (*surface_from_handle)(struct svga_winsys_screen *sws, 202 struct winsys_handle *whandle, 203 SVGA3dSurfaceFormat *format); 204 205 /** 206 * Get a winsys_handle from a surface. 207 * Used to implement pipe_screen::resource_get_handle. 208 */ 209 boolean 210 (*surface_get_handle)(struct svga_winsys_screen *sws, 211 struct svga_winsys_surface *surface, 212 unsigned stride, 213 struct winsys_handle *whandle); 214 215 /** 216 * Whether this surface is sitting in a validate list 217 */ 218 boolean 219 (*surface_is_flushed)(struct svga_winsys_screen *sws, 220 struct svga_winsys_surface *surface); 221 222 /** 223 * Reference a SVGA3D surface object. This allows sharing of a 224 * surface between different objects. 225 */ 226 void 227 (*surface_reference)(struct svga_winsys_screen *sws, 228 struct svga_winsys_surface **pdst, 229 struct svga_winsys_surface *src); 230 231 /** 232 * Buffer management. Buffer attributes are mostly fixed over its lifetime. 233 * 234 * @param usage bitmask of SVGA_BUFFER_USAGE_* flags. 235 * 236 * alignment indicates the client's alignment requirements, eg for 237 * SSE instructions. 238 */ 239 struct svga_winsys_buffer * 240 (*buffer_create)( struct svga_winsys_screen *sws, 241 unsigned alignment, 242 unsigned usage, 243 unsigned size ); 244 245 /** 246 * Map the entire data store of a buffer object into the client's address. 247 * usage is a bitmask of PIPE_TRANSFER_* 248 */ 249 void * 250 (*buffer_map)( struct svga_winsys_screen *sws, 251 struct svga_winsys_buffer *buf, 252 unsigned usage ); 253 254 void 255 (*buffer_unmap)( struct svga_winsys_screen *sws, 256 struct svga_winsys_buffer *buf ); 257 258 void 259 (*buffer_destroy)( struct svga_winsys_screen *sws, 260 struct svga_winsys_buffer *buf ); 261 262 263 /** 264 * Reference a fence object. 265 */ 266 void 267 (*fence_reference)( struct svga_winsys_screen *sws, 268 struct pipe_fence_handle **pdst, 269 struct pipe_fence_handle *src ); 270 271 /** 272 * Checks whether the fence has been signalled. 273 * \param flags driver-specific meaning 274 * \return zero on success. 275 */ 276 int (*fence_signalled)( struct svga_winsys_screen *sws, 277 struct pipe_fence_handle *fence, 278 unsigned flag ); 279 280 /** 281 * Wait for the fence to finish. 282 * \param flags driver-specific meaning 283 * \return zero on success. 284 */ 285 int (*fence_finish)( struct svga_winsys_screen *sws, 286 struct pipe_fence_handle *fence, 287 unsigned flag ); 288 289 }; 290 291 292 struct svga_winsys_screen * 293 svga_winsys_screen(struct pipe_screen *screen); 294 295 struct svga_winsys_context * 296 svga_winsys_context(struct pipe_context *context); 297 298 struct pipe_resource * 299 svga_screen_buffer_wrap_surface(struct pipe_screen *screen, 300 enum SVGA3dSurfaceFormat format, 301 struct svga_winsys_surface *srf); 302 303 struct svga_winsys_surface * 304 svga_screen_buffer_get_winsys_surface(struct pipe_resource *buffer); 305 306 #endif /* SVGA_WINSYS_H_ */ 307