Mesa (nvfx-next-6): nvfx: optimize fragtex format lookup

Luca Barbieri lb at kemper.freedesktop.org
Sun Apr 18 14:25:33 UTC 2010


Module: Mesa
Branch: nvfx-next-6
Commit: 8fbb0ea9dfc4aaae422796efd373e92f3e7301da
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=8fbb0ea9dfc4aaae422796efd373e92f3e7301da

Author: Luca Barbieri <luca at luca-barbieri.com>
Date:   Tue Feb 23 12:47:45 2010 +0100

nvfx: optimize fragtex format lookup

Use an array indexed by the pipe format instead of doing a linear scan.

---

 src/gallium/drivers/nvfx/nv30_fragtex.c |   30 +++++-------------------------
 src/gallium/drivers/nvfx/nv40_fragtex.c |   30 +++++-------------------------
 2 files changed, 10 insertions(+), 50 deletions(-)

diff --git a/src/gallium/drivers/nvfx/nv30_fragtex.c b/src/gallium/drivers/nvfx/nv30_fragtex.c
index 4828a04..319f638 100644
--- a/src/gallium/drivers/nvfx/nv30_fragtex.c
+++ b/src/gallium/drivers/nvfx/nv30_fragtex.c
@@ -35,9 +35,7 @@ nv30_sampler_state_init(struct pipe_context *pipe,
 }
 
 #define _(m,tf,ts0x,ts0y,ts0z,ts0w,ts1x,ts1y,ts1z,ts1w)                        \
-{                                                                              \
-  TRUE,                                                                        \
-  PIPE_FORMAT_##m,                                                             \
+[PIPE_FORMAT_##m] = {                                                                              \
   NV34TCL_TX_FORMAT_FORMAT_##tf,                                               \
   (NV34TCL_TX_SWIZZLE_S0_X_##ts0x | NV34TCL_TX_SWIZZLE_S0_Y_##ts0y |           \
    NV34TCL_TX_SWIZZLE_S0_Z_##ts0z | NV34TCL_TX_SWIZZLE_S0_W_##ts0w |           \
@@ -46,14 +44,13 @@ nv30_sampler_state_init(struct pipe_context *pipe,
 }
 
 struct nv30_texture_format {
-	boolean defined;
-	uint	pipe;
 	int     format;
 	int     swizzle;
 };
 
 static struct nv30_texture_format
-nv30_texture_formats[] = {
+nv30_texture_formats[PIPE_FORMAT_COUNT] = {
+	[0 ... PIPE_FORMAT_COUNT - 1] = {-1, 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),
@@ -72,22 +69,6 @@ nv30_texture_formats[] = {
 	{},
 };
 
-static struct nv30_texture_format *
-nv30_fragtex_format(uint pipe_format)
-{
-	struct nv30_texture_format *tf = nv30_texture_formats;
-
-	while (tf->defined) {
-		if (tf->pipe == pipe_format)
-			return tf;
-		tf++;
-	}
-
-	NOUVEAU_ERR("unknown texture format %s\n", util_format_name(pipe_format));
-	return NULL;
-}
-
-
 void
 nv30_fragtex_set(struct nvfx_context *nvfx, int unit)
 {
@@ -100,9 +81,8 @@ nv30_fragtex_set(struct nvfx_context *nvfx, int unit)
 	uint32_t txf, txs;
 	unsigned tex_flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_GART | NOUVEAU_BO_RD;
 
-	tf = nv30_fragtex_format(pt->format);
-	if (!tf)
-		return;
+	tf = &nv30_texture_formats[pt->format];
+	assert(tf->format >= 0);
 
 	txf  = tf->format;
 	txf |= ((pt->last_level>0) ? NV34TCL_TX_FORMAT_MIPMAP : 0);
diff --git a/src/gallium/drivers/nvfx/nv40_fragtex.c b/src/gallium/drivers/nvfx/nv40_fragtex.c
index 289070e..7825fbb 100644
--- a/src/gallium/drivers/nvfx/nv40_fragtex.c
+++ b/src/gallium/drivers/nvfx/nv40_fragtex.c
@@ -49,9 +49,7 @@ nv40_sampler_state_init(struct pipe_context *pipe,
 }
 
 #define _(m,tf,ts0x,ts0y,ts0z,ts0w,ts1x,ts1y,ts1z,ts1w,sx,sy,sz,sw)            \
-{                                                                              \
-  TRUE,                                                                        \
-  PIPE_FORMAT_##m,                                                             \
+[PIPE_FORMAT_##m] = {                                                                              \
   NV40TCL_TEX_FORMAT_FORMAT_##tf,                                              \
   (NV34TCL_TX_SWIZZLE_S0_X_##ts0x | NV34TCL_TX_SWIZZLE_S0_Y_##ts0y |         \
    NV34TCL_TX_SWIZZLE_S0_Z_##ts0z | NV34TCL_TX_SWIZZLE_S0_W_##ts0w |         \
@@ -62,15 +60,14 @@ nv40_sampler_state_init(struct pipe_context *pipe,
 }
 
 struct nv40_texture_format {
-	boolean defined;
-	uint	pipe;
 	int     format;
 	int     swizzle;
 	int     sign;
 };
 
 static struct nv40_texture_format
-nv40_texture_formats[] = {
+nv40_texture_formats[PIPE_FORMAT_COUNT] = {
+	[0 ... PIPE_FORMAT_COUNT - 1] = {-1, 0, 0},
 	_(B8G8R8X8_UNORM, A8R8G8B8,   S1,   S1,   S1,  ONE, X, Y, Z, W, 0, 0, 0, 0),
 	_(B8G8R8A8_UNORM, A8R8G8B8,   S1,   S1,   S1,   S1, X, Y, Z, W, 0, 0, 0, 0),
 	_(B5G5R5A1_UNORM, A1R5G5B5,   S1,   S1,   S1,   S1, X, Y, Z, W, 0, 0, 0, 0),
@@ -90,22 +87,6 @@ nv40_texture_formats[] = {
 	{},
 };
 
-static struct nv40_texture_format *
-nv40_fragtex_format(uint pipe_format)
-{
-	struct nv40_texture_format *tf = nv40_texture_formats;
-
-	while (tf->defined) {
-		if (tf->pipe == pipe_format)
-			return tf;
-		tf++;
-	}
-
-	NOUVEAU_ERR("unknown texture format %s\n", util_format_name(pipe_format));
-	return NULL;
-}
-
-
 void
 nv40_fragtex_set(struct nvfx_context *nvfx, int unit)
 {
@@ -119,9 +100,8 @@ nv40_fragtex_set(struct nvfx_context *nvfx, int unit)
 	uint32_t txf, txs, txp;
 	unsigned tex_flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_GART | NOUVEAU_BO_RD;
 
-	tf = nv40_fragtex_format(pt->format);
-	if (!tf)
-		assert(0);
+	tf = &nv40_texture_formats[pt->format];
+	assert(tf->format >= 0);
 
 	txf  = ps->fmt;
 	txf |= tf->format | 0x8000;




More information about the mesa-commit mailing list