This is preparatory work for multiple region hashing from a single (name) key. In particular, this will be useful to lookup for a region offset by a certain amount of bytes.
Signed-off-by: Gwenole Beauchesne <gwenole.beauche...@intel.com> --- src/mesa/drivers/dri/intel/intel_regions.c | 61 +++++++++++++++++++++++++-- src/mesa/drivers/dri/intel/intel_regions.h | 8 ++++ src/mesa/drivers/dri/intel/intel_screen.c | 13 +----- 3 files changed, 66 insertions(+), 16 deletions(-) diff --git a/src/mesa/drivers/dri/intel/intel_regions.c b/src/mesa/drivers/dri/intel/intel_regions.c index 25780b9..235c2cd 100644 --- a/src/mesa/drivers/dri/intel/intel_regions.c +++ b/src/mesa/drivers/dri/intel/intel_regions.c @@ -104,7 +104,17 @@ debug_backtrace(void) #endif +/* Forward declarations */ +static struct intel_region * +intel_region_hash_lookup(struct _mesa_HashTable *h, uint32_t name); + +static void +intel_region_hash_insert(struct _mesa_HashTable *h, + struct intel_region *region); +static void +intel_region_hash_remove(struct _mesa_HashTable *h, + struct intel_region *region); /* XXX: Thread safety? */ @@ -221,8 +231,7 @@ intel_region_flink(struct intel_region *region, uint32_t *name) if (drm_intel_bo_flink(region->bo, ®ion->name)) return false; - _mesa_HashInsert(region->screen->named_regions, - region->name, region); + intel_region_hash_insert(region->screen->named_regions, region); } *name = region->name; @@ -241,7 +250,7 @@ intel_region_alloc_for_handle(struct intel_screen *screen, int ret; uint32_t bit_6_swizzle, tiling; - region = _mesa_HashLookup(screen->named_regions, handle); + region = intel_region_hash_lookup(screen->named_regions, handle); if (region != NULL) { dummy = NULL; if (region->width != width || region->height != height || @@ -274,7 +283,7 @@ intel_region_alloc_for_handle(struct intel_screen *screen, } region->name = handle; - _mesa_HashInsert(screen->named_regions, handle, region); + intel_region_hash_insert(screen->named_regions, region); return region; } @@ -316,7 +325,7 @@ intel_region_release(struct intel_region **region_handle) drm_intel_bo_unreference(region->bo); if (region->name > 0) - _mesa_HashRemove(region->screen->named_regions, region->name); + intel_region_hash_remove(region->screen->named_regions, region); free(region); } @@ -391,3 +400,45 @@ intel_region_copy(struct intel_context *intel, srcx, srcy, dstx, dsty, width, height, logicop); } + +static void +intel_region_hash_destroy_callback(GLuint key, void *data, void *userData) +{ +} + +struct _mesa_HashTable * +intel_region_hash_new(void) +{ + return _mesa_NewHashTable(); +} + +void +intel_region_hash_destroy(struct _mesa_HashTable **h_ptr) +{ + struct _mesa_HashTable * const h = *h_ptr; + + /* Some regions may still have references to them at this point, so + * flush the hash table to prevent _mesa_DeleteHashTable() from + * complaining about the hash not being empty; */ + _mesa_HashDeleteAll(h, intel_region_hash_destroy_callback, NULL); + _mesa_DeleteHashTable(h); + *h_ptr = NULL; +} + +static struct intel_region * +intel_region_hash_lookup(struct _mesa_HashTable *h, uint32_t name) +{ + return _mesa_HashLookup(h, name); +} + +static void +intel_region_hash_insert(struct _mesa_HashTable *h, struct intel_region *region) +{ + _mesa_HashInsert(h, region->name, region); +} + +static void +intel_region_hash_remove(struct _mesa_HashTable *h, struct intel_region *region) +{ + _mesa_HashRemove(h, region->name); +} diff --git a/src/mesa/drivers/dri/intel/intel_regions.h b/src/mesa/drivers/dri/intel/intel_regions.h index f1f9ae9..b5170c1 100644 --- a/src/mesa/drivers/dri/intel/intel_regions.h +++ b/src/mesa/drivers/dri/intel/intel_regions.h @@ -139,4 +139,12 @@ struct __DRIimageRec { void *data; }; +struct _mesa_HashTable; + +struct _mesa_HashTable * +intel_region_hash_new(void); + +void +intel_region_hash_destroy(struct _mesa_HashTable **h); + #endif diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c index f28619f..5f8d850 100644 --- a/src/mesa/drivers/dri/intel/intel_screen.c +++ b/src/mesa/drivers/dri/intel/intel_screen.c @@ -456,11 +456,6 @@ intel_get_boolean(__DRIscreen *psp, int param) } static void -nop_callback(GLuint key, void *data, void *userData) -{ -} - -static void intelDestroyScreen(__DRIscreen * sPriv) { struct intel_screen *intelScreen = sPriv->driverPrivate; @@ -468,11 +463,7 @@ intelDestroyScreen(__DRIscreen * sPriv) dri_bufmgr_destroy(intelScreen->bufmgr); driDestroyOptionInfo(&intelScreen->optionCache); - /* Some regions may still have references to them at this point, so - * flush the hash table to prevent _mesa_DeleteHashTable() from - * complaining about the hash not being empty; */ - _mesa_HashDeleteAll(intelScreen->named_regions, nop_callback, NULL); - _mesa_DeleteHashTable(intelScreen->named_regions); + intel_region_hash_destroy(&intelScreen->named_regions); FREE(intelScreen); sPriv->driverPrivate = NULL; @@ -678,7 +669,7 @@ intel_init_bufmgr(struct intel_screen *intelScreen) drm_intel_bufmgr_gem_enable_fenced_relocs(intelScreen->bufmgr); - intelScreen->named_regions = _mesa_NewHashTable(); + intelScreen->named_regions = intel_region_hash_new(); intelScreen->relaxed_relocations = 0; intelScreen->relaxed_relocations |= -- 1.7.5.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev