1 #include "nv30_context.h"
3 static INLINE
int log2i(int i
)
29 #define _(m,tf,ts0x,ts0y,ts0z,ts0w,ts1x,ts1y,ts1z,ts1w) \
33 NV34TCL_TX_FORMAT_FORMAT_##tf, \
34 (NV34TCL_TX_SWIZZLE_S0_X_##ts0x | NV34TCL_TX_SWIZZLE_S0_Y_##ts0y | \
35 NV34TCL_TX_SWIZZLE_S0_Z_##ts0z | NV34TCL_TX_SWIZZLE_S0_W_##ts0w | \
36 NV34TCL_TX_SWIZZLE_S1_X_##ts1x | NV34TCL_TX_SWIZZLE_S1_Y_##ts1y | \
37 NV34TCL_TX_SWIZZLE_S1_Z_##ts1z | NV34TCL_TX_SWIZZLE_S1_W_##ts1w), \
40 struct nv30_texture_format
{
47 static struct nv30_texture_format
48 nv30_texture_formats
[] = {
49 _(A8R8G8B8_UNORM
, A8R8G8B8
, S1
, S1
, S1
, S1
, X
, Y
, Z
, W
),
50 _(A1R5G5B5_UNORM
, A1R5G5B5
, S1
, S1
, S1
, S1
, X
, Y
, Z
, W
),
51 _(A4R4G4B4_UNORM
, A4R4G4B4
, S1
, S1
, S1
, S1
, X
, Y
, Z
, W
),
52 // _(R5G6B5_UNORM , R5G6B5 , S1, S1, S1, ONE, X, Y, Z, W),
53 _(L8_UNORM
, L8
, S1
, S1
, S1
, ONE
, X
, X
, X
, X
),
54 _(A8_UNORM
, L8
, ZERO
, ZERO
, ZERO
, S1
, X
, X
, X
, X
),
55 _(I8_UNORM
, L8
, S1
, S1
, S1
, S1
, X
, X
, X
, X
),
56 _(A8L8_UNORM
, A8L8
, S1
, S1
, S1
, S1
, X
, X
, X
, Y
),
57 // _(Z16_UNORM , Z16 , S1, S1, S1, ONE, X, X, X, X),
58 // _(Z24S8_UNORM , Z24 , S1, S1, S1, ONE, X, X, X, X),
59 // _(RGB_DXT1 , 0x86, S1, S1, S1, ONE, X, Y, Z, W, 0x00, 0x00),
60 // _(RGBA_DXT1 , 0x86, S1, S1, S1, S1, X, Y, Z, W, 0x00, 0x00),
61 // _(RGBA_DXT3 , 0x87, S1, S1, S1, S1, X, Y, Z, W, 0x00, 0x00),
62 // _(RGBA_DXT5 , 0x88, S1, S1, S1, S1, X, Y, Z, W, 0x00, 0x00),
66 static struct nv30_texture_format
*
67 nv30_fragtex_format(uint pipe_format
)
69 struct nv30_texture_format
*tf
= nv30_texture_formats
;
72 if (tf
->pipe
== pipe_format
)
82 nv30_fragtex_build(struct nv30_context
*nv30
, int unit
)
84 struct nv30_sampler_state
*ps
= nv30
->tex_sampler
[unit
];
85 struct nv30_miptree
*nv30mt
= nv30
->tex_miptree
[unit
];
86 struct pipe_texture
*pt
= &nv30mt
->base
;
87 struct nv30_texture_format
*tf
;
88 uint32_t txf
, txs
, txp
;
89 int swizzled
= 0; /*XXX: implement in region code? */
91 tf
= nv30_fragtex_format(pt
->format
);
92 if (!tf
|| !tf
->defined
) {
93 NOUVEAU_ERR("Unsupported texture format: 0x%x\n", pt
->format
);
97 txf
= tf
->format
<< 8;
98 txf
|= (pt
->last_level
+ 1) << 16;
99 txf
|= log2i(pt
->width
[0]) << 20;
100 txf
|= log2i(pt
->height
[0]) << 24;
101 txf
|= log2i(pt
->depth
[0]) << 28;
104 switch (pt
->target
) {
105 /* case PIPE_TEXTURE_CUBE:
106 txf |= NV34TCL_TEX_FORMAT_CUBIC;*/
108 case PIPE_TEXTURE_2D
:
111 case PIPE_TEXTURE_3D
:
114 case PIPE_TEXTURE_1D
:
118 NOUVEAU_ERR("Unknown target %d\n", pt
->target
);
124 BEGIN_RING(rankine
, NV34TCL_TX_OFFSET(unit
), 8);
125 OUT_RELOCl(nv30mt
->buffer
, 0, NOUVEAU_BO_VRAM
| NOUVEAU_BO_GART
| NOUVEAU_BO_RD
);
126 OUT_RELOCd(nv30mt
->buffer
,txf
,NOUVEAU_BO_VRAM
| NOUVEAU_BO_GART
| NOUVEAU_BO_OR
| NOUVEAU_BO_RD
, 1/*VRAM*/,2/*TT*/);
128 OUT_RING (0x40000000); /* enable */
130 OUT_RING (ps
->filt
| 0x2000 /* magic */);
131 OUT_RING ((pt
->width
[0] << 16) | pt
->height
[0]);
136 nv30_fragtex_bind(struct nv30_context
*nv30
)
138 struct nv30_fragment_program
*fp
= nv30
->fragprog
.active
;
139 unsigned samplers
, unit
;
141 samplers
= nv30
->fp_samplers
& ~fp
->samplers
;
143 unit
= ffs(samplers
) - 1;
144 samplers
&= ~(1 << unit
);
146 BEGIN_RING(rankine
, NV34TCL_TX_ENABLE(unit
), 1);
150 samplers
= nv30
->dirty_samplers
& fp
->samplers
;
152 unit
= ffs(samplers
) - 1;
153 samplers
&= ~(1 << unit
);
155 nv30_fragtex_build(nv30
, unit
);
158 nv30
->fp_samplers
= fp
->samplers
;