Merge branch 'mesa_7_7_branch'
[mesa.git] / src / gallium / drivers / nv04 / nv04_fragtex.c
1 #include "nv04_context.h"
2 #include "nouveau/nouveau_util.h"
3
4 #define _(m,tf) \
5 { \
6 PIPE_FORMAT_##m, \
7 NV04_TEXTURED_TRIANGLE_FORMAT_COLOR_##tf, \
8 }
9
10 struct nv04_texture_format {
11 uint pipe;
12 int format;
13 };
14
15 static struct nv04_texture_format
16 nv04_texture_formats[] = {
17 _(A8R8G8B8_UNORM, A8R8G8B8),
18 _(X8R8G8B8_UNORM, X8R8G8B8),
19 _(A1R5G5B5_UNORM, A1R5G5B5),
20 _(A4R4G4B4_UNORM, A4R4G4B4),
21 _(L8_UNORM, Y8 ),
22 _(A8_UNORM, Y8 ),
23 };
24
25 static uint32_t
26 nv04_fragtex_format(uint pipe_format)
27 {
28 struct nv04_texture_format *tf = nv04_texture_formats;
29 int i;
30
31 for (i=0; i< sizeof(nv04_texture_formats)/sizeof(nv04_texture_formats[0]); i++) {
32 if (tf->pipe == pipe_format)
33 return tf->format;
34 tf++;
35 }
36
37 NOUVEAU_ERR("unknown texture format %s\n", pf_name(pipe_format));
38 return 0;
39 }
40
41
42 static void
43 nv04_fragtex_build(struct nv04_context *nv04, int unit)
44 {
45 struct nv04_miptree *nv04mt = nv04->tex_miptree[unit];
46 struct pipe_texture *pt = &nv04mt->base;
47
48 switch (pt->target) {
49 case PIPE_TEXTURE_2D:
50 break;
51 default:
52 NOUVEAU_ERR("Unknown target %d\n", pt->target);
53 return;
54 }
55
56 nv04->fragtex.format = NV04_TEXTURED_TRIANGLE_FORMAT_ORIGIN_ZOH_CORNER
57 | NV04_TEXTURED_TRIANGLE_FORMAT_ORIGIN_FOH_CORNER
58 | nv04_fragtex_format(pt->format)
59 | ( (pt->last_level + 1) << NV04_TEXTURED_TRIANGLE_FORMAT_MIPMAP_LEVELS_SHIFT )
60 | ( log2i(pt->width0) << NV04_TEXTURED_TRIANGLE_FORMAT_BASE_SIZE_U_SHIFT )
61 | ( log2i(pt->height0) << NV04_TEXTURED_TRIANGLE_FORMAT_BASE_SIZE_V_SHIFT )
62 | NV04_TEXTURED_TRIANGLE_FORMAT_ADDRESSU_CLAMP_TO_EDGE
63 | NV04_TEXTURED_TRIANGLE_FORMAT_ADDRESSV_CLAMP_TO_EDGE
64 ;
65 }
66
67
68 void
69 nv04_fragtex_bind(struct nv04_context *nv04)
70 {
71 nv04_fragtex_build(nv04, 0);
72 }
73