diff options
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_clip.c | 15 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_context.h | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_gs.c | 13 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_sf.c | 13 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_state.h | 21 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_state_cache.c | 121 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vs.c | 13 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_wm.c | 13 |
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); |