Subversion Repositories Kolibri OS

Rev

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

  1. /**************************************************************************
  2.  *
  3.  * Copyright © 2009 Jakob Bornecrantz
  4.  *
  5.  * Permission is hereby granted, free of charge, to any person obtaining a
  6.  * copy of this software and associated documentation files (the "Software"),
  7.  * to deal in the Software without restriction, including without limitation
  8.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  9.  * and/or sell copies of the Software, and to permit persons to whom the
  10.  * Software is furnished to do so, subject to the following conditions:
  11.  *
  12.  * The above copyright notice and this permission notice (including the next
  13.  * paragraph) shall be included in all copies or substantial portions of the
  14.  * Software.
  15.  *
  16.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  21.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  22.  * DEALINGS IN THE SOFTWARE.
  23.  *
  24.  **************************************************************************/
  25.  
  26. #ifndef I915_WINSYS_H
  27. #define I915_WINSYS_H
  28.  
  29. #include "pipe/p_compiler.h"
  30.  
  31. struct i915_winsys;
  32. struct i915_winsys_buffer;
  33. struct i915_winsys_batchbuffer;
  34. struct pipe_resource;
  35. struct pipe_fence_handle;
  36. struct winsys_handle;
  37.  
  38. enum i915_winsys_buffer_usage
  39. {
  40.    /* use on textures */
  41.    I915_USAGE_RENDER    = 0x01,
  42.    I915_USAGE_SAMPLER   = 0x02,
  43.    I915_USAGE_2D_TARGET = 0x04,
  44.    I915_USAGE_2D_SOURCE = 0x08,
  45.    /* use on vertex */
  46.    I915_USAGE_VERTEX    = 0x10
  47. };
  48.  
  49. enum i915_winsys_buffer_type
  50. {
  51.    I915_NEW_TEXTURE,
  52.    I915_NEW_SCANOUT, /**< a texture used for scanning out from */
  53.    I915_NEW_VERTEX
  54. };
  55.  
  56. /* These need to be in sync with the definitions of libdrm-intel! */
  57. enum i915_winsys_buffer_tile
  58. {
  59.    I915_TILE_NONE,
  60.    I915_TILE_X,
  61.    I915_TILE_Y
  62. };
  63.  
  64. enum i915_winsys_flush_flags
  65. {
  66.    I915_FLUSH_ASYNC = 0,
  67.    I915_FLUSH_END_OF_FRAME = 1
  68. };
  69.  
  70. struct i915_winsys_batchbuffer {
  71.  
  72.    struct i915_winsys *iws;
  73.  
  74.    /**
  75.     * Values exported to speed up the writing the batchbuffer,
  76.     * instead of having to go trough a accesor function for
  77.     * each dword written.
  78.     */
  79.    /*{@*/
  80.    uint8_t *map;
  81.    uint8_t *ptr;
  82.    size_t size;
  83.  
  84.    size_t relocs;
  85.    /*@}*/
  86. };
  87.  
  88. struct i915_winsys {
  89.  
  90.    unsigned pci_id; /**< PCI ID for the device */
  91.  
  92.    /**
  93.     * Batchbuffer functions.
  94.     */
  95.    /*@{*/
  96.    /**
  97.     * Create a new batchbuffer.
  98.     */
  99.    struct i915_winsys_batchbuffer *
  100.       (*batchbuffer_create)(struct i915_winsys *iws);
  101.  
  102.    /**
  103.     * Validate buffers for usage in this batchbuffer.
  104.     * Does space-checking and asorted other book-keeping.
  105.     *
  106.     * @batch
  107.     * @buffers array to buffers to validate
  108.     * @num_of_buffers size of the passed array
  109.     */
  110.    boolean (*validate_buffers)(struct i915_winsys_batchbuffer *batch,
  111.                                struct i915_winsys_buffer **buffers,
  112.                                int num_of_buffers);
  113.  
  114.    /**
  115.     * Emit a relocation to a buffer.
  116.     * Target position in batchbuffer is the same as ptr.
  117.     *
  118.     * @batch
  119.     * @reloc buffer address to be inserted into target.
  120.     * @usage how is the hardware going to use the buffer.
  121.     * @offset add this to the reloc buffers address
  122.     * @target buffer where to write the address, null for batchbuffer.
  123.     * @fenced relocation needs a fence.
  124.     */
  125.    int (*batchbuffer_reloc)(struct i915_winsys_batchbuffer *batch,
  126.                             struct i915_winsys_buffer *reloc,
  127.                             enum i915_winsys_buffer_usage usage,
  128.                             unsigned offset, boolean fenced);
  129.  
  130.    /**
  131.     * Flush a bufferbatch.
  132.     */
  133.    void (*batchbuffer_flush)(struct i915_winsys_batchbuffer *batch,
  134.                              struct pipe_fence_handle **fence,
  135.                              enum i915_winsys_flush_flags flags);
  136.  
  137.    /**
  138.     * Destroy a batchbuffer.
  139.     */
  140.    void (*batchbuffer_destroy)(struct i915_winsys_batchbuffer *batch);
  141.    /*@}*/
  142.  
  143.  
  144.    /**
  145.     * Buffer functions.
  146.     */
  147.    /*@{*/
  148.    /**
  149.     * Create a buffer.
  150.     */
  151.    struct i915_winsys_buffer *
  152.       (*buffer_create)(struct i915_winsys *iws,
  153.                        unsigned size,
  154.                        enum i915_winsys_buffer_type type);
  155.  
  156.    /**
  157.     * Create a tiled buffer.
  158.     *
  159.     * *stride, height are in bytes. The winsys tries to allocate the buffer with
  160.     * the tiling mode provide in *tiling. If tiling is no possible, *tiling will
  161.     * be set to I915_TILE_NONE. The calculated stride (incorporateing hw/kernel
  162.     * requirements) is always returned in *stride.
  163.     */
  164.    struct i915_winsys_buffer *
  165.       (*buffer_create_tiled)(struct i915_winsys *iws,
  166.                              unsigned *stride, unsigned height,
  167.                              enum i915_winsys_buffer_tile *tiling,
  168.                              enum i915_winsys_buffer_type type);
  169.  
  170.    /**
  171.     * Creates a buffer from a handle.
  172.     * Used to implement pipe_screen::resource_from_handle.
  173.     * Also provides the stride information needed for the
  174.     * texture via the stride argument.
  175.     */
  176.    struct i915_winsys_buffer *
  177.       (*buffer_from_handle)(struct i915_winsys *iws,
  178.                             struct winsys_handle *whandle,
  179.                             enum i915_winsys_buffer_tile *tiling,
  180.                             unsigned *stride);
  181.  
  182.    /**
  183.     * Used to implement pipe_screen::resource_get_handle.
  184.     * The winsys might need the stride information.
  185.     */
  186.    boolean (*buffer_get_handle)(struct i915_winsys *iws,
  187.                                 struct i915_winsys_buffer *buffer,
  188.                                 struct winsys_handle *whandle,
  189.                                 unsigned stride);
  190.  
  191.    /**
  192.     * Map a buffer.
  193.     */
  194.    void *(*buffer_map)(struct i915_winsys *iws,
  195.                        struct i915_winsys_buffer *buffer,
  196.                        boolean write);
  197.  
  198.    /**
  199.     * Unmap a buffer.
  200.     */
  201.    void (*buffer_unmap)(struct i915_winsys *iws,
  202.                         struct i915_winsys_buffer *buffer);
  203.  
  204.    /**
  205.     * Write to a buffer.
  206.     *
  207.     * Arguments follows pipe_buffer_write.
  208.     */
  209.    int (*buffer_write)(struct i915_winsys *iws,
  210.                        struct i915_winsys_buffer *dst,
  211.                        size_t offset,
  212.                        size_t size,
  213.                        const void *data);
  214.  
  215.    void (*buffer_destroy)(struct i915_winsys *iws,
  216.                           struct i915_winsys_buffer *buffer);
  217.  
  218.    /**
  219.     * Check if a buffer is busy.
  220.     */
  221.    boolean (*buffer_is_busy)(struct i915_winsys *iws,
  222.                              struct i915_winsys_buffer *buffer);
  223.    /*@}*/
  224.  
  225.  
  226.    /**
  227.     * Fence functions.
  228.     */
  229.    /*@{*/
  230.    /**
  231.     * Reference fence and set ptr to fence.
  232.     */
  233.    void (*fence_reference)(struct i915_winsys *iws,
  234.                            struct pipe_fence_handle **ptr,
  235.                            struct pipe_fence_handle *fence);
  236.  
  237.    /**
  238.     * Check if a fence has finished.
  239.     */
  240.    int (*fence_signalled)(struct i915_winsys *iws,
  241.                           struct pipe_fence_handle *fence);
  242.  
  243.    /**
  244.     * Wait on a fence to finish.
  245.     */
  246.    int (*fence_finish)(struct i915_winsys *iws,
  247.                        struct pipe_fence_handle *fence);
  248.    /*@}*/
  249.  
  250.  
  251.    /**
  252.     * Destroy the winsys.
  253.     */
  254.    void (*destroy)(struct i915_winsys *iws);
  255. };
  256.  
  257. #endif
  258.