1 #include "nv40_context.h"
3 #define _(m,tf,ts0x,ts0y,ts0z,ts0w,ts1x,ts1y,ts1z,ts1w) \
7 NV40TCL_TEX_FORMAT_FORMAT_##tf, \
8 (NV40TCL_TEX_SWIZZLE_S0_X_##ts0x | NV40TCL_TEX_SWIZZLE_S0_Y_##ts0y | \
9 NV40TCL_TEX_SWIZZLE_S0_Z_##ts0z | NV40TCL_TEX_SWIZZLE_S0_W_##ts0w | \
10 NV40TCL_TEX_SWIZZLE_S1_X_##ts1x | NV40TCL_TEX_SWIZZLE_S1_Y_##ts1y | \
11 NV40TCL_TEX_SWIZZLE_S1_Z_##ts1z | NV40TCL_TEX_SWIZZLE_S1_W_##ts1w), \
14 struct nv40_texture_format
{
21 static struct nv40_texture_format
22 nv40_texture_formats
[] = {
23 _(A8R8G8B8_UNORM
, A8R8G8B8
, S1
, S1
, S1
, S1
, X
, Y
, Z
, W
),
24 _(A1R5G5B5_UNORM
, A1R5G5B5
, S1
, S1
, S1
, S1
, X
, Y
, Z
, W
),
25 _(A4R4G4B4_UNORM
, A4R4G4B4
, S1
, S1
, S1
, S1
, X
, Y
, Z
, W
),
26 _(R5G6B5_UNORM
, R5G6B5
, S1
, S1
, S1
, ONE
, X
, Y
, Z
, W
),
27 _(U_L8
, L8
, S1
, S1
, S1
, ONE
, X
, X
, X
, X
),
28 _(U_A8
, L8
, ZERO
, ZERO
, ZERO
, S1
, X
, X
, X
, X
),
29 _(U_I8
, L8
, S1
, S1
, S1
, S1
, X
, X
, X
, X
),
30 _(U_A8_L8
, A8L8
, S1
, S1
, S1
, S1
, X
, X
, X
, Y
),
31 _(Z16_UNORM
, Z16
, S1
, S1
, S1
, ONE
, X
, X
, X
, X
),
32 _(Z24S8_UNORM
, Z24
, S1
, S1
, S1
, ONE
, X
, X
, X
, X
),
33 // _(RGB_DXT1 , 0x86, S1, S1, S1, ONE, X, Y, Z, W, 0x00, 0x00),
34 // _(RGBA_DXT1 , 0x86, S1, S1, S1, S1, X, Y, Z, W, 0x00, 0x00),
35 // _(RGBA_DXT3 , 0x87, S1, S1, S1, S1, X, Y, Z, W, 0x00, 0x00),
36 // _(RGBA_DXT5 , 0x88, S1, S1, S1, S1, X, Y, Z, W, 0x00, 0x00),
40 static struct nv40_texture_format
*
41 nv40_fragtex_format(uint pipe_format
)
43 struct nv40_texture_format
*tf
= nv40_texture_formats
;
46 if (tf
->pipe
== pipe_format
)
56 nv40_fragtex_build(struct nv40_context
*nv40
, int unit
)
58 struct nv40_sampler_state
*ps
= nv40
->tex_sampler
[unit
];
59 struct nv40_miptree
*nv40mt
= nv40
->tex_miptree
[unit
];
60 struct pipe_texture
*pt
= &nv40mt
->base
;
61 struct nv40_texture_format
*tf
;
62 struct nouveau_stateobj
*so
;
63 uint32_t txf
, txs
, txp
;
64 int swizzled
= 0; /*XXX: implement in region code? */
65 unsigned tex_flags
= NOUVEAU_BO_VRAM
| NOUVEAU_BO_GART
| NOUVEAU_BO_RD
;
67 tf
= nv40_fragtex_format(pt
->format
);
72 txf
|= tf
->format
| 0x8000;
73 txf
|= ((pt
->last_level
- pt
->first_level
+ 1) <<
74 NV40TCL_TEX_FORMAT_MIPMAP_COUNT_SHIFT
);
77 txf
|= NV40TCL_TEX_FORMAT_NO_BORDER
;
80 case PIPE_TEXTURE_CUBE
:
81 txf
|= NV40TCL_TEX_FORMAT_CUBIC
;
84 txf
|= NV40TCL_TEX_FORMAT_DIMS_2D
;
87 txf
|= NV40TCL_TEX_FORMAT_DIMS_3D
;
90 txf
|= NV40TCL_TEX_FORMAT_DIMS_1D
;
93 NOUVEAU_ERR("Unknown target %d\n", pt
->target
);
100 txp
= nv40mt
->level
[0].pitch
;
101 txf
|= NV40TCL_TEX_FORMAT_LINEAR
;
107 so_method(so
, nv40
->curie
, NV40TCL_TEX_OFFSET(unit
), 8);
108 so_reloc (so
, nv40mt
->buffer
, 0, tex_flags
| NOUVEAU_BO_LOW
, 0, 0);
109 so_reloc (so
, nv40mt
->buffer
, txf
, tex_flags
| NOUVEAU_BO_OR
,
110 NV40TCL_TEX_FORMAT_DMA0
, NV40TCL_TEX_FORMAT_DMA1
);
111 so_data (so
, ps
->wrap
);
112 so_data (so
, NV40TCL_TEX_ENABLE_ENABLE
| ps
->en
|
113 (0x00078000) /* mipmap related? */);
115 so_data (so
, ps
->filt
| 0x3fd6 /*voodoo*/);
116 so_data (so
, (pt
->width
[0] << NV40TCL_TEX_SIZE0_W_SHIFT
) |
118 so_data (so
, ps
->bcol
);
119 so_method(so
, nv40
->curie
, NV40TCL_TEX_SIZE1(unit
), 1);
120 so_data (so
, (pt
->depth
[0] << NV40TCL_TEX_SIZE1_DEPTH_SHIFT
) | txp
);
122 so_emit(nv40
->nvws
, so
);
123 so_ref (so
, &nv40
->so_fragtex
[unit
]);
128 nv40_fragtex_bind(struct nv40_context
*nv40
)
130 struct nv40_fragment_program
*fp
= nv40
->fragprog
.active
;
131 unsigned samplers
, unit
;
133 samplers
= nv40
->fp_samplers
& ~fp
->samplers
;
135 unit
= ffs(samplers
) - 1;
136 samplers
&= ~(1 << unit
);
138 so_ref(NULL
, &nv40
->so_fragtex
[unit
]);
139 BEGIN_RING(curie
, NV40TCL_TEX_ENABLE(unit
), 1);
143 samplers
= nv40
->dirty_samplers
& fp
->samplers
;
145 unit
= ffs(samplers
) - 1;
146 samplers
&= ~(1 << unit
);
148 nv40_fragtex_build(nv40
, unit
);
151 nv40
->fp_samplers
= fp
->samplers
;