Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  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.  
  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.