Home | History | Annotate | Download | only in radeon
      1 /*
      2  * Copyright  2008 Jrme Glisse
      3  * All Rights Reserved.
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining
      6  * a copy of this software and associated documentation files (the
      7  * "Software"), to deal in the Software without restriction, including
      8  * without limitation the rights to use, copy, modify, merge, publish,
      9  * distribute, sub license, and/or sell copies of the Software, and to
     10  * permit persons to whom the Software is furnished to do so, subject to
     11  * the following conditions:
     12  *
     13  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     14  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
     15  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     16  * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS
     17  * AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     19  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
     20  * USE OR OTHER DEALINGS IN THE SOFTWARE.
     21  *
     22  * The above copyright notice and this permission notice (including the
     23  * next paragraph) shall be included in all copies or substantial portions
     24  * of the Software.
     25  */
     26 /*
     27  * Authors:
     28  *      Jrme Glisse <glisse (at) freedesktop.org>
     29  */
     30 #ifndef RADEON_BO_H
     31 #define RADEON_BO_H
     32 
     33 #include <stdio.h>
     34 #include <stdint.h>
     35 #include "radeon_track.h"
     36 
     37 /* bo object */
     38 #define RADEON_BO_FLAGS_MACRO_TILE  1
     39 #define RADEON_BO_FLAGS_MICRO_TILE  2
     40 
     41 struct radeon_bo_manager;
     42 
     43 struct radeon_bo {
     44     uint32_t                    alignment;
     45     uint32_t                    handle;
     46     uint32_t                    size;
     47     uint32_t                    domains;
     48     uint32_t                    flags;
     49     unsigned                    cref;
     50 #ifdef RADEON_BO_TRACK
     51     struct radeon_track         *track;
     52 #endif
     53     void                        *ptr;
     54     struct radeon_bo_manager    *bom;
     55     uint32_t                    space_accounted;
     56 };
     57 
     58 /* bo functions */
     59 struct radeon_bo_funcs {
     60     struct radeon_bo *(*bo_open)(struct radeon_bo_manager *bom,
     61                                  uint32_t handle,
     62                                  uint32_t size,
     63                                  uint32_t alignment,
     64                                  uint32_t domains,
     65                                  uint32_t flags);
     66     void (*bo_ref)(struct radeon_bo *bo);
     67     struct radeon_bo *(*bo_unref)(struct radeon_bo *bo);
     68     int (*bo_map)(struct radeon_bo *bo, int write);
     69     int (*bo_unmap)(struct radeon_bo *bo);
     70     int (*bo_wait)(struct radeon_bo *bo);
     71     int (*bo_is_static)(struct radeon_bo *bo);
     72     int (*bo_set_tiling)(struct radeon_bo *bo, uint32_t tiling_flags,
     73 			  uint32_t pitch);
     74     int (*bo_get_tiling)(struct radeon_bo *bo, uint32_t *tiling_flags,
     75 			  uint32_t *pitch);
     76     int (*bo_is_busy)(struct radeon_bo *bo, uint32_t *domain);
     77 };
     78 
     79 struct radeon_bo_manager {
     80     struct radeon_bo_funcs  *funcs;
     81     int                     fd;
     82     struct radeon_tracker   tracker;
     83 };
     84 
     85 static inline void _radeon_bo_debug(struct radeon_bo *bo,
     86                                     const char *op,
     87                                     const char *file,
     88                                     const char *func,
     89                                     int line)
     90 {
     91     fprintf(stderr, "%s %p 0x%08X 0x%08X 0x%08X [%s %s %d]\n",
     92             op, bo, bo->handle, bo->size, bo->cref, file, func, line);
     93 }
     94 
     95 static inline struct radeon_bo *_radeon_bo_open(struct radeon_bo_manager *bom,
     96                                                 uint32_t handle,
     97                                                 uint32_t size,
     98                                                 uint32_t alignment,
     99                                                 uint32_t domains,
    100                                                 uint32_t flags,
    101                                                 const char *file,
    102                                                 const char *func,
    103                                                 int line)
    104 {
    105     struct radeon_bo *bo;
    106 
    107     bo = bom->funcs->bo_open(bom, handle, size, alignment, domains, flags);
    108 #ifdef RADEON_BO_TRACK
    109     if (bo) {
    110         bo->track = radeon_tracker_add_track(&bom->tracker, bo->handle);
    111         radeon_track_add_event(bo->track, file, func, "open", line);
    112     }
    113 #endif
    114     return bo;
    115 }
    116 
    117 static inline void _radeon_bo_ref(struct radeon_bo *bo,
    118                                   const char *file,
    119                                   const char *func,
    120                                   int line)
    121 {
    122     bo->cref++;
    123 #ifdef RADEON_BO_TRACK
    124     radeon_track_add_event(bo->track, file, func, "ref", line);
    125 #endif
    126     bo->bom->funcs->bo_ref(bo);
    127 }
    128 
    129 static inline struct radeon_bo *_radeon_bo_unref(struct radeon_bo *bo,
    130                                                  const char *file,
    131                                                  const char *func,
    132                                                  int line)
    133 {
    134     bo->cref--;
    135 #ifdef RADEON_BO_TRACK
    136     radeon_track_add_event(bo->track, file, func, "unref", line);
    137     if (bo->cref <= 0) {
    138         radeon_tracker_remove_track(&bo->bom->tracker, bo->track);
    139         bo->track = NULL;
    140     }
    141 #endif
    142     return bo->bom->funcs->bo_unref(bo);
    143 }
    144 
    145 static inline int _radeon_bo_map(struct radeon_bo *bo,
    146                                  int write,
    147                                  const char *file,
    148                                  const char *func,
    149                                  int line)
    150 {
    151     return bo->bom->funcs->bo_map(bo, write);
    152 }
    153 
    154 static inline int _radeon_bo_unmap(struct radeon_bo *bo,
    155                                    const char *file,
    156                                    const char *func,
    157                                    int line)
    158 {
    159     return bo->bom->funcs->bo_unmap(bo);
    160 }
    161 
    162 static inline int _radeon_bo_wait(struct radeon_bo *bo,
    163                                   const char *file,
    164                                   const char *func,
    165                                   int line)
    166 {
    167     return bo->bom->funcs->bo_wait(bo);
    168 }
    169 
    170 static inline int _radeon_bo_is_busy(struct radeon_bo *bo,
    171 				     uint32_t *domain,
    172                                      const char *file,
    173                                      const char *func,
    174                                      int line)
    175 {
    176     return bo->bom->funcs->bo_is_busy(bo, domain);
    177 }
    178 
    179 static inline int radeon_bo_set_tiling(struct radeon_bo *bo,
    180 				       uint32_t tiling_flags, uint32_t pitch)
    181 {
    182     return bo->bom->funcs->bo_set_tiling(bo, tiling_flags, pitch);
    183 }
    184 
    185 static inline int radeon_bo_get_tiling(struct radeon_bo *bo,
    186 				       uint32_t *tiling_flags, uint32_t *pitch)
    187 {
    188     return bo->bom->funcs->bo_get_tiling(bo, tiling_flags, pitch);
    189 }
    190 
    191 static inline int radeon_bo_is_static(struct radeon_bo *bo)
    192 {
    193     if (bo->bom->funcs->bo_is_static)
    194 	return bo->bom->funcs->bo_is_static(bo);
    195     return 0;
    196 }
    197 
    198 #define radeon_bo_open(bom, h, s, a, d, f)\
    199     _radeon_bo_open(bom, h, s, a, d, f, __FILE__, __FUNCTION__, __LINE__)
    200 #define radeon_bo_ref(bo)\
    201     _radeon_bo_ref(bo, __FILE__, __FUNCTION__, __LINE__)
    202 #define radeon_bo_unref(bo)\
    203     _radeon_bo_unref(bo, __FILE__, __FUNCTION__, __LINE__)
    204 #define radeon_bo_map(bo, w)\
    205     _radeon_bo_map(bo, w, __FILE__, __FUNCTION__, __LINE__)
    206 #define radeon_bo_unmap(bo)\
    207     _radeon_bo_unmap(bo, __FILE__, __FUNCTION__, __LINE__)
    208 #define radeon_bo_debug(bo, opcode)\
    209     _radeon_bo_debug(bo, opcode, __FILE__, __FUNCTION__, __LINE__)
    210 #define radeon_bo_wait(bo) \
    211     _radeon_bo_wait(bo, __FILE__, __func__, __LINE__)
    212 #define radeon_bo_is_busy(bo, domain) \
    213     _radeon_bo_is_busy(bo, domain, __FILE__, __func__, __LINE__)
    214 
    215 #endif
    216