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