summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/nouveau/nv50/nv50_resource.h
blob: 5d03925b0d05df9616716d792e26918bb3340b68 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164

#ifndef __NV50_RESOURCE_H__
#define __NV50_RESOURCE_H__

#include "util/u_transfer.h"
#include "util/list.h"

#include "nouveau_winsys.h"
#include "nouveau_buffer.h"

#ifndef __NVC0_RESOURCE_H__ /* make sure we don't use these in nvc0: */

void
nv50_init_resource_functions(struct pipe_context *pcontext);

void
nv50_screen_init_resource_functions(struct pipe_screen *pscreen);

#define NV50_RESOURCE_FLAG_VIDEO (NOUVEAU_RESOURCE_FLAG_DRV_PRIV << 0)
#define NV50_RESOURCE_FLAG_NOALLOC (NOUVEAU_RESOURCE_FLAG_DRV_PRIV << 1)

#define NV50_TILE_SHIFT_X(m) 6
#define NV50_TILE_SHIFT_Y(m) ((((m) >> 4) & 0xf) + 2)
#define NV50_TILE_SHIFT_Z(m) ((((m) >> 8) & 0xf) + 0)

#define NV50_TILE_SIZE_X(m) 64
#define NV50_TILE_SIZE_Y(m) ( 4 << (((m) >> 4) & 0xf))
#define NV50_TILE_SIZE_Z(m) ( 1 << (((m) >> 8) & 0xf))

#define NV50_TILE_SIZE_2D(m) (NV50_TILE_SIZE_X(m) << NV50_TILE_SHIFT_Y(m))

#define NV50_TILE_SIZE(m) (NV50_TILE_SIZE_2D(m) << NV50_TILE_SHIFT_Z(m))

#endif /* __NVC0_RESOURCE_H__ */

uint32_t
nv50_tex_choose_tile_dims_helper(unsigned nx, unsigned ny, unsigned nz,
                                 bool is_3d);

struct nv50_miptree_level {
   uint32_t offset;
   uint32_t pitch;
   uint32_t tile_mode;
};

#define NV50_MAX_TEXTURE_LEVELS 16

struct nv50_miptree {
   struct nv04_resource base;
   struct nv50_miptree_level level[NV50_MAX_TEXTURE_LEVELS];
   uint32_t total_size;
   uint32_t layer_stride;
   bool layout_3d; /* true if layer count varies with mip level */
   uint8_t ms_x;      /* log2 of number of samples in x/y dimension */
   uint8_t ms_y;
   uint8_t ms_mode;
};

static inline struct nv50_miptree *
nv50_miptree(struct pipe_resource *pt)
{
   return (struct nv50_miptree *)pt;
}


#define NV50_TEXVIEW_SCALED_COORDS     (1 << 0)
#define NV50_TEXVIEW_FILTER_MSAA8      (1 << 1)
#define NV50_TEXVIEW_ACCESS_RESOLVE    (1 << 2)


/* Internal functions:
 */
bool
nv50_miptree_init_layout_linear(struct nv50_miptree *mt, unsigned pitch_align);

struct pipe_resource *
nv50_miptree_create(struct pipe_screen *pscreen,
                    const struct pipe_resource *tmp);

void
nv50_miptree_destroy(struct pipe_screen *pscreen, struct pipe_resource *pt);

struct pipe_resource *
nv50_miptree_from_handle(struct pipe_screen *pscreen,
                         const struct pipe_resource *template,
                         struct winsys_handle *whandle);

boolean
nv50_miptree_get_handle(struct pipe_screen *pscreen,
                        struct pipe_resource *pt,
                        struct winsys_handle *whandle);

struct nv50_surface {
   struct pipe_surface base;
   uint32_t offset;
   uint32_t width;
   uint16_t height;
   uint16_t depth;
};

static inline struct nv50_surface *
nv50_surface(struct pipe_surface *ps)
{
   return (struct nv50_surface *)ps;
}

static inline enum pipe_format
nv50_zs_to_s_format(enum pipe_format format)
{
   switch (format) {
   case PIPE_FORMAT_Z24_UNORM_S8_UINT: return PIPE_FORMAT_X24S8_UINT;
   case PIPE_FORMAT_S8_UINT_Z24_UNORM: return PIPE_FORMAT_S8X24_UINT;
   case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: return PIPE_FORMAT_X32_S8X24_UINT;
   default:
      return format;
   }
}

#ifndef __NVC0_RESOURCE_H__

unsigned
nv50_mt_zslice_offset(const struct nv50_miptree *mt, unsigned l, unsigned z);

struct pipe_surface *
nv50_miptree_surface_new(struct pipe_context *,
                         struct pipe_resource *,
                         const struct pipe_surface *templ);

void *
nv50_miptree_transfer_map(struct pipe_context *pctx,
                          struct pipe_resource *res,
                          unsigned level,
                          unsigned usage,
                          const struct pipe_box *box,
                          struct pipe_transfer **ptransfer);
void
nv50_miptree_transfer_unmap(struct pipe_context *pcontext,
                            struct pipe_transfer *ptx);

#endif /* __NVC0_RESOURCE_H__ */

struct nv50_surface *
nv50_surface_from_miptree(struct nv50_miptree *mt,
                          const struct pipe_surface *templ);

struct pipe_surface *
nv50_surface_from_buffer(struct pipe_context *pipe,
                         struct pipe_resource *pt,
                         const struct pipe_surface *templ);

void
nv50_surface_destroy(struct pipe_context *, struct pipe_surface *);

void
nv50_invalidate_resource(struct pipe_context *, struct pipe_resource *);

void
nv50_clear_texture(struct pipe_context *pipe,
                   struct pipe_resource *res,
                   unsigned level,
                   const struct pipe_box *box,
                   const void *data);

#endif /* __NV50_RESOURCE_H__ */