[Mesa-dev] [PATCH] llvmpipe: Optimize new fs state setup

Adam Jackson ajax at redhat.com
Wed Jun 29 10:19:10 PDT 2011


Perversely, do this by eliminating the comparison between stored and
current fs state.  On ipers, a perf trace showed try_update_scene_state
using 31% of a CPU, and 98% of that was in 'repz cmpsb', ie, the memcmp.
Taking that out takes try_update_scene_state down to 6.5% of the
profile; more importantly, ipers goes from 10 to 14fps and gears goes
from 790 to 830fps.

Signed-off-by: Adam Jackson <ajax at redhat.com>
---
 src/gallium/drivers/llvmpipe/lp_setup.c |   61 ++++++++++++++-----------------
 1 files changed, 27 insertions(+), 34 deletions(-)

diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c
index cbe06e5..9118db5 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup.c
@@ -839,42 +839,35 @@ try_update_scene_state( struct lp_setup_context *setup )
       setup->dirty |= LP_SETUP_NEW_FS;
    }
 
-
    if (setup->dirty & LP_SETUP_NEW_FS) {
-      if (!setup->fs.stored ||
-          memcmp(setup->fs.stored,
-                 &setup->fs.current,
-                 sizeof setup->fs.current) != 0)
-      {
-         struct lp_rast_state *stored;
-         uint i;
-         
-         /* The fs state that's been stored in the scene is different from
-          * the new, current state.  So allocate a new lp_rast_state object
-          * and append it to the bin's setup data buffer.
-          */
-         stored = (struct lp_rast_state *) lp_scene_alloc(scene, sizeof *stored);
-         if (!stored) {
-            assert(!new_scene);
-            return FALSE;
-         }
+      struct lp_rast_state *stored;
+      uint i;
+      
+      /* The fs state that's been stored in the scene is different from
+       * the new, current state.  So allocate a new lp_rast_state object
+       * and append it to the bin's setup data buffer.
+       */
+      stored = (struct lp_rast_state *) lp_scene_alloc(scene, sizeof *stored);
+      if (!stored) {
+         assert(!new_scene);
+         return FALSE;
+      }
 
-         memcpy(stored,
-                &setup->fs.current,
-                sizeof setup->fs.current);
-         setup->fs.stored = stored;
-         
-         /* The scene now references the textures in the rasterization
-          * state record.  Note that now.
-          */
-         for (i = 0; i < Elements(setup->fs.current_tex); i++) {
-            if (setup->fs.current_tex[i]) {
-               if (!lp_scene_add_resource_reference(scene,
-                                                    setup->fs.current_tex[i],
-                                                    new_scene)) {
-                  assert(!new_scene);
-                  return FALSE;
-               }
+      memcpy(stored,
+             &setup->fs.current,
+             sizeof setup->fs.current);
+      setup->fs.stored = stored;
+      
+      /* The scene now references the textures in the rasterization
+       * state record.  Note that now.
+       */
+      for (i = 0; i < Elements(setup->fs.current_tex); i++) {
+         if (setup->fs.current_tex[i]) {
+            if (!lp_scene_add_resource_reference(scene,
+                                                 setup->fs.current_tex[i],
+                                                 new_scene)) {
+               assert(!new_scene);
+               return FALSE;
             }
          }
       }
-- 
1.7.5.4



More information about the mesa-dev mailing list