Merge remote branch 'upstream/gallium-0.2' into nouveau-gallium-0.2
[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 int i;
55
56 for (i=0; i< sizeof(nv04_texture_formats)/sizeof(nv04_texture_formats[0]); i++) {
57 if (tf->pipe == pipe_format)
58 return tf->format;
59 tf++;
60 }
61
62 NOUVEAU_ERR("unknown texture format %s\n", pf_name(pipe_format));
63 return 0;
64 }
65
66
67 static void
68 nv04_fragtex_build(struct nv04_context *nv04, int unit)
69 {
70 struct nv04_miptree *nv04mt = nv04->tex_miptree[unit];
71 struct pipe_texture *pt = &nv04mt->base;
72
73 switch (pt->target) {
74 case PIPE_TEXTURE_2D:
75 break;
76 default:
77 NOUVEAU_ERR("Unknown target %d\n", pt->target);
78 return;
79 }
80
81 nv04->fragtex.format = NV04_DX5_TEXTURED_TRIANGLE_FORMAT_ORIGIN_ZOH_CORNER
82 | NV04_DX5_TEXTURED_TRIANGLE_FORMAT_ORIGIN_FOH_CORNER
83 | nv04_fragtex_format(pt->format)
84 | ( (pt->last_level + 1) << NV04_DX5_TEXTURED_TRIANGLE_FORMAT_MIPMAP_LEVELS_SHIFT )
85 | ( log2i(pt->width[0]) << NV04_DX5_TEXTURED_TRIANGLE_FORMAT_BASE_SIZE_U_SHIFT )
86 | ( log2i(pt->height[0]) << NV04_DX5_TEXTURED_TRIANGLE_FORMAT_BASE_SIZE_V_SHIFT )
87 | NV04_DX5_TEXTURED_TRIANGLE_FORMAT_ADDRESSU_CLAMP_TO_EDGE
88 | NV04_DX5_TEXTURED_TRIANGLE_FORMAT_ADDRESSV_CLAMP_TO_EDGE
89 ;
90 }
91
92
93 void
94 nv04_fragtex_bind(struct nv04_context *nv04)
95 {
96 nv04_fragtex_build(nv04, 0);
97 }
98