Home | History | Annotate | Download | only in core
      1 /*
      2  * Mesa 3-D graphics library
      3  *
      4  * Copyright (C) 2012-2014 LunarG, Inc.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the "Software"),
      8  * to deal in the Software without restriction, including without limitation
      9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     10  * and/or sell copies of the Software, and to permit persons to whom the
     11  * Software is furnished to do so, subject to the following conditions:
     12  *
     13  * The above copyright notice and this permission notice shall be included
     14  * in all copies or substantial portions of the 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  * Authors:
     25  *    Chia-I Wu <olv (at) lunarg.com>
     26  */
     27 
     28 #ifndef INTEL_WINSYS_H
     29 #define INTEL_WINSYS_H
     30 
     31 #include "pipe/p_compiler.h"
     32 
     33 /* this is compatible with i915_drm.h's definitions */
     34 enum intel_ring_type {
     35    INTEL_RING_RENDER    = 1,
     36    INTEL_RING_BSD       = 2,
     37    INTEL_RING_BLT       = 3,
     38    INTEL_RING_VEBOX     = 4,
     39 };
     40 
     41 /* this is compatible with i915_drm.h's definitions */
     42 enum intel_exec_flag {
     43    INTEL_EXEC_GEN7_SOL_RESET  = 1 << 8,
     44 };
     45 
     46 /* this is compatible with i915_drm.h's definitions */
     47 enum intel_reloc_flag {
     48    INTEL_RELOC_FENCE          = 1 << 0,
     49    INTEL_RELOC_GGTT           = 1 << 1,
     50    INTEL_RELOC_WRITE          = 1 << 2,
     51 };
     52 
     53 /* this is compatible with i915_drm.h's definitions */
     54 enum intel_tiling_mode {
     55    INTEL_TILING_NONE = 0,
     56    INTEL_TILING_X    = 1,
     57    INTEL_TILING_Y    = 2,
     58 };
     59 
     60 struct winsys_handle;
     61 struct intel_winsys;
     62 struct intel_context;
     63 struct intel_bo;
     64 
     65 struct intel_winsys_info {
     66    int devid;
     67 
     68    /* the sizes of the aperture in bytes */
     69    size_t aperture_total;
     70    size_t aperture_mappable;
     71 
     72    bool has_llc;
     73    bool has_address_swizzling;
     74    bool has_logical_context;
     75    bool has_ppgtt;
     76 
     77    /* valid registers for intel_winsys_read_reg() */
     78    bool has_timestamp;
     79 
     80    /* valid flags for intel_winsys_submit_bo() */
     81    bool has_gen7_sol_reset;
     82 };
     83 
     84 void
     85 intel_winsys_destroy(struct intel_winsys *winsys);
     86 
     87 const struct intel_winsys_info *
     88 intel_winsys_get_info(const struct intel_winsys *winsys);
     89 
     90 /**
     91  * Create a logical context for use with the render ring.
     92  */
     93 struct intel_context *
     94 intel_winsys_create_context(struct intel_winsys *winsys);
     95 
     96 /**
     97  * Destroy a logical context.
     98  */
     99 void
    100 intel_winsys_destroy_context(struct intel_winsys *winsys,
    101                              struct intel_context *ctx);
    102 
    103 /**
    104  * Read a register.  Only registers that are considered safe, such as
    105  *
    106  *   TIMESTAMP (0x2358)
    107  *
    108  * can be read.
    109  */
    110 int
    111 intel_winsys_read_reg(struct intel_winsys *winsys,
    112                       uint32_t reg, uint64_t *val);
    113 
    114 /**
    115  * Return the numbers of submissions lost due to GPU reset.
    116  *
    117  * \param active_lost      Number of lost active/guilty submissions
    118  * \param pending_lost     Number of lost pending/innocent submissions
    119  */
    120 int
    121 intel_winsys_get_reset_stats(struct intel_winsys *winsys,
    122                              struct intel_context *ctx,
    123                              uint32_t *active_lost,
    124                              uint32_t *pending_lost);
    125 /**
    126  * Allocate a buffer object.
    127  *
    128  * \param name             Informative description of the bo.
    129  * \param size             Size of the bo.
    130  * \param cpu_init         Will be initialized by CPU.
    131  */
    132 struct intel_bo *
    133 intel_winsys_alloc_bo(struct intel_winsys *winsys,
    134                       const char *name,
    135                       unsigned long size,
    136                       bool cpu_init);
    137 
    138 /**
    139  * Create a bo from a user memory pointer.  Both \p userptr and \p size must
    140  * be page aligned.
    141  */
    142 struct intel_bo *
    143 intel_winsys_import_userptr(struct intel_winsys *winsys,
    144                             const char *name,
    145                             void *userptr,
    146                             unsigned long size,
    147                             unsigned long flags);
    148 
    149 /**
    150  * Create a bo from a winsys handle.
    151  */
    152 struct intel_bo *
    153 intel_winsys_import_handle(struct intel_winsys *winsys,
    154                            const char *name,
    155                            const struct winsys_handle *handle,
    156                            unsigned long height,
    157                            enum intel_tiling_mode *tiling,
    158                            unsigned long *pitch);
    159 
    160 /**
    161  * Export \p bo as a winsys handle for inter-process sharing.  \p tiling and
    162  * \p pitch must match those set by \p intel_bo_set_tiling().
    163  */
    164 int
    165 intel_winsys_export_handle(struct intel_winsys *winsys,
    166                            struct intel_bo *bo,
    167                            enum intel_tiling_mode tiling,
    168                            unsigned long pitch,
    169                            unsigned long height,
    170                            struct winsys_handle *handle);
    171 
    172 /**
    173  * Return true when buffer objects directly specified in \p bo_array, and
    174  * those indirectly referenced by them, can fit in the aperture space.
    175  */
    176 bool
    177 intel_winsys_can_submit_bo(struct intel_winsys *winsys,
    178                            struct intel_bo **bo_array,
    179                            int count);
    180 
    181 /**
    182  * Submit \p bo for execution.
    183  *
    184  * \p bo and all bos referenced by \p bo will be considered busy until all
    185  * commands are parsed and executed.  \p ctx is ignored when the bo is not
    186  * submitted to the render ring.
    187  */
    188 int
    189 intel_winsys_submit_bo(struct intel_winsys *winsys,
    190                        enum intel_ring_type ring,
    191                        struct intel_bo *bo, int used,
    192                        struct intel_context *ctx,
    193                        unsigned long flags);
    194 
    195 /**
    196  * Decode the commands contained in \p bo.  For debugging.
    197  *
    198  * \param bo      Batch buffer to decode.
    199  * \param used    Size of the commands in bytes.
    200  */
    201 void
    202 intel_winsys_decode_bo(struct intel_winsys *winsys,
    203                        struct intel_bo *bo, int used);
    204 
    205 /**
    206  * Increase the reference count of \p bo.  No-op when \p bo is NULL.
    207  */
    208 struct intel_bo *
    209 intel_bo_ref(struct intel_bo *bo);
    210 
    211 /**
    212  * Decrease the reference count of \p bo.  When the reference count reaches
    213  * zero, \p bo is destroyed.  No-op when \p bo is NULL.
    214  */
    215 void
    216 intel_bo_unref(struct intel_bo *bo);
    217 
    218 /**
    219  * Set the tiling of \p bo.  The info is used by GTT mapping and bo export.
    220  */
    221 int
    222 intel_bo_set_tiling(struct intel_bo *bo,
    223                     enum intel_tiling_mode tiling,
    224                     unsigned long pitch);
    225 
    226 /**
    227  * Map \p bo for CPU access.  Recursive mapping is allowed.
    228  *
    229  * map() maps the backing store into CPU address space, cached.  It will block
    230  * if the bo is busy.  This variant allows fastest random reads and writes,
    231  * but the caller needs to handle tiling or swizzling manually if the bo is
    232  * tiled or swizzled.  If write is enabled and there is no shared last-level
    233  * cache (LLC), the CPU cache will be flushed, which is expensive.
    234  *
    235  * map_gtt() maps the bo for MMIO access, uncached but write-combined.  It
    236  * will block if the bo is busy.  This variant promises a reasonable speed for
    237  * sequential writes, but reads would be very slow.  Callers always have a
    238  * linear view of the bo.
    239  *
    240  * map_async() and map_gtt_async() work similar to map() and map_gtt()
    241  * respectively, except that they do not block.
    242  */
    243 void *
    244 intel_bo_map(struct intel_bo *bo, bool write_enable);
    245 
    246 void *
    247 intel_bo_map_async(struct intel_bo *bo);
    248 
    249 void *
    250 intel_bo_map_gtt(struct intel_bo *bo);
    251 
    252 void *
    253 intel_bo_map_gtt_async(struct intel_bo *bo);
    254 
    255 /**
    256  * Unmap \p bo.
    257  */
    258 void
    259 intel_bo_unmap(struct intel_bo *bo);
    260 
    261 /**
    262  * Write data to \p bo.
    263  */
    264 int
    265 intel_bo_pwrite(struct intel_bo *bo, unsigned long offset,
    266                 unsigned long size, const void *data);
    267 
    268 /**
    269  * Read data from the bo.
    270  */
    271 int
    272 intel_bo_pread(struct intel_bo *bo, unsigned long offset,
    273                unsigned long size, void *data);
    274 
    275 /**
    276  * Add \p target_bo to the relocation list.
    277  *
    278  * When \p bo is submitted for execution, and if \p target_bo has moved,
    279  * the kernel will patch \p bo at \p offset to \p target_bo->offset plus
    280  * \p target_offset.
    281  *
    282  * \p presumed_offset should be written to \p bo at \p offset.
    283  */
    284 int
    285 intel_bo_add_reloc(struct intel_bo *bo, uint32_t offset,
    286                    struct intel_bo *target_bo, uint32_t target_offset,
    287                    uint32_t flags, uint64_t *presumed_offset);
    288 
    289 /**
    290  * Return the current number of relocations.
    291  */
    292 int
    293 intel_bo_get_reloc_count(struct intel_bo *bo);
    294 
    295 /**
    296  * Truncate all relocations except the first \p start ones.
    297  *
    298  * Combined with \p intel_bo_get_reloc_count(), they can be used to undo the
    299  * \p intel_bo_add_reloc() calls that were just made.
    300  */
    301 void
    302 intel_bo_truncate_relocs(struct intel_bo *bo, int start);
    303 
    304 /**
    305  * Return true if \p target_bo is on the relocation list of \p bo, or on
    306  * the relocation list of some bo that is referenced by \p bo.
    307  */
    308 bool
    309 intel_bo_has_reloc(struct intel_bo *bo, struct intel_bo *target_bo);
    310 
    311 /**
    312  * Wait until \bo is idle, or \p timeout nanoseconds have passed.  A
    313  * negative timeout means to wait indefinitely.
    314  *
    315  * \return 0 only when \p bo is idle
    316  */
    317 int
    318 intel_bo_wait(struct intel_bo *bo, int64_t timeout);
    319 
    320 /**
    321  * Return true if \p bo is busy.
    322  */
    323 static inline bool
    324 intel_bo_is_busy(struct intel_bo *bo)
    325 {
    326    return (intel_bo_wait(bo, 0) != 0);
    327 }
    328 
    329 #endif /* INTEL_WINSYS_H */
    330