i965: Remove dead entrypoints to state cache, rename the one that's left.
authorEric Anholt <eric@anholt.net>
Mon, 25 Apr 2011 03:48:33 +0000 (20:48 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 29 Apr 2011 22:27:02 +0000 (15:27 -0700)
As we expanded the usage of the state cache, it grew extra
functionality.  However, with the recent state streaming rework, we're
back to the state cache being used only for shader kernels, which is
the piece of GPU state that's actually expensive to compute again from
scratch, since it involves compiling.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_clip.c
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/brw_gs.c
src/mesa/drivers/dri/i965/brw_sf.c
src/mesa/drivers/dri/i965/brw_state.h
src/mesa/drivers/dri/i965/brw_state_cache.c
src/mesa/drivers/dri/i965/brw_vs.c
src/mesa/drivers/dri/i965/brw_wm.c

index 1be165c..3c17551 100644 (file)
@@ -144,14 +144,12 @@ static void compile_clip_prog( struct brw_context *brw,
    /* Upload
     */
    drm_intel_bo_unreference(brw->clip.prog_bo);
-   brw->clip.prog_bo = brw_upload_cache_with_auxdata(&brw->cache,
-                                                    BRW_CLIP_PROG,
-                                                    &c.key, sizeof(c.key),
-                                                    NULL, 0,
-                                                    program, program_size,
-                                                    &c.prog_data,
-                                                    sizeof(c.prog_data),
-                                                    &brw->clip.prog_data);
+   brw->clip.prog_bo = brw_upload_cache(&brw->cache,
+                                       BRW_CLIP_PROG,
+                                       &c.key, sizeof(c.key),
+                                       program, program_size,
+                                       &c.prog_data, sizeof(c.prog_data),
+                                       &brw->clip.prog_data);
 }
 
 /* Calculate interpolants for triangle and line rasterization.
@@ -270,7 +268,6 @@ static void upload_clip_prog(struct brw_context *brw)
    drm_intel_bo_unreference(brw->clip.prog_bo);
    brw->clip.prog_bo = brw_search_cache(&brw->cache, BRW_CLIP_PROG,
                                        &key, sizeof(key),
-                                       NULL, 0,
                                        &brw->clip.prog_data);
    if (brw->clip.prog_bo == NULL)
       compile_clip_prog( brw, &key );
index 9747543..26cd820 100644 (file)
@@ -338,8 +338,6 @@ struct brw_cache_item {
    GLuint hash;
    GLuint key_size;            /* for variable-sized keys */
    const void *key;
-   drm_intel_bo **reloc_bufs;
-   GLuint nr_reloc_bufs;
 
    drm_intel_bo *bo;
 
index 14ee676..f213ae2 100644 (file)
@@ -121,13 +121,11 @@ static void compile_gs_prog( struct brw_context *brw,
    /* Upload
     */
    drm_intel_bo_unreference(brw->gs.prog_bo);
-   brw->gs.prog_bo = brw_upload_cache_with_auxdata(&brw->cache, BRW_GS_PROG,
-                                                  &c.key, sizeof(c.key),
-                                                  NULL, 0,
-                                                  program, program_size,
-                                                  &c.prog_data,
-                                                  sizeof(c.prog_data),
-                                                  &brw->gs.prog_data);
+   brw->gs.prog_bo = brw_upload_cache(&brw->cache, BRW_GS_PROG,
+                                     &c.key, sizeof(c.key),
+                                     program, program_size,
+                                     &c.prog_data, sizeof(c.prog_data),
+                                     &brw->gs.prog_data);
 }
 
 static const GLenum gs_prim[GL_POLYGON+1] = {  
@@ -193,7 +191,6 @@ static void prepare_gs_prog(struct brw_context *brw)
    if (brw->gs.prog_active) {
       brw->gs.prog_bo = brw_search_cache(&brw->cache, BRW_GS_PROG,
                                         &key, sizeof(key),
-                                        NULL, 0,
                                         &brw->gs.prog_data);
       if (brw->gs.prog_bo == NULL)
         compile_gs_prog( brw, &key );
index 6da155b..5a03851 100644 (file)
@@ -119,13 +119,11 @@ static void compile_sf_prog( struct brw_context *brw,
    /* Upload
     */
    drm_intel_bo_unreference(brw->sf.prog_bo);
-   brw->sf.prog_bo = brw_upload_cache_with_auxdata(&brw->cache, BRW_SF_PROG,
-                                                  &c.key, sizeof(c.key),
-                                                  NULL, 0,
-                                                  program, program_size,
-                                                  &c.prog_data,
-                                                  sizeof(c.prog_data),
-                                                  &brw->sf.prog_data);
+   brw->sf.prog_bo = brw_upload_cache(&brw->cache, BRW_SF_PROG,
+                                     &c.key, sizeof(c.key),
+                                     program, program_size,
+                                     &c.prog_data, sizeof(c.prog_data),
+                                     &brw->sf.prog_data);
 }
 
 /* Calculate interpolants for triangle and line rasterization.
@@ -194,7 +192,6 @@ static void upload_sf_prog(struct brw_context *brw)
    drm_intel_bo_unreference(brw->sf.prog_bo);
    brw->sf.prog_bo = brw_search_cache(&brw->cache, BRW_SF_PROG,
                                      &key, sizeof(key),
-                                     NULL, 0,
                                      &brw->sf.prog_data);
    if (brw->sf.prog_bo == NULL)
       compile_sf_prog( brw, &key );
index df24a8b..8b9e3a4 100644 (file)
@@ -129,29 +129,16 @@ drm_intel_bo *brw_upload_cache(struct brw_cache *cache,
                               enum brw_cache_id cache_id,
                               const void *key,
                               GLuint key_sz,
-                              drm_intel_bo **reloc_bufs,
-                              GLuint nr_reloc_bufs,
                               const void *data,
-                              GLuint data_sz);
-
-drm_intel_bo *brw_upload_cache_with_auxdata(struct brw_cache *cache,
-                                           enum brw_cache_id cache_id,
-                                           const void *key,
-                                           GLuint key_sz,
-                                           drm_intel_bo **reloc_bufs,
-                                           GLuint nr_reloc_bufs,
-                                           const void *data,
-                                           GLuint data_sz,
-                                           const void *aux,
-                                           GLuint aux_sz,
-                                           void *aux_return);
+                              GLuint data_sz,
+                              const void *aux,
+                              GLuint aux_sz,
+                              void *aux_return);
 
 drm_intel_bo *brw_search_cache( struct brw_cache *cache,
                          enum brw_cache_id cache_id,
                          const void *key,
                          GLuint key_size,
-                         drm_intel_bo **reloc_bufs,
-                         GLuint nr_reloc_bufs,
                          void *aux_return);
 void brw_state_cache_check_size( struct brw_context *brw );
 
index c29705d..f13a41f 100644 (file)
 
 /** @file brw_state_cache.c
  *
- * This file implements a simple static state cache for 965.  The consumers
- * can query the hash table of state using a cache_id, opaque key data,
- * and list of buffers that will be used in relocations, and receive the
- * corresponding state buffer object of state (plus associated auxiliary
- * data) in return.
+ * This file implements a simple static state cache for 965.  The
+ * consumers can query the hash table of state using a cache_id,
+ * opaque key data, and receive the corresponding state buffer object
+ * of state (plus associated auxiliary data) in return.  Objects in
+ * the cache may not have relocations (pointers to other BOs) in them.
  *
- * The inner workings are a simple hash table based on a CRC of the key data.
- * The cache_id and relocation target buffers associated with the state
- * buffer are included as auxiliary key data, but are not part of the hash
- * value (this should be fixed, but will likely be fixed instead by making
- * consumers use structured keys).
+ * The inner workings are a simple hash table based on a CRC of the
+ * key data.
  *
- * Replacement is not implemented.  Instead, when the cache gets too big, at
- * a safe point (unlock) we throw out all of the cache data and let it
- * regenerate for the next rendering operation.
- *
- * The reloc_buf pointers need to be included as key data, otherwise the
- * non-unique values stuffed in the offset in key data through
- * brw_cache_data() may result in successful probe for state buffers
- * even when the buffer being referenced doesn't match.  The result would be
- * that the same state cache entry is used twice for different buffers,
- * only one of the two buffers referenced gets put into the offset, and the
- * incorrect program is run for the other instance.
+ * Replacement is not implemented.  Instead, when the cache gets too
+ * big we throw out all of the cache data and let it get regenerated.
  */
 
 #include "main/imports.h"
@@ -76,13 +64,6 @@ hash_key(struct brw_cache_item *item)
       hash = (hash << 5) | (hash >> 27);
    }
 
-   /* Include the BO pointers as key data as well */
-   ikey = (GLuint *)item->reloc_bufs;
-   for (i = 0; i < item->nr_reloc_bufs * sizeof(drm_intel_bo *) / 4; i++) {
-      hash ^= ikey[i];
-      hash = (hash << 5) | (hash >> 27);
-   }
-
    return hash;
 }
 
@@ -110,10 +91,7 @@ brw_cache_item_equals(const struct brw_cache_item *a,
    return a->cache_id == b->cache_id &&
       a->hash == b->hash &&
       a->key_size == b->key_size &&
-      (memcmp(a->key, b->key, a->key_size) == 0) &&
-      a->nr_reloc_bufs == b->nr_reloc_bufs &&
-      (memcmp(a->reloc_bufs, b->reloc_bufs,
-             a->nr_reloc_bufs * sizeof(drm_intel_bo *)) == 0);
+      (memcmp(a->key, b->key, a->key_size) == 0);
 }
 
 static struct brw_cache_item *
@@ -170,9 +148,7 @@ rehash(struct brw_cache *cache)
 drm_intel_bo *
 brw_search_cache(struct brw_cache *cache,
                  enum brw_cache_id cache_id,
-                 const void *key,
-                 GLuint key_size,
-                 drm_intel_bo **reloc_bufs, GLuint nr_reloc_bufs,
+                 const void *key, GLuint key_size,
                  void *aux_return)
 {
    struct brw_cache_item *item;
@@ -182,8 +158,6 @@ brw_search_cache(struct brw_cache *cache,
    lookup.cache_id = cache_id;
    lookup.key = key;
    lookup.key_size = key_size;
-   lookup.reloc_bufs = reloc_bufs;
-   lookup.nr_reloc_bufs = nr_reloc_bufs;
    hash = hash_key(&lookup);
    lookup.hash = hash;
 
@@ -203,30 +177,24 @@ brw_search_cache(struct brw_cache *cache,
 
 
 drm_intel_bo *
-brw_upload_cache_with_auxdata(struct brw_cache *cache,
-                             enum brw_cache_id cache_id,
-                             const void *key,
-                             GLuint key_size,
-                             drm_intel_bo **reloc_bufs,
-                             GLuint nr_reloc_bufs,
-                             const void *data,
-                             GLuint data_size,
-                             const void *aux,
-                             GLuint aux_size,
-                             void *aux_return)
+brw_upload_cache(struct brw_cache *cache,
+                enum brw_cache_id cache_id,
+                const void *key,
+                GLuint key_size,
+                const void *data,
+                GLuint data_size,
+                const void *aux,
+                GLuint aux_size,
+                void *aux_return)
 {
    struct brw_cache_item *item = CALLOC_STRUCT(brw_cache_item);
    GLuint hash;
-   GLuint relocs_size = nr_reloc_bufs * sizeof(drm_intel_bo *);
    void *tmp;
    drm_intel_bo *bo;
-   int i;
 
    item->cache_id = cache_id;
    item->key = key;
    item->key_size = key_size;
-   item->reloc_bufs = reloc_bufs;
-   item->nr_reloc_bufs = nr_reloc_bufs;
    hash = hash_key(item);
    item->hash = hash;
 
@@ -235,19 +203,13 @@ brw_upload_cache_with_auxdata(struct brw_cache *cache,
                           cache->name[cache_id], data_size, 1 << 6);
 
 
-   /* Set up the memory containing the key, aux_data, and reloc_bufs */
-   tmp = malloc(key_size + aux_size + relocs_size);
+   /* Set up the memory containing the key and aux_data */
+   tmp = malloc(key_size + aux_size);
 
    memcpy(tmp, key, key_size);
    memcpy(tmp + key_size, aux, aux_size);
-   memcpy(tmp + key_size + aux_size, reloc_bufs, relocs_size);
-   for (i = 0; i < nr_reloc_bufs; i++) {
-      if (reloc_bufs[i] != NULL)
-        drm_intel_bo_reference(reloc_bufs[i]);
-   }
 
    item->key = tmp;
-   item->reloc_bufs = tmp + key_size + aux_size;
 
    item->bo = bo;
    drm_intel_bo_reference(bo);
@@ -276,30 +238,6 @@ brw_upload_cache_with_auxdata(struct brw_cache *cache,
    return bo;
 }
 
-drm_intel_bo *
-brw_upload_cache(struct brw_cache *cache,
-                enum brw_cache_id cache_id,
-                const void *key,
-                GLuint key_size,
-                drm_intel_bo **reloc_bufs,
-                GLuint nr_reloc_bufs,
-                const void *data,
-                GLuint data_size)
-{
-   return brw_upload_cache_with_auxdata(cache, cache_id,
-                                       key, key_size,
-                                       reloc_bufs, nr_reloc_bufs,
-                                       data, data_size,
-                                       NULL, 0,
-                                       NULL);
-}
-
-enum pool_type {
-   DW_SURFACE_STATE,
-   DW_GENERAL_STATE
-};
-
-
 static void
 brw_init_cache_id(struct brw_cache *cache,
                   const char *name,
@@ -309,8 +247,8 @@ brw_init_cache_id(struct brw_cache *cache,
 }
 
 
-static void
-brw_init_non_surface_cache(struct brw_context *brw)
+void
+brw_init_caches(struct brw_context *brw)
 {
    struct brw_cache *cache = &brw->cache;
 
@@ -348,13 +286,6 @@ brw_init_non_surface_cache(struct brw_context *brw)
    brw_init_cache_id(cache, "DEPTH_STENCIL_STATE", BRW_DEPTH_STENCIL_STATE);
 }
 
-void
-brw_init_caches(struct brw_context *brw)
-{
-   brw_init_non_surface_cache(brw);
-}
-
-
 static void
 brw_clear_cache(struct brw_context *brw, struct brw_cache *cache)
 {
@@ -365,11 +296,7 @@ brw_clear_cache(struct brw_context *brw, struct brw_cache *cache)
 
    for (i = 0; i < cache->size; i++) {
       for (c = cache->items[i]; c; c = next) {
-        int j;
-
         next = c->next;
-        for (j = 0; j < c->nr_reloc_bufs; j++)
-           drm_intel_bo_unreference(c->reloc_bufs[j]);
         drm_intel_bo_unreference(c->bo);
         free((void *)c->key);
         free(c);
index 63ae131..31a2b51 100644 (file)
@@ -103,13 +103,11 @@ static void do_vs_prog( struct brw_context *brw,
    aux_size += c.vp->program.Base.Parameters->NumParameters;
 
    drm_intel_bo_unreference(brw->vs.prog_bo);
-   brw->vs.prog_bo = brw_upload_cache_with_auxdata(&brw->cache, BRW_VS_PROG,
-                                                  &c.key, sizeof(c.key),
-                                                  NULL, 0,
-                                                  program, program_size,
-                                                  &c.prog_data,
-                                                  aux_size,
-                                                  &brw->vs.prog_data);
+   brw->vs.prog_bo = brw_upload_cache(&brw->cache, BRW_VS_PROG,
+                                     &c.key, sizeof(c.key),
+                                     program, program_size,
+                                     &c.prog_data, aux_size,
+                                     &brw->vs.prog_data);
 }
 
 
@@ -148,7 +146,6 @@ static void brw_upload_vs_prog(struct brw_context *brw)
    drm_intel_bo_unreference(brw->vs.prog_bo);
    brw->vs.prog_bo = brw_search_cache(&brw->cache, BRW_VS_PROG,
                                      &key, sizeof(key),
-                                     NULL, 0,
                                      &brw->vs.prog_data);
    if (brw->vs.prog_bo == NULL)
       do_vs_prog(brw, vp, &key);
index 4564fb6..06512de 100644 (file)
@@ -268,13 +268,11 @@ static void do_wm_prog( struct brw_context *brw,
    program = brw_get_program(&c->func, &program_size);
 
    drm_intel_bo_unreference(brw->wm.prog_bo);
-   brw->wm.prog_bo = brw_upload_cache_with_auxdata(&brw->cache, BRW_WM_PROG,
-                                                  &c->key, sizeof(c->key),
-                                                  NULL, 0,
-                                                  program, program_size,
-                                                  &c->prog_data,
-                                                  sizeof(c->prog_data),
-                                                  &brw->wm.prog_data);
+   brw->wm.prog_bo = brw_upload_cache(&brw->cache, BRW_WM_PROG,
+                                     &c->key, sizeof(c->key),
+                                     program, program_size,
+                                     &c->prog_data, sizeof(c->prog_data),
+                                     &brw->wm.prog_data);
 }
 
 
@@ -470,7 +468,6 @@ static void brw_prepare_wm_prog(struct brw_context *brw)
    drm_intel_bo_unreference(brw->wm.prog_bo);
    brw->wm.prog_bo = brw_search_cache(&brw->cache, BRW_WM_PROG,
                                      &key, sizeof(key),
-                                     NULL, 0,
                                      &brw->wm.prog_data);
    if (brw->wm.prog_bo == NULL)
       do_wm_prog(brw, fp, &key);