1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
#include "nv20_context.h"
#include "nouveau/nouveau_util.h"
#define _(m,tf) \
{ \
TRUE, \
PIPE_FORMAT_##m, \
NV20TCL_TX_FORMAT_FORMAT_##tf, \
}
struct nv20_texture_format {
boolean defined;
uint pipe;
int format;
};
static struct nv20_texture_format
nv20_texture_formats[] = {
_(A8R8G8B8_UNORM, A8R8G8B8),
_(A1R5G5B5_UNORM, A1R5G5B5),
_(A4R4G4B4_UNORM, A4R4G4B4),
_(L8_UNORM , L8 ),
_(A8_UNORM , A8 ),
_(A8L8_UNORM , A8L8 ),
/* _(RGB_DXT1 , DXT1, ), */
/* _(RGBA_DXT1 , DXT1, ), */
/* _(RGBA_DXT3 , DXT3, ), */
/* _(RGBA_DXT5 , DXT5, ), */
{},
};
static struct nv20_texture_format *
nv20_fragtex_format(uint pipe_format)
{
struct nv20_texture_format *tf = nv20_texture_formats;
while (tf->defined) {
if (tf->pipe == pipe_format)
return tf;
tf++;
}
return NULL;
}
static void
nv20_fragtex_build(struct nv20_context *nv20, int unit)
{
#if 0
struct nv20_sampler_state *ps = nv20->tex_sampler[unit];
struct nv20_miptree *nv20mt = nv20->tex_miptree[unit];
struct pipe_texture *pt = &nv20mt->base;
struct nv20_texture_format *tf;
uint32_t txf, txs, txp;
tf = nv20_fragtex_format(pt->format);
if (!tf || !tf->defined) {
NOUVEAU_ERR("Unsupported texture format: 0x%x\n", pt->format);
return;
}
txf = tf->format << 8;
txf |= (pt->last_level + 1) << 16;
txf |= log2i(pt->width0) << 20;
txf |= log2i(pt->height0) << 24;
txf |= log2i(pt->depth0) << 28;
txf |= 8;
switch (pt->target) {
case PIPE_TEXTURE_CUBE:
txf |= NV10TCL_TX_FORMAT_CUBE_MAP;
/* fall-through */
case PIPE_TEXTURE_2D:
txf |= (2<<4);
break;
case PIPE_TEXTURE_1D:
txf |= (1<<4);
break;
default:
NOUVEAU_ERR("Unknown target %d\n", pt->target);
return;
}
BEGIN_RING(kelvin, NV10TCL_TX_OFFSET(unit), 8);
OUT_RELOCl(nv20mt->buffer, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_GART | NOUVEAU_BO_RD);
OUT_RELOCd(nv20mt->buffer,txf,NOUVEAU_BO_VRAM | NOUVEAU_BO_GART | NOUVEAU_BO_OR | NOUVEAU_BO_RD, 1/*VRAM*/,2/*TT*/);
OUT_RING (ps->wrap);
OUT_RING (0x40000000); /* enable */
OUT_RING (txs);
OUT_RING (ps->filt | 0x2000 /* magic */);
OUT_RING ((pt->width0 << 16) | pt->height0);
OUT_RING (ps->bcol);
#endif
}
void
nv20_fragtex_bind(struct nv20_context *nv20)
{
#if 0
struct nv20_fragment_program *fp = nv20->fragprog.active;
unsigned samplers, unit;
samplers = nv20->fp_samplers & ~fp->samplers;
while (samplers) {
unit = ffs(samplers) - 1;
samplers &= ~(1 << unit);
BEGIN_RING(kelvin, NV10TCL_TX_ENABLE(unit), 1);
OUT_RING (0);
}
samplers = nv20->dirty_samplers & fp->samplers;
while (samplers) {
unit = ffs(samplers) - 1;
samplers &= ~(1 << unit);
nv20_fragtex_build(nv20, unit);
}
nv20->fp_samplers = fp->samplers;
#endif
}
|