Home | History | Annotate | Download | only in svga
      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