summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/mesa/drivers/dri/i965/brw_clip.c15
-rw-r--r--src/mesa/drivers/dri/i965/brw_context.h2
-rw-r--r--src/mesa/drivers/dri/i965/brw_gs.c13
-rw-r--r--src/mesa/drivers/dri/i965/brw_sf.c13
-rw-r--r--src/mesa/drivers/dri/i965/brw_state.h21
-rw-r--r--src/mesa/drivers/dri/i965/brw_state_cache.c121
-rw-r--r--src/mesa/drivers/dri/i965/brw_vs.c13
-rw-r--r--src/mesa/drivers/dri/i965/brw_wm.c13
8 files changed, 54 insertions, 157 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_clip.c b/src/mesa/drivers/dri/i965/brw_clip.c
index 1be165cc9a1..3c175515408 100644
--- a/src/mesa/drivers/dri/i965/brw_clip.c
+++ b/src/mesa/drivers/dri/i965/brw_clip.c
@@ -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 );
diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
index 97475436160..26cd8209c65 100644
--- a/src/mesa/drivers/dri/i965/brw_context.h
+++ b/src/mesa/drivers/dri/i965/brw_context.h
@@ -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;
diff --git a/src/mesa/drivers/dri/i965/brw_gs.c b/src/mesa/drivers/dri/i965/brw_gs.c
index 14ee6767cd5..f213ae20acd 100644
--- a/src/mesa/drivers/dri/i965/brw_gs.c
+++ b/src/mesa/drivers/dri/i965/brw_gs.c
@@ -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 );
diff --git a/src/mesa/drivers/dri/i965/brw_sf.c b/src/mesa/drivers/dri/i965/brw_sf.c
index 6da155b1a9b..5a03851b8e6 100644
--- a/src/mesa/drivers/dri/i965/brw_sf.c
+++ b/src/mesa/drivers/dri/i965/brw_sf.c
@@ -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 );
diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h
index df24a8b7d98..8b9e3a4ec5d 100644
--- a/src/mesa/drivers/dri/i965/brw_state.h
+++ b/src/mesa/drivers/dri/i965/brw_state.h
@@ -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 );
diff --git a/src/mesa/drivers/dri/i965/brw_state_cache.c b/src/mesa/drivers/dri/i965/brw_state_cache.c
index c29705df036..f13a41fa7cc 100644
--- a/src/mesa/drivers/dri/i965/brw_state_cache.c
+++ b/src/mesa/drivers/dri/i965/brw_state_cache.c
@@ -31,29 +31,17 @@
/** @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);
diff --git a/src/mesa/drivers/dri/i965/brw_vs.c b/src/mesa/drivers/dri/i965/brw_vs.c
index 63ae13191f9..31a2b518c40 100644
--- a/src/mesa/drivers/dri/i965/brw_vs.c
+++ b/src/mesa/drivers/dri/i965/brw_vs.c
@@ -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);
diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c
index 4564fb6b1ad..06512de940f 100644
--- a/src/mesa/drivers/dri/i965/brw_wm.c
+++ b/src/mesa/drivers/dri/i965/brw_wm.c
@@ -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);