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