mesa: Compact state key for TexEnv program cache
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 2 Sep 2009 12:11:25 +0000 (05:11 -0700)
committerBrian Paul <brianp@vmware.com>
Wed, 2 Sep 2009 14:47:47 +0000 (08:47 -0600)
By rearranging the bitfields within the key we can reduce the size
of the key from 644 to 196 bytes, reducing the cost of both the
hashing and equality tests.

src/mesa/main/texenvprogram.c

index 5913957..b16b8dd 100644 (file)
@@ -82,8 +82,8 @@ texenv_doing_secondary_color(GLcontext *ctx)
 #define DISASSEM (MESA_VERBOSE & VERBOSE_DISASSEM)
 
 struct mode_opt {
-   GLuint Source:4;  /**< SRC_x */
-   GLuint Operand:3; /**< OPR_x */
+   GLubyte Source:4;  /**< SRC_x */
+   GLubyte Operand:3; /**< OPR_x */
 };
 
 struct state_key {
@@ -103,10 +103,11 @@ struct state_key {
 
       GLuint NumArgsRGB:3;  /**< up to MAX_COMBINER_TERMS */
       GLuint ModeRGB:5;     /**< MODE_x */
-      struct mode_opt OptRGB[MAX_COMBINER_TERMS];
 
       GLuint NumArgsA:3;  /**< up to MAX_COMBINER_TERMS */
       GLuint ModeA:5;     /**< MODE_x */
+
+      struct mode_opt OptRGB[MAX_COMBINER_TERMS];
       struct mode_opt OptA[MAX_COMBINER_TERMS];
    } unit[MAX_TEXTURE_UNITS];
 };
@@ -1497,6 +1498,7 @@ _mesa_get_fixed_func_fragment_program(GLcontext *ctx)
    struct gl_fragment_program *prog;
    struct state_key key;
        
+   printf("SIZE OF KEY %d\n", sizeof(key));
    make_state_key(ctx, &key);
       
    prog = (struct gl_fragment_program *)