| #include "nv04_context.h" |
| #include "nouveau/nouveau_util.h" |
| |
| #define _(m,tf) \ |
| { \ |
| PIPE_FORMAT_##m, \ |
| NV04_DX5_TEXTURED_TRIANGLE_FORMAT_COLOR_##tf, \ |
| } |
| |
| struct nv04_texture_format { |
| uint pipe; |
| int format; |
| }; |
| |
| static struct nv04_texture_format |
| nv04_texture_formats[] = { |
| _(A8R8G8B8_UNORM, A8R8G8B8), |
| _(X8R8G8B8_UNORM, X8R8G8B8), |
| _(A1R5G5B5_UNORM, A1R5G5B5), |
| _(A4R4G4B4_UNORM, A4R4G4B4), |
| _(L8_UNORM, Y8 ), |
| _(A8_UNORM, Y8 ), |
| }; |
| |
| static uint32_t |
| nv04_fragtex_format(uint pipe_format) |
| { |
| struct nv04_texture_format *tf = nv04_texture_formats; |
| int i; |
| |
| for (i=0; i< sizeof(nv04_texture_formats)/sizeof(nv04_texture_formats[0]); i++) { |
| if (tf->pipe == pipe_format) |
| return tf->format; |
| tf++; |
| } |
| |
| NOUVEAU_ERR("unknown texture format %s\n", pf_name(pipe_format)); |
| return 0; |
| } |
| |
| |
| static void |
| nv04_fragtex_build(struct nv04_context *nv04, int unit) |
| { |
| struct nv04_miptree *nv04mt = nv04->tex_miptree[unit]; |
| struct pipe_texture *pt = &nv04mt->base; |
| |
| switch (pt->target) { |
| case PIPE_TEXTURE_2D: |
| break; |
| default: |
| NOUVEAU_ERR("Unknown target %d\n", pt->target); |
| return; |
| } |
| |
| nv04->fragtex.format = NV04_DX5_TEXTURED_TRIANGLE_FORMAT_ORIGIN_ZOH_CORNER |
| | NV04_DX5_TEXTURED_TRIANGLE_FORMAT_ORIGIN_FOH_CORNER |
| | nv04_fragtex_format(pt->format) |
| | ( (pt->last_level + 1) << NV04_DX5_TEXTURED_TRIANGLE_FORMAT_MIPMAP_LEVELS_SHIFT ) |
| | ( log2i(pt->width[0]) << NV04_DX5_TEXTURED_TRIANGLE_FORMAT_BASE_SIZE_U_SHIFT ) |
| | ( log2i(pt->height[0]) << NV04_DX5_TEXTURED_TRIANGLE_FORMAT_BASE_SIZE_V_SHIFT ) |
| | NV04_DX5_TEXTURED_TRIANGLE_FORMAT_ADDRESSU_CLAMP_TO_EDGE |
| | NV04_DX5_TEXTURED_TRIANGLE_FORMAT_ADDRESSV_CLAMP_TO_EDGE |
| ; |
| } |
| |
| |
| void |
| nv04_fragtex_bind(struct nv04_context *nv04) |
| { |
| nv04_fragtex_build(nv04, 0); |
| } |
| |