Merge remote branch 'upstream/gallium-0.1' into nouveau-gallium-0.1
[mesa.git] / src / gallium / drivers / nv04 / nv04_fragtex.c
1 #include "nv04_context.h"
2
3 static INLINE int log2i(int i)
4 {
5 int r = 0;
6
7 if (i & 0xffff0000) {
8 i >>= 16;
9 r += 16;
10 }
11 if (i & 0x0000ff00) {
12 i >>= 8;
13 r += 8;
14 }
15 if (i & 0x000000f0) {
16 i >>= 4;
17 r += 4;
18 }
19 if (i & 0x0000000c) {
20 i >>= 2;
21 r += 2;
22 }
23 if (i & 0x00000002) {
24 r += 1;
25 }
26 return r;
27 }
28
29 #define _(m,tf) \
30 { \
31 PIPE_FORMAT_##m, \
32 NV04_DX5_TEXTURED_TRIANGLE_FORMAT_COLOR_##tf, \
33 }
34
35 struct nv04_texture_format {
36 uint pipe;
37 int format;
38 };
39
40 static struct nv04_texture_format
41 nv04_texture_formats[] = {
42 _(A8R8G8B8_UNORM, A8R8G8B8),
43 _(X8R8G8B8_UNORM, X8R8G8B8),
44 _(A1R5G5B5_UNORM, A1R5G5B5),
45 _(A4R4G4B4_UNORM, A4R4G4B4),
46 _(L8_UNORM, Y8 ),
47 _(A8_UNORM, Y8 ),
48 };
49
50 static uint32_t
51 nv04_fragtex_format(uint pipe_format)
52 {
53 struct nv04_texture_format *tf = nv04_texture_formats;
54 char fs[128];
55 int i;
56
57 for (i=0; i< sizeof(nv04_texture_formats)/sizeof(nv04_texture_formats[0]); i++) {
58 if (tf->pipe == pipe_format)
59 return tf->format;
60 tf++;
61 }
62
63 pf_sprint_name(fs, pipe_format);
64 NOUVEAU_ERR("unknown texture format %s\n", fs);
65 return 0;
66 }
67
68
69 static void
70 nv04_fragtex_build(struct nv04_context *nv04, int unit)
71 {
72 struct nv04_miptree *nv04mt = nv04->tex_miptree[unit];
73 struct pipe_texture *pt = &nv04mt->base;
74
75 switch (pt->target) {
76 case PIPE_TEXTURE_2D:
77 break;
78 default:
79 NOUVEAU_ERR("Unknown target %d\n", pt->target);
80 return;
81 }
82
83 nv04->fragtex.format = NV04_DX5_TEXTURED_TRIANGLE_FORMAT_ORIGIN_ZOH_CORNER
84 | NV04_DX5_TEXTURED_TRIANGLE_FORMAT_ORIGIN_FOH_CORNER
85 | nv04_fragtex_format(pt->format)
86 | ( (pt->last_level + 1) << NV04_DX5_TEXTURED_TRIANGLE_FORMAT_MIPMAP_LEVELS_SHIFT )
87 | ( log2i(pt->width[0]) << NV04_DX5_TEXTURED_TRIANGLE_FORMAT_BASE_SIZE_U_SHIFT )
88 | ( log2i(pt->height[0]) << NV04_DX5_TEXTURED_TRIANGLE_FORMAT_BASE_SIZE_V_SHIFT )
89 | NV04_DX5_TEXTURED_TRIANGLE_FORMAT_ADDRESSU_CLAMP_TO_EDGE
90 | NV04_DX5_TEXTURED_TRIANGLE_FORMAT_ADDRESSV_CLAMP_TO_EDGE
91 ;
92 }
93
94
95 void
96 nv04_fragtex_bind(struct nv04_context *nv04)
97 {
98 nv04_fragtex_build(nv04, 0);
99 }
100