/** @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"
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;
}
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 *
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;
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;
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;
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);
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,
}
-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;
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)
{
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);