Home | History | Annotate | Download | only in nv50
      1 
      2 #ifndef __NV50_RESOURCE_H__
      3 #define __NV50_RESOURCE_H__
      4 
      5 #include "util/u_transfer.h"
      6 #include "util/list.h"
      7 
      8 #include "nouveau_winsys.h"
      9 #include "nouveau_buffer.h"
     10 
     11 #ifndef __NVC0_RESOURCE_H__ /* make sure we don't use these in nvc0: */
     12 
     13 void
     14 nv50_init_resource_functions(struct pipe_context *pcontext);
     15 
     16 void
     17 nv50_screen_init_resource_functions(struct pipe_screen *pscreen);
     18 
     19 #define NV50_RESOURCE_FLAG_VIDEO (NOUVEAU_RESOURCE_FLAG_DRV_PRIV << 0)
     20 #define NV50_RESOURCE_FLAG_NOALLOC (NOUVEAU_RESOURCE_FLAG_DRV_PRIV << 1)
     21 
     22 #define NV50_TILE_SHIFT_X(m) 6
     23 #define NV50_TILE_SHIFT_Y(m) ((((m) >> 4) & 0xf) + 2)
     24 #define NV50_TILE_SHIFT_Z(m) ((((m) >> 8) & 0xf) + 0)
     25 
     26 #define NV50_TILE_SIZE_X(m) 64
     27 #define NV50_TILE_SIZE_Y(m) ( 4 << (((m) >> 4) & 0xf))
     28 #define NV50_TILE_SIZE_Z(m) ( 1 << (((m) >> 8) & 0xf))
     29 
     30 #define NV50_TILE_SIZE_2D(m) (NV50_TILE_SIZE_X(m) << NV50_TILE_SHIFT_Y(m))
     31 
     32 #define NV50_TILE_SIZE(m) (NV50_TILE_SIZE_2D(m) << NV50_TILE_SHIFT_Z(m))
     33 
     34 #endif /* __NVC0_RESOURCE_H__ */
     35 
     36 uint32_t
     37 nv50_tex_choose_tile_dims_helper(unsigned nx, unsigned ny, unsigned nz,
     38                                  bool is_3d);
     39 
     40 struct nv50_miptree_level {
     41    uint32_t offset;
     42    uint32_t pitch;
     43    uint32_t tile_mode;
     44 };
     45 
     46 #define NV50_MAX_TEXTURE_LEVELS 16
     47 
     48 struct nv50_miptree {
     49    struct nv04_resource base;
     50    struct nv50_miptree_level level[NV50_MAX_TEXTURE_LEVELS];
     51    uint32_t total_size;
     52    uint32_t layer_stride;
     53    bool layout_3d; /* true if layer count varies with mip level */
     54    uint8_t ms_x;      /* log2 of number of samples in x/y dimension */
     55    uint8_t ms_y;
     56    uint8_t ms_mode;
     57 };
     58 
     59 static inline struct nv50_miptree *
     60 nv50_miptree(struct pipe_resource *pt)
     61 {
     62    return (struct nv50_miptree *)pt;
     63 }
     64 
     65 
     66 #define NV50_TEXVIEW_SCALED_COORDS     (1 << 0)
     67 #define NV50_TEXVIEW_FILTER_MSAA8      (1 << 1)
     68 #define NV50_TEXVIEW_ACCESS_RESOLVE    (1 << 2)
     69 
     70 
     71 /* Internal functions:
     72  */
     73 bool
     74 nv50_miptree_init_layout_linear(struct nv50_miptree *mt, unsigned pitch_align);
     75 
     76 struct pipe_resource *
     77 nv50_miptree_create(struct pipe_screen *pscreen,
     78                     const struct pipe_resource *tmp);
     79 
     80 void
     81 nv50_miptree_destroy(struct pipe_screen *pscreen, struct pipe_resource *pt);
     82 
     83 struct pipe_resource *
     84 nv50_miptree_from_handle(struct pipe_screen *pscreen,
     85                          const struct pipe_resource *template,
     86                          struct winsys_handle *whandle);
     87 
     88 boolean
     89 nv50_miptree_get_handle(struct pipe_screen *pscreen,
     90                         struct pipe_resource *pt,
     91                         struct winsys_handle *whandle);
     92 
     93 struct nv50_surface {
     94    struct pipe_surface base;
     95    uint32_t offset;
     96    uint32_t width;
     97    uint16_t height;
     98    uint16_t depth;
     99 };
    100 
    101 static inline struct nv50_surface *
    102 nv50_surface(struct pipe_surface *ps)
    103 {
    104    return (struct nv50_surface *)ps;
    105 }
    106 
    107 static inline enum pipe_format
    108 nv50_zs_to_s_format(enum pipe_format format)
    109 {
    110    switch (format) {
    111    case PIPE_FORMAT_Z24_UNORM_S8_UINT: return PIPE_FORMAT_X24S8_UINT;
    112    case PIPE_FORMAT_S8_UINT_Z24_UNORM: return PIPE_FORMAT_S8X24_UINT;
    113    case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: return PIPE_FORMAT_X32_S8X24_UINT;
    114    default:
    115       return format;
    116    }
    117 }
    118 
    119 #ifndef __NVC0_RESOURCE_H__
    120 
    121 unsigned
    122 nv50_mt_zslice_offset(const struct nv50_miptree *mt, unsigned l, unsigned z);
    123 
    124 struct pipe_surface *
    125 nv50_miptree_surface_new(struct pipe_context *,
    126                          struct pipe_resource *,
    127                          const struct pipe_surface *templ);
    128 
    129 void *
    130 nv50_miptree_transfer_map(struct pipe_context *pctx,
    131                           struct pipe_resource *res,
    132                           unsigned level,
    133                           unsigned usage,
    134                           const struct pipe_box *box,
    135                           struct pipe_transfer **ptransfer);
    136 void
    137 nv50_miptree_transfer_unmap(struct pipe_context *pcontext,
    138                             struct pipe_transfer *ptx);
    139 
    140 #endif /* __NVC0_RESOURCE_H__ */
    141 
    142 struct nv50_surface *
    143 nv50_surface_from_miptree(struct nv50_miptree *mt,
    144                           const struct pipe_surface *templ);
    145 
    146 struct pipe_surface *
    147 nv50_surface_from_buffer(struct pipe_context *pipe,
    148                          struct pipe_resource *pt,
    149                          const struct pipe_surface *templ);
    150 
    151 void
    152 nv50_surface_destroy(struct pipe_context *, struct pipe_surface *);
    153 
    154 void
    155 nv50_invalidate_resource(struct pipe_context *, struct pipe_resource *);
    156 
    157 void
    158 nv50_clear_texture(struct pipe_context *pipe,
    159                    struct pipe_resource *res,
    160                    unsigned level,
    161                    const struct pipe_box *box,
    162                    const void *data);
    163 
    164 #endif /* __NV50_RESOURCE_H__ */
    165