Home | History | Annotate | Download | only in i915
      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 struct i915_winsys_batchbuffer {
     65 
     66    struct i915_winsys *iws;
     67 
     68    /**
     69     * Values exported to speed up the writing the batchbuffer,
     70     * instead of having to go trough a accesor function for
     71     * each dword written.
     72     */
     73    /*{@*/
     74    uint8_t *map;
     75    uint8_t *ptr;
     76    size_t size;
     77 
     78    size_t relocs;
     79    /*@}*/
     80 };
     81 
     82 struct i915_winsys {
     83 
     84    unsigned pci_id; /**< PCI ID for the device */
     85 
     86    /**
     87     * Batchbuffer functions.
     88     */
     89    /*@{*/
     90    /**
     91     * Create a new batchbuffer.
     92     */
     93    struct i915_winsys_batchbuffer *
     94       (*batchbuffer_create)(struct i915_winsys *iws);
     95 
     96    /**
     97     * Validate buffers for usage in this batchbuffer.
     98     * Does space-checking and asorted other book-keeping.
     99     *
    100     * @batch
    101     * @buffers array to buffers to validate
    102     * @num_of_buffers size of the passed array
    103     */
    104    boolean (*validate_buffers)(struct i915_winsys_batchbuffer *batch,
    105 			       struct i915_winsys_buffer **buffers,
    106 			       int num_of_buffers);
    107 
    108    /**
    109     * Emit a relocation to a buffer.
    110     * Target position in batchbuffer is the same as ptr.
    111     *
    112     * @batch
    113     * @reloc buffer address to be inserted into target.
    114     * @usage how is the hardware going to use the buffer.
    115     * @offset add this to the reloc buffers address
    116     * @target buffer where to write the address, null for batchbuffer.
    117     * @fenced relocation needs a fence.
    118     */
    119    int (*batchbuffer_reloc)(struct i915_winsys_batchbuffer *batch,
    120                             struct i915_winsys_buffer *reloc,
    121                             enum i915_winsys_buffer_usage usage,
    122                             unsigned offset, boolean fenced);
    123 
    124    /**
    125     * Flush a bufferbatch.
    126     */
    127    void (*batchbuffer_flush)(struct i915_winsys_batchbuffer *batch,
    128                              struct pipe_fence_handle **fence);
    129 
    130    /**
    131     * Destroy a batchbuffer.
    132     */
    133    void (*batchbuffer_destroy)(struct i915_winsys_batchbuffer *batch);
    134    /*@}*/
    135 
    136 
    137    /**
    138     * Buffer functions.
    139     */
    140    /*@{*/
    141    /**
    142     * Create a buffer.
    143     */
    144    struct i915_winsys_buffer *
    145       (*buffer_create)(struct i915_winsys *iws,
    146                        unsigned size,
    147                        enum i915_winsys_buffer_type type);
    148 
    149    /**
    150     * Create a tiled buffer.
    151     *
    152     * *stride, height are in bytes. The winsys tries to allocate the buffer with
    153     * the tiling mode provide in *tiling. If tiling is no possible, *tiling will
    154     * be set to I915_TILE_NONE. The calculated stride (incorporateing hw/kernel
    155     * requirements) is always returned in *stride.
    156     */
    157    struct i915_winsys_buffer *
    158       (*buffer_create_tiled)(struct i915_winsys *iws,
    159                              unsigned *stride, unsigned height,
    160                              enum i915_winsys_buffer_tile *tiling,
    161                              enum i915_winsys_buffer_type type);
    162 
    163    /**
    164     * Creates a buffer from a handle.
    165     * Used to implement pipe_screen::resource_from_handle.
    166     * Also provides the stride information needed for the
    167     * texture via the stride argument.
    168     */
    169    struct i915_winsys_buffer *
    170       (*buffer_from_handle)(struct i915_winsys *iws,
    171                             struct winsys_handle *whandle,
    172                             enum i915_winsys_buffer_tile *tiling,
    173                             unsigned *stride);
    174 
    175    /**
    176     * Used to implement pipe_screen::resource_get_handle.
    177     * The winsys might need the stride information.
    178     */
    179    boolean (*buffer_get_handle)(struct i915_winsys *iws,
    180                                 struct i915_winsys_buffer *buffer,
    181                                 struct winsys_handle *whandle,
    182                                 unsigned stride);
    183 
    184    /**
    185     * Map a buffer.
    186     */
    187    void *(*buffer_map)(struct i915_winsys *iws,
    188                        struct i915_winsys_buffer *buffer,
    189                        boolean write);
    190 
    191    /**
    192     * Unmap a buffer.
    193     */
    194    void (*buffer_unmap)(struct i915_winsys *iws,
    195                         struct i915_winsys_buffer *buffer);
    196 
    197    /**
    198     * Write to a buffer.
    199     *
    200     * Arguments follows pipe_buffer_write.
    201     */
    202    int (*buffer_write)(struct i915_winsys *iws,
    203                        struct i915_winsys_buffer *dst,
    204                        size_t offset,
    205                        size_t size,
    206                        const void *data);
    207 
    208    void (*buffer_destroy)(struct i915_winsys *iws,
    209                           struct i915_winsys_buffer *buffer);
    210 
    211    /**
    212     * Check if a buffer is busy.
    213     */
    214    boolean (*buffer_is_busy)(struct i915_winsys *iws,
    215                              struct i915_winsys_buffer *buffer);
    216    /*@}*/
    217 
    218 
    219    /**
    220     * Fence functions.
    221     */
    222    /*@{*/
    223    /**
    224     * Reference fence and set ptr to fence.
    225     */
    226    void (*fence_reference)(struct i915_winsys *iws,
    227                            struct pipe_fence_handle **ptr,
    228                            struct pipe_fence_handle *fence);
    229 
    230    /**
    231     * Check if a fence has finished.
    232     */
    233    int (*fence_signalled)(struct i915_winsys *iws,
    234                           struct pipe_fence_handle *fence);
    235 
    236    /**
    237     * Wait on a fence to finish.
    238     */
    239    int (*fence_finish)(struct i915_winsys *iws,
    240                        struct pipe_fence_handle *fence);
    241    /*@}*/
    242 
    243 
    244    /**
    245     * Destroy the winsys.
    246     */
    247    void (*destroy)(struct i915_winsys *iws);
    248 };
    249 
    250 #endif
    251