1 #include "nv10_context.h"
3 static INLINE
int log2i(int i
)
33 NV10TCL_TX_FORMAT_FORMAT_##tf, \
36 struct nv10_texture_format
{
42 static struct nv10_texture_format
43 nv10_texture_formats
[] = {
44 _(A8R8G8B8_UNORM
, A8R8G8B8
),
45 _(A1R5G5B5_UNORM
, A1R5G5B5
),
46 _(A4R4G4B4_UNORM
, A4R4G4B4
),
50 // _(RGB_DXT1 , DXT1, ),
51 // _(RGBA_DXT1 , DXT1, ),
52 // _(RGBA_DXT3 , DXT3, ),
53 // _(RGBA_DXT5 , DXT5, ),
57 static struct nv10_texture_format
*
58 nv10_fragtex_format(uint pipe_format
)
60 struct nv10_texture_format
*tf
= nv10_texture_formats
;
63 if (tf
->pipe
== pipe_format
)
73 nv10_fragtex_build(struct nv10_context
*nv10
, int unit
)
75 struct nv10_sampler_state
*ps
= nv10
->tex_sampler
[unit
];
76 struct nv10_miptree
*nv10mt
= nv10
->tex_miptree
[unit
];
77 struct pipe_texture
*pt
= &nv10mt
->base
;
78 struct nv10_texture_format
*tf
;
79 uint32_t txf
, txs
, txp
;
81 tf
= nv10_fragtex_format(pt
->format
);
82 if (!tf
|| !tf
->defined
) {
83 NOUVEAU_ERR("Unsupported texture format: 0x%x\n", pt
->format
);
87 txf
= tf
->format
<< 8;
88 txf
|= (pt
->last_level
+ 1) << 16;
89 txf
|= log2i(pt
->width
[0]) << 20;
90 txf
|= log2i(pt
->height
[0]) << 24;
91 txf
|= log2i(pt
->depth
[0]) << 28;
95 case PIPE_TEXTURE_CUBE
:
96 txf
|= NV10TCL_TX_FORMAT_CUBE_MAP
;
101 case PIPE_TEXTURE_1D
:
105 NOUVEAU_ERR("Unknown target %d\n", pt
->target
);
109 BEGIN_RING(celsius
, NV10TCL_TX_OFFSET(unit
), 8);
110 OUT_RELOCl(nv10mt
->buffer
, 0, NOUVEAU_BO_VRAM
| NOUVEAU_BO_GART
| NOUVEAU_BO_RD
);
111 OUT_RELOCd(nv10mt
->buffer
,txf
,NOUVEAU_BO_VRAM
| NOUVEAU_BO_GART
| NOUVEAU_BO_OR
| NOUVEAU_BO_RD
, 1/*VRAM*/,2/*TT*/);
113 OUT_RING (0x40000000); /* enable */
115 OUT_RING (ps
->filt
| 0x2000 /* magic */);
116 OUT_RING ((pt
->width
[0] << 16) | pt
->height
[0]);
121 nv10_fragtex_bind(struct nv10_context
*nv10
)
123 struct nv10_fragment_program
*fp
= nv10
->fragprog
.active
;
124 unsigned samplers
, unit
;
126 samplers
= nv10
->fp_samplers
& ~fp
->samplers
;
128 unit
= ffs(samplers
) - 1;
129 samplers
&= ~(1 << unit
);
131 BEGIN_RING(celsius
, NV10TCL_TX_ENABLE(unit
), 1);
135 samplers
= nv10
->dirty_samplers
& fp
->samplers
;
137 unit
= ffs(samplers
) - 1;
138 samplers
&= ~(1 << unit
);
140 nv10_fragtex_build(nv10
, unit
);
143 nv10
->fp_samplers
= fp
->samplers
;