Tizen 2.0 Release
[profile/ivi/osmesa.git] / src / gallium / drivers / nvfx / nvfx_tex.h
1 #ifndef NVFX_TEX_H_
2 #define NVFX_TEX_H_
3
4 #include "util/u_math.h"
5 #include "pipe/p_defines.h"
6 #include "pipe/p_state.h"
7
8
9 static inline unsigned
10 nvfx_tex_wrap_mode(unsigned wrap) {
11         unsigned ret;
12
13         switch (wrap) {
14         case PIPE_TEX_WRAP_REPEAT:
15                 ret = NV30_3D_TEX_WRAP_S_REPEAT;
16                 break;
17         case PIPE_TEX_WRAP_MIRROR_REPEAT:
18                 ret = NV30_3D_TEX_WRAP_S_MIRRORED_REPEAT;
19                 break;
20         case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
21                 ret = NV30_3D_TEX_WRAP_S_CLAMP_TO_EDGE;
22                 break;
23         case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
24                 ret = NV30_3D_TEX_WRAP_S_CLAMP_TO_BORDER;
25                 break;
26         case PIPE_TEX_WRAP_CLAMP:
27                 ret = NV30_3D_TEX_WRAP_S_CLAMP;
28                 break;
29         case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
30                 ret = NV40_3D_TEX_WRAP_S_MIRROR_CLAMP_TO_EDGE;
31                 break;
32         case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
33                 ret = NV40_3D_TEX_WRAP_S_MIRROR_CLAMP_TO_BORDER;
34                 break;
35         case PIPE_TEX_WRAP_MIRROR_CLAMP:
36                 ret = NV40_3D_TEX_WRAP_S_MIRROR_CLAMP;
37                 break;
38         default:
39                 assert(0);
40                 ret = NV30_3D_TEX_WRAP_S_REPEAT;
41                 break;
42         }
43
44         return ret >> NV30_3D_TEX_WRAP_S__SHIFT;
45 }
46
47 static inline unsigned
48 nvfx_tex_wrap_compare_mode(unsigned func)
49 {
50         switch (func) {
51         case PIPE_FUNC_NEVER:
52                 return NV30_3D_TEX_WRAP_RCOMP_NEVER;
53         case PIPE_FUNC_GREATER:
54                 return NV30_3D_TEX_WRAP_RCOMP_GREATER;
55         case PIPE_FUNC_EQUAL:
56                 return NV30_3D_TEX_WRAP_RCOMP_EQUAL;
57         case PIPE_FUNC_GEQUAL:
58                 return NV30_3D_TEX_WRAP_RCOMP_GEQUAL;
59         case PIPE_FUNC_LESS:
60                 return NV30_3D_TEX_WRAP_RCOMP_LESS;
61         case PIPE_FUNC_NOTEQUAL:
62                 return NV30_3D_TEX_WRAP_RCOMP_NOTEQUAL;
63         case PIPE_FUNC_LEQUAL:
64                 return NV30_3D_TEX_WRAP_RCOMP_LEQUAL;
65         case PIPE_FUNC_ALWAYS:
66                 return NV30_3D_TEX_WRAP_RCOMP_ALWAYS;
67         default:
68                 assert(0);
69                 return 0;
70         }
71 }
72
73 static inline unsigned nvfx_tex_filter(const struct pipe_sampler_state* cso)
74 {
75         unsigned filter = 0;
76         switch (cso->mag_img_filter) {
77         case PIPE_TEX_FILTER_LINEAR:
78                 filter |= NV30_3D_TEX_FILTER_MAG_LINEAR;
79                 break;
80         case PIPE_TEX_FILTER_NEAREST:
81         default:
82                 filter |= NV30_3D_TEX_FILTER_MAG_NEAREST;
83                 break;
84         }
85
86         switch (cso->min_img_filter) {
87         case PIPE_TEX_FILTER_LINEAR:
88                 switch (cso->min_mip_filter) {
89                 case PIPE_TEX_MIPFILTER_NEAREST:
90                         filter |= NV30_3D_TEX_FILTER_MIN_LINEAR_MIPMAP_NEAREST;
91                         break;
92                 case PIPE_TEX_MIPFILTER_LINEAR:
93                         filter |= NV30_3D_TEX_FILTER_MIN_LINEAR_MIPMAP_LINEAR;
94                         break;
95                 case PIPE_TEX_MIPFILTER_NONE:
96                 default:
97                         filter |= NV30_3D_TEX_FILTER_MIN_LINEAR;
98                         break;
99                 }
100                 break;
101         case PIPE_TEX_FILTER_NEAREST:
102         default:
103                 switch (cso->min_mip_filter) {
104                 case PIPE_TEX_MIPFILTER_NEAREST:
105                         filter |= NV30_3D_TEX_FILTER_MIN_NEAREST_MIPMAP_NEAREST;
106                 break;
107                 case PIPE_TEX_MIPFILTER_LINEAR:
108                         filter |= NV30_3D_TEX_FILTER_MIN_NEAREST_MIPMAP_LINEAR;
109                         break;
110                 case PIPE_TEX_MIPFILTER_NONE:
111                 default:
112                         filter |= NV30_3D_TEX_FILTER_MIN_NEAREST;
113                         break;
114                 }
115                 break;
116         }
117         return filter;
118 }
119
120 static inline unsigned nvfx_tex_border_color(const float* border_color)
121 {
122         return ((float_to_ubyte(border_color[3]) << 24) |
123                     (float_to_ubyte(border_color[0]) << 16) |
124                     (float_to_ubyte(border_color[1]) <<  8) |
125                     (float_to_ubyte(border_color[2]) <<  0));
126 }
127
128 struct nvfx_sampler_state {
129         uint32_t fmt;
130         uint32_t wrap;
131         uint32_t en;
132         uint32_t filt;
133         uint32_t bcol;
134         uint32_t min_lod;
135         uint32_t max_lod;
136         boolean compare;
137 };
138
139 struct nvfx_sampler_view {
140         struct pipe_sampler_view base;
141         int offset;
142         uint32_t swizzle;
143         uint32_t npot_size;
144         uint32_t filt;
145         uint32_t wrap_mask;
146         uint32_t wrap;
147         uint32_t lod_offset;
148         uint32_t max_lod_limit;
149         union
150         {
151                 struct
152                 {
153                         uint32_t fmt[4]; /* nv30 has 4 entries, nv40 one */
154                         int rect;
155                 } nv30;
156                 struct
157                 {
158                         uint32_t fmt[2]; /* nv30 has 4 entries, nv40 one */
159                         uint32_t npot_size2; /* nv40 only */
160                 } nv40;
161                 uint32_t init_fmt;
162         } u;
163 };
164
165 struct nvfx_texture_format {
166         int fmt[6];
167         unsigned sign;
168         unsigned wrap;
169         unsigned char src[6];
170         unsigned char comp[6];
171 };
172
173 extern struct nvfx_texture_format nvfx_texture_formats[PIPE_FORMAT_COUNT];
174
175 #endif /* NVFX_TEX_H_ */