Mesa (nvfx-next-4): nv30: partially support ARB_texture_rectangle

Luca Barbieri lb at kemper.freedesktop.org
Wed Apr 14 06:55:53 UTC 2010


Module: Mesa
Branch: nvfx-next-4
Commit: 7f744959959284922ac1304a9e826e4630c3ced7
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7f744959959284922ac1304a9e826e4630c3ced7

Author: Luca Barbieri <luca at luca-barbieri.com>
Date:   Thu Mar 11 18:06:28 2010 +0100

nv30: partially support ARB_texture_rectangle

This uses nv30's _RECT formats.

Note that power-of-two GL_TEXTURE_RECTANGLE textures are probably
broken.

---

 src/gallium/drivers/nvfx/nv30_fragtex.c |   15 +++++++++++++--
 1 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/nvfx/nv30_fragtex.c b/src/gallium/drivers/nvfx/nv30_fragtex.c
index 319f638..ed9429e 100644
--- a/src/gallium/drivers/nvfx/nv30_fragtex.c
+++ b/src/gallium/drivers/nvfx/nv30_fragtex.c
@@ -37,6 +37,7 @@ nv30_sampler_state_init(struct pipe_context *pipe,
 #define _(m,tf,ts0x,ts0y,ts0z,ts0w,ts1x,ts1y,ts1z,ts1w)                        \
 [PIPE_FORMAT_##m] = {                                                                              \
   NV34TCL_TX_FORMAT_FORMAT_##tf,                                               \
+  NV34TCL_TX_FORMAT_FORMAT_##tf##_RECT,                                               \
   (NV34TCL_TX_SWIZZLE_S0_X_##ts0x | NV34TCL_TX_SWIZZLE_S0_Y_##ts0y |           \
    NV34TCL_TX_SWIZZLE_S0_Z_##ts0z | NV34TCL_TX_SWIZZLE_S0_W_##ts0w |           \
    NV34TCL_TX_SWIZZLE_S1_X_##ts1x | NV34TCL_TX_SWIZZLE_S1_Y_##ts1y |           \
@@ -45,12 +46,17 @@ nv30_sampler_state_init(struct pipe_context *pipe,
 
 struct nv30_texture_format {
 	int     format;
+	int     rect_format;
 	int     swizzle;
 };
 
+#define NV34TCL_TX_FORMAT_FORMAT_DXT1_RECT NV34TCL_TX_FORMAT_FORMAT_DXT1
+#define NV34TCL_TX_FORMAT_FORMAT_DXT3_RECT NV34TCL_TX_FORMAT_FORMAT_DXT3
+#define NV34TCL_TX_FORMAT_FORMAT_DXT5_RECT NV34TCL_TX_FORMAT_FORMAT_DXT5
+
 static struct nv30_texture_format
 nv30_texture_formats[PIPE_FORMAT_COUNT] = {
-	[0 ... PIPE_FORMAT_COUNT - 1] = {-1, 0},
+	[0 ... PIPE_FORMAT_COUNT - 1] = {-1, 0, 0},
 	_(B8G8R8X8_UNORM, A8R8G8B8,   S1,   S1,   S1,  ONE, X, Y, Z, W),
 	_(B8G8R8A8_UNORM, A8R8G8B8,   S1,   S1,   S1,   S1, X, Y, Z, W),
 	_(B5G5R5A1_UNORM, A1R5G5B5,   S1,   S1,   S1,   S1, X, Y, Z, W),
@@ -84,7 +90,9 @@ nv30_fragtex_set(struct nvfx_context *nvfx, int unit)
 	tf = &nv30_texture_formats[pt->format];
 	assert(tf->format >= 0);
 
-	txf  = tf->format;
+	assert(!ps->fmt == !(pt->flags & NVFX_RESOURCE_FLAG_LINEAR));
+
+	txf  = (pt->flags & NVFX_RESOURCE_FLAG_LINEAR) ? tf->rect_format : tf->format;
 	txf |= ((pt->last_level>0) ? NV34TCL_TX_FORMAT_MIPMAP : 0);
 	txf |= log2i(pt->width0) << NV34TCL_TX_FORMAT_BASE_SIZE_U_SHIFT;
 	txf |= log2i(pt->height0) << NV34TCL_TX_FORMAT_BASE_SIZE_V_SHIFT;
@@ -112,6 +120,9 @@ nv30_fragtex_set(struct nvfx_context *nvfx, int unit)
 	/* FIXME: specify whether textures are swizzled or not somehow */
 	txs = tf->swizzle;
 
+	if(mt->linear_pitch)
+		txs |= mt->linear_pitch << NV34TCL_TX_SWIZZLE_RECT_PITCH_SHIFT;
+
 	MARK_RING(chan, 9, 2);
 	OUT_RING(chan, RING_3D(NV34TCL_TX_OFFSET(unit), 8));
 	OUT_RELOC(chan, bo, 0, tex_flags | NOUVEAU_BO_LOW, 0, 0);




More information about the mesa-commit mailing list