#include "nv04_context.h" static INLINE int log2i(int i) { int r = 0; if (i & 0xffff0000) { i >>= 16; r += 16; } if (i & 0x0000ff00) { i >>= 8; r += 8; } if (i & 0x000000f0) { i >>= 4; r += 4; } if (i & 0x0000000c) { i >>= 2; r += 2; } if (i & 0x00000002) { r += 1; } return r; } #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; char fs[128]; 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++; } pf_sprint_name(fs, pipe_format); NOUVEAU_ERR("unknown texture format %s\n", fs); 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); }