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 1be165cc9a13e5bcdda6bac19560421c9c36f63e..3c175515408b46e9060174d1facfcb26c7fa87d9 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 974754361600e3fce9a74adeaecbd1dd30b1a151..26cd8209c65e0435ff914c46c602fa6f9423ac88 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 14ee6767cd5c4a9cef2710b62aa085212cce1ae6..f213ae20acd3d7d2bc33e3d55adb844d733499e3 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 6da155b1a9b3a1ba3fdcb62c7107b7e50aa1af61..5a03851b8e6d05eb9e37df3210b92a36485fb106 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 df24a8b7d98bc1fb4883ae3e458dabf29d6ca525..8b9e3a4ec5d7799652cfe38a5fb08953ac5563b3 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 c29705df03633f9889fa1d4ba7fd803d4458572f..f13a41fa7cc09d7a00935a8cc6d9f06c130544c9 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 63ae13191f991d4be9901c46fffefe74624cae58..31a2b518c4033c0d3421c324f0c7c054fc178c85 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 4564fb6b1adf6392cde2fd395f5b99a9e6f2954d..06512de940fa0c551827500304681caace4934d4 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);