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
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
47struct svga_winsys_screen;
48struct svga_winsys_buffer;
49struct pipe_screen;
50struct pipe_context;
51struct pipe_fence_handle;
52struct pipe_resource;
53struct svga_region;
54struct 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 */
68struct svga_winsys_surface;
69
70
71/**
72 * SVGA per-context winsys interface.
73 */
74struct 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 */
132struct 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
292struct svga_winsys_screen *
293svga_winsys_screen(struct pipe_screen *screen);
294
295struct svga_winsys_context *
296svga_winsys_context(struct pipe_context *context);
297
298struct pipe_resource *
299svga_screen_buffer_wrap_surface(struct pipe_screen *screen,
300				enum SVGA3dSurfaceFormat format,
301				struct svga_winsys_surface *srf);
302
303struct svga_winsys_surface *
304svga_screen_buffer_get_winsys_surface(struct pipe_resource *buffer);
305
306#endif /* SVGA_WINSYS_H_ */
307