i965: Remove dead entrypoints to state cache, rename the one that's left.

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>
This commit is contained in:
Eric Anholt
2011-04-24 20:48:33 -07:00
parent acb4d5cd96
commit 3032582d03
8 changed files with 54 additions and 157 deletions
+6 -9
View 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 );
-2
View 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;
+5 -8
View 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 );
+5 -8
View 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 );
+4 -17
View 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 );
+24 -97
View File
@@ -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);
+5 -8
View 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);
+5 -8
View 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);