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@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#include "svga_types.h" 39#include "svga3d_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#include "svga_mksstats.h" 47 48struct svga_winsys_screen; 49struct svga_winsys_buffer; 50struct pipe_screen; 51struct pipe_context; 52struct pipe_debug_callback; 53struct pipe_fence_handle; 54struct pipe_resource; 55struct svga_region; 56struct winsys_handle; 57 58 59#define SVGA_BUFFER_USAGE_PINNED (1 << 0) 60#define SVGA_BUFFER_USAGE_WRAPPED (1 << 1) 61#define SVGA_BUFFER_USAGE_SHADER (1 << 2) 62 63/** 64 * Relocation flags to help with dirty tracking 65 * SVGA_RELOC_WRITE - The command will cause a GPU write to this 66 * resource. 67 * SVGA_RELOC_READ - The command will cause a GPU read from this 68 * resource. 69 * SVGA_RELOC_INTERNAL The command will only transfer data internally 70 * within the resource, and optionally clear 71 * dirty bits 72 * SVGA_RELOC_DMA - Only set for resource buffer DMA uploads for winsys 73 * implementations that want to track the amount 74 * of such data referenced in the command stream. 75 */ 76#define SVGA_RELOC_WRITE (1 << 0) 77#define SVGA_RELOC_READ (1 << 1) 78#define SVGA_RELOC_INTERNAL (1 << 2) 79#define SVGA_RELOC_DMA (1 << 3) 80 81#define SVGA_FENCE_FLAG_EXEC (1 << 0) 82#define SVGA_FENCE_FLAG_QUERY (1 << 1) 83 84#define SVGA_SURFACE_USAGE_SHARED (1 << 0) 85#define SVGA_SURFACE_USAGE_SCANOUT (1 << 1) 86 87#define SVGA_QUERY_FLAG_SET (1 << 0) 88#define SVGA_QUERY_FLAG_REF (1 << 1) 89 90#define SVGA_HINT_FLAG_CAN_PRE_FLUSH (1 << 0) /* Can preemptively flush */ 91#define SVGA_HINT_FLAG_EXPORT_FENCE_FD (1 << 1) /* Export a Fence FD */ 92 93/** 94 * SVGA mks statistics info 95 */ 96struct svga_winsys_stats_timeframe { 97 void *counterTime; 98 uint64 startTime; 99 uint64 adjustedStartTime; 100 struct svga_winsys_stats_timeframe *enclosing; 101}; 102 103enum svga_stats_count { 104 SVGA_STATS_COUNT_BLENDSTATE, 105 SVGA_STATS_COUNT_BLITBLITTERCOPY, 106 SVGA_STATS_COUNT_DEPTHSTENCILSTATE, 107 SVGA_STATS_COUNT_RASTERIZERSTATE, 108 SVGA_STATS_COUNT_SAMPLER, 109 SVGA_STATS_COUNT_SAMPLERVIEW, 110 SVGA_STATS_COUNT_SURFACEWRITEFLUSH, 111 SVGA_STATS_COUNT_TEXREADBACK, 112 SVGA_STATS_COUNT_VERTEXELEMENT, 113 SVGA_STATS_COUNT_MAX 114}; 115 116enum svga_stats_time { 117 SVGA_STATS_TIME_BLIT, 118 SVGA_STATS_TIME_BLITBLITTER, 119 SVGA_STATS_TIME_BLITFALLBACK, 120 SVGA_STATS_TIME_BUFFERSFLUSH, 121 SVGA_STATS_TIME_BUFFERTRANSFERMAP, 122 SVGA_STATS_TIME_BUFFERTRANSFERUNMAP, 123 SVGA_STATS_TIME_CONTEXTFINISH, 124 SVGA_STATS_TIME_CONTEXTFLUSH, 125 SVGA_STATS_TIME_COPYREGION, 126 SVGA_STATS_TIME_COPYREGIONFALLBACK, 127 SVGA_STATS_TIME_CREATEBACKEDSURFACEVIEW, 128 SVGA_STATS_TIME_CREATEBUFFER, 129 SVGA_STATS_TIME_CREATECONTEXT, 130 SVGA_STATS_TIME_CREATEFS, 131 SVGA_STATS_TIME_CREATEGS, 132 SVGA_STATS_TIME_CREATESURFACE, 133 SVGA_STATS_TIME_CREATESURFACEVIEW, 134 SVGA_STATS_TIME_CREATETEXTURE, 135 SVGA_STATS_TIME_CREATEVS, 136 SVGA_STATS_TIME_DEFINESHADER, 137 SVGA_STATS_TIME_DESTROYSURFACE, 138 SVGA_STATS_TIME_DRAWVBO, 139 SVGA_STATS_TIME_DRAWARRAYS, 140 SVGA_STATS_TIME_DRAWELEMENTS, 141 SVGA_STATS_TIME_EMITFS, 142 SVGA_STATS_TIME_EMITGS, 143 SVGA_STATS_TIME_EMITVS, 144 SVGA_STATS_TIME_EMULATESURFACEVIEW, 145 SVGA_STATS_TIME_FENCEFINISH, 146 SVGA_STATS_TIME_GENERATEINDICES, 147 SVGA_STATS_TIME_HWTNLDRAWARRAYS, 148 SVGA_STATS_TIME_HWTNLDRAWELEMENTS, 149 SVGA_STATS_TIME_HWTNLFLUSH, 150 SVGA_STATS_TIME_HWTNLPRIM, 151 SVGA_STATS_TIME_PROPAGATESURFACE, 152 SVGA_STATS_TIME_SETSAMPLERVIEWS, 153 SVGA_STATS_TIME_SURFACEFLUSH, 154 SVGA_STATS_TIME_SWTNLDRAWVBO, 155 SVGA_STATS_TIME_SWTNLUPDATEDRAW, 156 SVGA_STATS_TIME_SWTNLUPDATEVDECL, 157 SVGA_STATS_TIME_TEXTRANSFERMAP, 158 SVGA_STATS_TIME_TEXTRANSFERUNMAP, 159 SVGA_STATS_TIME_TGSIVGPU10TRANSLATE, 160 SVGA_STATS_TIME_TGSIVGPU9TRANSLATE, 161 SVGA_STATS_TIME_UPDATESTATE, 162 SVGA_STATS_TIME_VALIDATESURFACEVIEW, 163 SVGA_STATS_TIME_VBUFDRAWARRAYS, 164 SVGA_STATS_TIME_VBUFDRAWELEMENTS, 165 SVGA_STATS_TIME_VBUFRENDERALLOCVERT, 166 SVGA_STATS_TIME_VBUFRENDERMAPVERT, 167 SVGA_STATS_TIME_VBUFRENDERUNMAPVERT, 168 SVGA_STATS_TIME_VBUFSUBMITSTATE, 169 SVGA_STATS_TIME_MAX 170}; 171 172#define SVGA_STATS_PREFIX "GuestGL_" 173 174#define SVGA_STATS_COUNT_NAMES \ 175 SVGA_STATS_PREFIX "BlendState", \ 176 SVGA_STATS_PREFIX "BlitBlitterCopy", \ 177 SVGA_STATS_PREFIX "DepthStencilState", \ 178 SVGA_STATS_PREFIX "RasterizerState", \ 179 SVGA_STATS_PREFIX "Sampler", \ 180 SVGA_STATS_PREFIX "SamplerView", \ 181 SVGA_STATS_PREFIX "SurfaceWriteFlush", \ 182 SVGA_STATS_PREFIX "TextureReadback", \ 183 SVGA_STATS_PREFIX "VertexElement" \ 184 185#define SVGA_STATS_TIME_NAMES \ 186 SVGA_STATS_PREFIX "Blit", \ 187 SVGA_STATS_PREFIX "BlitBlitter", \ 188 SVGA_STATS_PREFIX "BlitFallback", \ 189 SVGA_STATS_PREFIX "BuffersFlush", \ 190 SVGA_STATS_PREFIX "BufferTransferMap", \ 191 SVGA_STATS_PREFIX "BufferTransferUnmap", \ 192 SVGA_STATS_PREFIX "ContextFinish", \ 193 SVGA_STATS_PREFIX "ContextFlush", \ 194 SVGA_STATS_PREFIX "CopyRegion", \ 195 SVGA_STATS_PREFIX "CopyRegionFallback", \ 196 SVGA_STATS_PREFIX "CreateBackedSurfaceView", \ 197 SVGA_STATS_PREFIX "CreateBuffer", \ 198 SVGA_STATS_PREFIX "CreateContext", \ 199 SVGA_STATS_PREFIX "CreateFS", \ 200 SVGA_STATS_PREFIX "CreateGS", \ 201 SVGA_STATS_PREFIX "CreateSurface", \ 202 SVGA_STATS_PREFIX "CreateSurfaceView", \ 203 SVGA_STATS_PREFIX "CreateTexture", \ 204 SVGA_STATS_PREFIX "CreateVS", \ 205 SVGA_STATS_PREFIX "DefineShader", \ 206 SVGA_STATS_PREFIX "DestroySurface", \ 207 SVGA_STATS_PREFIX "DrawVBO", \ 208 SVGA_STATS_PREFIX "DrawArrays", \ 209 SVGA_STATS_PREFIX "DrawElements", \ 210 SVGA_STATS_PREFIX "EmitFS", \ 211 SVGA_STATS_PREFIX "EmitGS", \ 212 SVGA_STATS_PREFIX "EmitVS", \ 213 SVGA_STATS_PREFIX "EmulateSurfaceView", \ 214 SVGA_STATS_PREFIX "FenceFinish", \ 215 SVGA_STATS_PREFIX "GenerateIndices", \ 216 SVGA_STATS_PREFIX "HWtnlDrawArrays", \ 217 SVGA_STATS_PREFIX "HWtnlDrawElements", \ 218 SVGA_STATS_PREFIX "HWtnlFlush", \ 219 SVGA_STATS_PREFIX "HWtnlPrim", \ 220 SVGA_STATS_PREFIX "PropagateSurface", \ 221 SVGA_STATS_PREFIX "SetSamplerViews", \ 222 SVGA_STATS_PREFIX "SurfaceFlush", \ 223 SVGA_STATS_PREFIX "SwtnlDrawVBO", \ 224 SVGA_STATS_PREFIX "SwtnlUpdateDraw", \ 225 SVGA_STATS_PREFIX "SwtnlUpdateVDecl", \ 226 SVGA_STATS_PREFIX "TextureTransferMap", \ 227 SVGA_STATS_PREFIX "TextureTransferUnmap", \ 228 SVGA_STATS_PREFIX "TGSIVGPU10Translate", \ 229 SVGA_STATS_PREFIX "TGSIVGPU9Translate", \ 230 SVGA_STATS_PREFIX "UpdateState", \ 231 SVGA_STATS_PREFIX "ValidateSurfaceView", \ 232 SVGA_STATS_PREFIX "VbufDrawArrays", \ 233 SVGA_STATS_PREFIX "VbufDrawElements", \ 234 SVGA_STATS_PREFIX "VbufRenderAllocVertices", \ 235 SVGA_STATS_PREFIX "VbufRenderMapVertices", \ 236 SVGA_STATS_PREFIX "VbufRenderUnmapVertices", \ 237 SVGA_STATS_PREFIX "VbufSubmitState" 238 239 240/** Opaque surface handle */ 241struct svga_winsys_surface; 242 243/** Opaque guest-backed objects */ 244struct svga_winsys_gb_shader; 245struct svga_winsys_gb_query; 246 247 248/** 249 * SVGA per-context winsys interface. 250 */ 251struct svga_winsys_context 252{ 253 void 254 (*destroy)(struct svga_winsys_context *swc); 255 256 void * 257 (*reserve)(struct svga_winsys_context *swc, 258 uint32_t nr_bytes, uint32_t nr_relocs ); 259 260 /** 261 * Returns current size of command buffer, in bytes. 262 */ 263 unsigned 264 (*get_command_buffer_size)(struct svga_winsys_context *swc); 265 266 /** 267 * Emit a relocation for a host surface. 268 * 269 * @param flags bitmask of SVGA_RELOC_* flags 270 * 271 * NOTE: Order of this call does matter. It should be the same order 272 * as relocations appear in the command buffer. 273 */ 274 void 275 (*surface_relocation)(struct svga_winsys_context *swc, 276 uint32 *sid, 277 uint32 *mobid, 278 struct svga_winsys_surface *surface, 279 unsigned flags); 280 281 /** 282 * Emit a relocation for a guest memory region. 283 * 284 * @param flags bitmask of SVGA_RELOC_* flags 285 * 286 * NOTE: Order of this call does matter. It should be the same order 287 * as relocations appear in the command buffer. 288 */ 289 void 290 (*region_relocation)(struct svga_winsys_context *swc, 291 struct SVGAGuestPtr *ptr, 292 struct svga_winsys_buffer *buffer, 293 uint32 offset, 294 unsigned flags); 295 296 /** 297 * Emit a relocation for a guest-backed shader object. 298 * 299 * NOTE: Order of this call does matter. It should be the same order 300 * as relocations appear in the command buffer. 301 */ 302 void 303 (*shader_relocation)(struct svga_winsys_context *swc, 304 uint32 *shid, 305 uint32 *mobid, 306 uint32 *offset, 307 struct svga_winsys_gb_shader *shader, 308 unsigned flags); 309 310 /** 311 * Emit a relocation for a guest-backed context. 312 * 313 * NOTE: Order of this call does matter. It should be the same order 314 * as relocations appear in the command buffer. 315 */ 316 void 317 (*context_relocation)(struct svga_winsys_context *swc, uint32 *cid); 318 319 /** 320 * Emit a relocation for a guest Memory OBject. 321 * 322 * @param flags bitmask of SVGA_RELOC_* flags 323 * @param offset_into_mob Buffer starts at this offset into the MOB. 324 * 325 * Note that not all commands accept an offset into the MOB and 326 * those commands can't use suballocated buffer pools. To trap 327 * errors from improper buffer pool usage, set the offset_into_mob 328 * pointer to NULL. 329 */ 330 void 331 (*mob_relocation)(struct svga_winsys_context *swc, 332 SVGAMobId *id, 333 uint32 *offset_into_mob, 334 struct svga_winsys_buffer *buffer, 335 uint32 offset, 336 unsigned flags); 337 338 /** 339 * Emit a relocation for a guest-backed query object. 340 * 341 * NOTE: Order of this call does matter. It should be the same order 342 * as relocations appear in the command buffer. 343 */ 344 void 345 (*query_relocation)(struct svga_winsys_context *swc, 346 SVGAMobId *id, 347 struct svga_winsys_gb_query *query); 348 349 /** 350 * Bind queries to context. 351 * \param flags exactly one of SVGA_QUERY_FLAG_SET/REF 352 */ 353 enum pipe_error 354 (*query_bind)(struct svga_winsys_context *sws, 355 struct svga_winsys_gb_query *query, 356 unsigned flags); 357 358 void 359 (*commit)(struct svga_winsys_context *swc); 360 361 enum pipe_error 362 (*flush)(struct svga_winsys_context *swc, 363 struct pipe_fence_handle **pfence); 364 365 /** 366 * Context ID used to fill in the commands 367 * 368 * Context IDs are arbitrary small non-negative integers, 369 * global to the entire SVGA device. 370 */ 371 uint32 cid; 372 373 /** 374 * Flags to hint the current context state 375 */ 376 uint32 hints; 377 378 /** 379 * File descriptor for imported fence 380 */ 381 int32 imported_fence_fd; 382 383 /** 384 ** BEGIN new functions for guest-backed surfaces. 385 **/ 386 387 boolean have_gb_objects; 388 389 /** 390 * Map a guest-backed surface. 391 * \param flags bitmaks of PIPE_TRANSFER_x flags 392 * 393 * The surface_map() member is allowed to fail due to a 394 * shortage of command buffer space, if the 395 * PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE bit is set in flags. 396 * In that case, the caller must flush the current command 397 * buffer and reissue the map. 398 */ 399 void * 400 (*surface_map)(struct svga_winsys_context *swc, 401 struct svga_winsys_surface *surface, 402 unsigned flags, boolean *retry); 403 404 /** 405 * Unmap a guest-backed surface. 406 * \param rebind returns a flag indicating whether the caller should 407 * issue a SVGA3D_BindGBSurface() call. 408 */ 409 void 410 (*surface_unmap)(struct svga_winsys_context *swc, 411 struct svga_winsys_surface *surface, 412 boolean *rebind); 413 414 /** 415 * Invalidate the content of this surface 416 */ 417 enum pipe_error 418 (*surface_invalidate)(struct svga_winsys_context *swc, 419 struct svga_winsys_surface *surface); 420 421 /** 422 * Create and define a DX GB shader that resides in the device COTable. 423 * Caller of this function will issue the DXDefineShader command. 424 */ 425 struct svga_winsys_gb_shader * 426 (*shader_create)(struct svga_winsys_context *swc, 427 uint32 shaderId, 428 SVGA3dShaderType shaderType, 429 const uint32 *bytecode, 430 uint32 bytecodeLen); 431 432 /** 433 * Destroy a DX GB shader. 434 * This function will issue the DXDestroyShader command. 435 */ 436 void 437 (*shader_destroy)(struct svga_winsys_context *swc, 438 struct svga_winsys_gb_shader *shader); 439 440 /** 441 * Rebind a DX GB resource to a context. 442 * This is called to reference a DX GB resource in the command stream in 443 * order to page in the associated resource in case the memory has been 444 * paged out, and to fence it if necessary after command submission. 445 */ 446 enum pipe_error 447 (*resource_rebind)(struct svga_winsys_context *swc, 448 struct svga_winsys_surface *surface, 449 struct svga_winsys_gb_shader *shader, 450 unsigned flags); 451 452 /** To report perf/conformance/etc issues to the state tracker */ 453 struct pipe_debug_callback *debug_callback; 454 455 /** The more recent command issued to command buffer */ 456 SVGAFifo3dCmdId last_command; 457 458 /** For HUD queries */ 459 uint64_t num_commands; 460 uint64_t num_draw_commands; 461}; 462 463 464/** 465 * SVGA per-screen winsys interface. 466 */ 467struct svga_winsys_screen 468{ 469 void 470 (*destroy)(struct svga_winsys_screen *sws); 471 472 SVGA3dHardwareVersion 473 (*get_hw_version)(struct svga_winsys_screen *sws); 474 475 boolean 476 (*get_cap)(struct svga_winsys_screen *sws, 477 SVGA3dDevCapIndex index, 478 SVGA3dDevCapResult *result); 479 480 /** 481 * Create a new context. 482 * 483 * Context objects encapsulate all render state, and shader 484 * objects are per-context. 485 * 486 * Surfaces are not per-context. The same surface can be shared 487 * between multiple contexts, and surface operations can occur 488 * without a context. 489 */ 490 struct svga_winsys_context * 491 (*context_create)(struct svga_winsys_screen *sws); 492 493 /** 494 * This creates a "surface" object in the SVGA3D device. 495 * 496 * \param sws Pointer to an svga_winsys_context 497 * \param flags Device surface create flags 498 * \param format Format Device surface format 499 * \param usage Winsys usage: bitmask of SVGA_SURFACE_USAGE_x flags 500 * \param size Surface size given in device format 501 * \param numLayers Number of layers of the surface (or cube faces) 502 * \param numMipLevels Number of mipmap levels for each face 503 * 504 * Returns the surface ID (sid). Surfaces are generic 505 * containers for host VRAM objects like textures, vertex 506 * buffers, and depth/stencil buffers. 507 * 508 * Surfaces are hierarchial: 509 * 510 * - Surface may have multiple faces (for cube maps) 511 * 512 * - Each face has a list of mipmap levels 513 * 514 * - Each mipmap image may have multiple volume 515 * slices for 3D image, or multiple 2D slices for texture array. 516 * 517 * - Each slice is a 2D array of 'blocks' 518 * 519 * - Each block may be one or more pixels. 520 * (Usually 1, more for DXT or YUV formats.) 521 * 522 * Surfaces are generic host VRAM objects. The SVGA3D device 523 * may optimize surfaces according to the format they were 524 * created with, but this format does not limit the ways in 525 * which the surface may be used. For example, a depth surface 526 * can be used as a texture, or a floating point image may 527 * be used as a vertex buffer. Some surface usages may be 528 * lower performance, due to software emulation, but any 529 * usage should work with any surface. 530 */ 531 struct svga_winsys_surface * 532 (*surface_create)(struct svga_winsys_screen *sws, 533 SVGA3dSurfaceAllFlags flags, 534 SVGA3dSurfaceFormat format, 535 unsigned usage, 536 SVGA3dSize size, 537 uint32 numLayers, 538 uint32 numMipLevels, 539 unsigned sampleCount); 540 541 /** 542 * Creates a surface from a winsys handle. 543 * Used to implement pipe_screen::resource_from_handle. 544 */ 545 struct svga_winsys_surface * 546 (*surface_from_handle)(struct svga_winsys_screen *sws, 547 struct winsys_handle *whandle, 548 SVGA3dSurfaceFormat *format); 549 550 /** 551 * Get a winsys_handle from a surface. 552 * Used to implement pipe_screen::resource_get_handle. 553 */ 554 boolean 555 (*surface_get_handle)(struct svga_winsys_screen *sws, 556 struct svga_winsys_surface *surface, 557 unsigned stride, 558 struct winsys_handle *whandle); 559 560 /** 561 * Whether this surface is sitting in a validate list 562 */ 563 boolean 564 (*surface_is_flushed)(struct svga_winsys_screen *sws, 565 struct svga_winsys_surface *surface); 566 567 /** 568 * Reference a SVGA3D surface object. This allows sharing of a 569 * surface between different objects. 570 */ 571 void 572 (*surface_reference)(struct svga_winsys_screen *sws, 573 struct svga_winsys_surface **pdst, 574 struct svga_winsys_surface *src); 575 576 /** 577 * Check if a resource (texture, buffer) of the given size 578 * and format can be created. 579 * \Return TRUE if OK, FALSE if too large. 580 */ 581 boolean 582 (*surface_can_create)(struct svga_winsys_screen *sws, 583 SVGA3dSurfaceFormat format, 584 SVGA3dSize size, 585 uint32 numLayers, 586 uint32 numMipLevels, 587 uint32 numSamples); 588 589 /** 590 * Buffer management. Buffer attributes are mostly fixed over its lifetime. 591 * 592 * @param usage bitmask of SVGA_BUFFER_USAGE_* flags. 593 * 594 * alignment indicates the client's alignment requirements, eg for 595 * SSE instructions. 596 */ 597 struct svga_winsys_buffer * 598 (*buffer_create)( struct svga_winsys_screen *sws, 599 unsigned alignment, 600 unsigned usage, 601 unsigned size ); 602 603 /** 604 * Map the entire data store of a buffer object into the client's address. 605 * usage is a bitmask of PIPE_TRANSFER_* 606 */ 607 void * 608 (*buffer_map)( struct svga_winsys_screen *sws, 609 struct svga_winsys_buffer *buf, 610 unsigned usage ); 611 612 void 613 (*buffer_unmap)( struct svga_winsys_screen *sws, 614 struct svga_winsys_buffer *buf ); 615 616 void 617 (*buffer_destroy)( struct svga_winsys_screen *sws, 618 struct svga_winsys_buffer *buf ); 619 620 621 /** 622 * Reference a fence object. 623 */ 624 void 625 (*fence_reference)( struct svga_winsys_screen *sws, 626 struct pipe_fence_handle **pdst, 627 struct pipe_fence_handle *src ); 628 629 /** 630 * Checks whether the fence has been signalled. 631 * \param flags driver-specific meaning 632 * \return zero on success. 633 */ 634 int (*fence_signalled)( struct svga_winsys_screen *sws, 635 struct pipe_fence_handle *fence, 636 unsigned flag ); 637 638 /** 639 * Wait for the fence to finish. 640 * \param timeout in nanoseconds (may be PIPE_TIMEOUT_INFINITE). 641 * 0 to return immediately, if the API suports it. 642 * \param flags driver-specific meaning 643 * \return zero on success. 644 */ 645 int (*fence_finish)( struct svga_winsys_screen *sws, 646 struct pipe_fence_handle *fence, 647 uint64_t timeout, 648 unsigned flag ); 649 650 /** 651 * Get the file descriptor associated with the fence 652 * \param duplicate duplicate the fd before returning it 653 * \return zero on success. 654 */ 655 int (*fence_get_fd)( struct svga_winsys_screen *sws, 656 struct pipe_fence_handle *fence, 657 boolean duplicate ); 658 659 /** 660 * Create a fence using the given file descriptor 661 * \return zero on success. 662 */ 663 void (*fence_create_fd)( struct svga_winsys_screen *sws, 664 struct pipe_fence_handle **fence, 665 int32_t fd ); 666 667 /** 668 * Accumulates fence FD from other devices into the current context 669 * \param context_fd FD the context will be waiting on 670 * \return zero on success 671 */ 672 int (*fence_server_sync)( struct svga_winsys_screen *sws, 673 int32_t *context_fd, 674 struct pipe_fence_handle *fence ); 675 676 /** 677 ** BEGIN new functions for guest-backed surfaces. 678 **/ 679 680 /** Are guest-backed objects enabled? */ 681 bool have_gb_objects; 682 683 /** Can we do DMA with guest-backed objects enabled? */ 684 bool have_gb_dma; 685 686 /** 687 * Create and define a GB shader. 688 */ 689 struct svga_winsys_gb_shader * 690 (*shader_create)(struct svga_winsys_screen *sws, 691 SVGA3dShaderType shaderType, 692 const uint32 *bytecode, 693 uint32 bytecodeLen); 694 695 /** 696 * Destroy a GB shader. It's safe to call this function even 697 * if the shader is referenced in a context's command stream. 698 */ 699 void 700 (*shader_destroy)(struct svga_winsys_screen *sws, 701 struct svga_winsys_gb_shader *shader); 702 703 /** 704 * Create and define a GB query. 705 */ 706 struct svga_winsys_gb_query * 707 (*query_create)(struct svga_winsys_screen *sws, uint32 len); 708 709 /** 710 * Destroy a GB query. 711 */ 712 void 713 (*query_destroy)(struct svga_winsys_screen *sws, 714 struct svga_winsys_gb_query *query); 715 716 /** 717 * Initialize the query state of the query that resides in the slot 718 * specified in offset 719 * \return zero on success. 720 */ 721 int 722 (*query_init)(struct svga_winsys_screen *sws, 723 struct svga_winsys_gb_query *query, 724 unsigned offset, 725 SVGA3dQueryState queryState); 726 727 /** 728 * Inquire for the query state and result of the query that resides 729 * in the slot specified in offset 730 */ 731 void 732 (*query_get_result)(struct svga_winsys_screen *sws, 733 struct svga_winsys_gb_query *query, 734 unsigned offset, 735 SVGA3dQueryState *queryState, 736 void *result, uint32 resultLen); 737 738 /** 739 * Increment a statistic counter 740 */ 741 void 742 (*stats_inc)(enum svga_stats_count); 743 744 /** 745 * Push a time frame onto the stack 746 */ 747 void 748 (*stats_time_push)(enum svga_stats_time, struct svga_winsys_stats_timeframe *); 749 750 /** 751 * Pop a time frame. 752 */ 753 void 754 (*stats_time_pop)(); 755 756 /** 757 * Send a host log message 758 */ 759 void 760 (*host_log)(struct svga_winsys_screen *sws, const char *message); 761 762 /** Have VGPU v10 hardware? */ 763 boolean have_vgpu10; 764 765 /** Have SM4_1 hardware? */ 766 boolean have_sm4_1; 767 768 /** To rebind resources at the beginnning of a new command buffer */ 769 boolean need_to_rebind_resources; 770 771 boolean have_generate_mipmap_cmd; 772 boolean have_set_predication_cmd; 773 boolean have_transfer_from_buffer_cmd; 774 boolean have_fence_fd; 775 boolean have_intra_surface_copy; 776}; 777 778 779struct svga_winsys_screen * 780svga_winsys_screen(struct pipe_screen *screen); 781 782struct svga_winsys_context * 783svga_winsys_context(struct pipe_context *context); 784 785struct pipe_resource * 786svga_screen_buffer_wrap_surface(struct pipe_screen *screen, 787 enum SVGA3dSurfaceFormat format, 788 struct svga_winsys_surface *srf); 789 790struct svga_winsys_surface * 791svga_screen_buffer_get_winsys_surface(struct pipe_resource *buffer); 792 793#endif /* SVGA_WINSYS_H_ */ 794