r300g: add support for 3D NPOT textures without mipmapping
authorMarek Olšák <maraeo@gmail.com>
Sun, 29 Aug 2010 01:48:42 +0000 (03:48 +0200)
committerMarek Olšák <maraeo@gmail.com>
Tue, 28 Sep 2010 03:34:51 +0000 (05:34 +0200)
commit13359e6a4b732335cdd8da48276960d0b176ffe3
tree33bc93ae9493c374d132c08402b0ba26f8299a97
parent7128e1625bea502b9bf083f14606d679c90222a6
r300g: add support for 3D NPOT textures without mipmapping

The driver actually creates a 3D texture aligned to POT and does all
the magic with texture coordinates in the fragment shader. It first
emulates REPEAT and MIRRORED wrap modes in the fragment shader to get
the coordinates into the range [0, 1]. (already done for 2D NPOT)
Then it scales them to get the coordinates of the NPOT subtexture.

NPOT textures are now less of a lie and we can at least display
something meaningful even for the 3D ones.

Supported wrap modes:
- REPEAT
- MIRRORED_REPEAT
- CLAMP_TO_EDGE (NEAREST filtering only)
- MIRROR_CLAMP_TO_EDGE (NEAREST filtering only)
- The behavior of other CLAMP modes is undefined on borders, but they usually
  give results very close to CLAMP_TO_EDGE with mirroring working perfectly.

This fixes:
- piglit/fbo-3d
- piglit/tex3d-npot
src/gallium/drivers/r300/r300_context.h
src/gallium/drivers/r300/r300_emit.c
src/gallium/drivers/r300/r300_fs.c
src/gallium/drivers/r300/r300_texture.c
src/gallium/drivers/r300/r300_texture_desc.c
src/mesa/drivers/dri/r300/compiler/radeon_code.h
src/mesa/drivers/dri/r300/compiler/radeon_program_tex.c