nv30, nv40: partially unify nv[34]0_state.c
[mesa.git] / src / gallium / drivers / nv30 / nv30_state.c
1 #include "pipe/p_state.h"
2 #include "pipe/p_defines.h"
3 #include "util/u_inlines.h"
4
5 #include "tgsi/tgsi_parse.h"
6
7 #include "nv30_context.h"
8 #include "nvfx_state.h"
9
10 static INLINE unsigned
11 wrap_mode(unsigned wrap) {
12 unsigned ret;
13
14 switch (wrap) {
15 case PIPE_TEX_WRAP_REPEAT:
16 ret = NV34TCL_TX_WRAP_S_REPEAT;
17 break;
18 case PIPE_TEX_WRAP_MIRROR_REPEAT:
19 ret = NV34TCL_TX_WRAP_S_MIRRORED_REPEAT;
20 break;
21 case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
22 ret = NV34TCL_TX_WRAP_S_CLAMP_TO_EDGE;
23 break;
24 case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
25 ret = NV34TCL_TX_WRAP_S_CLAMP_TO_BORDER;
26 break;
27 case PIPE_TEX_WRAP_CLAMP:
28 ret = NV34TCL_TX_WRAP_S_CLAMP;
29 break;
30 /* case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
31 ret = NV34TCL_TX_WRAP_S_MIRROR_CLAMP_TO_EDGE;
32 break;
33 case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
34 ret = NV34TCL_TX_WRAP_S_MIRROR_CLAMP_TO_BORDER;
35 break;
36 case PIPE_TEX_WRAP_MIRROR_CLAMP:
37 ret = NV34TCL_TX_WRAP_S_MIRROR_CLAMP;
38 break;*/
39 default:
40 NOUVEAU_ERR("unknown wrap mode: %d\n", wrap);
41 ret = NV34TCL_TX_WRAP_S_REPEAT;
42 break;
43 }
44
45 return ret >> NV34TCL_TX_WRAP_S_SHIFT;
46 }
47
48 void *
49 nv30_sampler_state_create(struct pipe_context *pipe,
50 const struct pipe_sampler_state *cso)
51 {
52 struct nvfx_sampler_state *ps;
53 uint32_t filter = 0;
54
55 ps = MALLOC(sizeof(struct nvfx_sampler_state));
56
57 ps->fmt = 0;
58 /* TODO: Not all RECTs formats have this bit set, bits 15-8 of format
59 are the tx format to use. We should store normalized coord flag
60 in sampler state structure, and set appropriate format in
61 nvxx_fragtex_build()
62 */
63 /*NV34TCL_TX_FORMAT_RECT*/
64 /*if (!cso->normalized_coords) {
65 ps->fmt |= (1<<14) ;
66 }*/
67
68 ps->wrap = ((wrap_mode(cso->wrap_s) << NV34TCL_TX_WRAP_S_SHIFT) |
69 (wrap_mode(cso->wrap_t) << NV34TCL_TX_WRAP_T_SHIFT) |
70 (wrap_mode(cso->wrap_r) << NV34TCL_TX_WRAP_R_SHIFT));
71
72 ps->en = 0;
73
74 if (cso->max_anisotropy >= 8) {
75 ps->en |= NV34TCL_TX_ENABLE_ANISO_8X;
76 } else
77 if (cso->max_anisotropy >= 4) {
78 ps->en |= NV34TCL_TX_ENABLE_ANISO_4X;
79 } else
80 if (cso->max_anisotropy >= 2) {
81 ps->en |= NV34TCL_TX_ENABLE_ANISO_2X;
82 }
83
84 switch (cso->mag_img_filter) {
85 case PIPE_TEX_FILTER_LINEAR:
86 filter |= NV34TCL_TX_FILTER_MAGNIFY_LINEAR;
87 break;
88 case PIPE_TEX_FILTER_NEAREST:
89 default:
90 filter |= NV34TCL_TX_FILTER_MAGNIFY_NEAREST;
91 break;
92 }
93
94 switch (cso->min_img_filter) {
95 case PIPE_TEX_FILTER_LINEAR:
96 switch (cso->min_mip_filter) {
97 case PIPE_TEX_MIPFILTER_NEAREST:
98 filter |= NV34TCL_TX_FILTER_MINIFY_LINEAR_MIPMAP_NEAREST;
99 break;
100 case PIPE_TEX_MIPFILTER_LINEAR:
101 filter |= NV34TCL_TX_FILTER_MINIFY_LINEAR_MIPMAP_LINEAR;
102 break;
103 case PIPE_TEX_MIPFILTER_NONE:
104 default:
105 filter |= NV34TCL_TX_FILTER_MINIFY_LINEAR;
106 break;
107 }
108 break;
109 case PIPE_TEX_FILTER_NEAREST:
110 default:
111 switch (cso->min_mip_filter) {
112 case PIPE_TEX_MIPFILTER_NEAREST:
113 filter |= NV34TCL_TX_FILTER_MINIFY_NEAREST_MIPMAP_NEAREST;
114 break;
115 case PIPE_TEX_MIPFILTER_LINEAR:
116 filter |= NV34TCL_TX_FILTER_MINIFY_NEAREST_MIPMAP_LINEAR;
117 break;
118 case PIPE_TEX_MIPFILTER_NONE:
119 default:
120 filter |= NV34TCL_TX_FILTER_MINIFY_NEAREST;
121 break;
122 }
123 break;
124 }
125
126 ps->filt = filter;
127
128 {
129 float limit;
130
131 limit = CLAMP(cso->lod_bias, -16.0, 15.0);
132 ps->filt |= (int)(cso->lod_bias * 256.0) & 0x1fff;
133
134 limit = CLAMP(cso->max_lod, 0.0, 15.0);
135 ps->en |= (int)(limit) << 14 /*NV34TCL_TX_ENABLE_MIPMAP_MAX_LOD_SHIFT*/;
136
137 limit = CLAMP(cso->min_lod, 0.0, 15.0);
138 ps->en |= (int)(limit) << 26 /*NV34TCL_TX_ENABLE_MIPMAP_MIN_LOD_SHIFT*/;
139 }
140
141 if (cso->compare_mode == PIPE_TEX_COMPARE_R_TO_TEXTURE) {
142 switch (cso->compare_func) {
143 case PIPE_FUNC_NEVER:
144 ps->wrap |= NV34TCL_TX_WRAP_RCOMP_NEVER;
145 break;
146 case PIPE_FUNC_GREATER:
147 ps->wrap |= NV34TCL_TX_WRAP_RCOMP_GREATER;
148 break;
149 case PIPE_FUNC_EQUAL:
150 ps->wrap |= NV34TCL_TX_WRAP_RCOMP_EQUAL;
151 break;
152 case PIPE_FUNC_GEQUAL:
153 ps->wrap |= NV34TCL_TX_WRAP_RCOMP_GEQUAL;
154 break;
155 case PIPE_FUNC_LESS:
156 ps->wrap |= NV34TCL_TX_WRAP_RCOMP_LESS;
157 break;
158 case PIPE_FUNC_NOTEQUAL:
159 ps->wrap |= NV34TCL_TX_WRAP_RCOMP_NOTEQUAL;
160 break;
161 case PIPE_FUNC_LEQUAL:
162 ps->wrap |= NV34TCL_TX_WRAP_RCOMP_LEQUAL;
163 break;
164 case PIPE_FUNC_ALWAYS:
165 ps->wrap |= NV34TCL_TX_WRAP_RCOMP_ALWAYS;
166 break;
167 default:
168 break;
169 }
170 }
171
172 ps->bcol = ((float_to_ubyte(cso->border_color[3]) << 24) |
173 (float_to_ubyte(cso->border_color[0]) << 16) |
174 (float_to_ubyte(cso->border_color[1]) << 8) |
175 (float_to_ubyte(cso->border_color[2]) << 0));
176
177 return (void *)ps;
178 }
179