intel: Remove the struct intel_region reuse hash table.
authorEric Anholt <eric@anholt.net>
Sun, 27 Jan 2013 19:37:43 +0000 (05:37 +1000)
committerEric Anholt <eric@anholt.net>
Wed, 6 Mar 2013 00:02:37 +0000 (16:02 -0800)
I don't see any reason for it -- it was introduced with the DRI2
invalidate work by krh in 2010 with no explanation.  I suspect it was
something about wanting the same drm_intel_bo struct underneath multiple
openings of the BO within one process, but that's covered by libdrm at
this point.  As far as the struct region goes, it is not threadsafe, so
multiple contexts sharing a region could have mixed up the map_count and
assertion failed or worse.

Reviewed-by: Chad Versace <chad.versace@linux.intel.com>
src/mesa/drivers/dri/intel/intel_regions.c
src/mesa/drivers/dri/intel/intel_regions.h
src/mesa/drivers/dri/intel/intel_screen.c
src/mesa/drivers/dri/intel/intel_screen.h

index 7f535d7cdc41149647f9ff7888a51c77acde7b7e..049af43ca9f0bb105701c9f9c4f3d2410bcecdce 100644 (file)
@@ -183,7 +183,6 @@ intel_region_alloc_internal(struct intel_screen *screen,
    region->refcount = 1;
    region->bo = buffer;
    region->tiling = tiling;
-   region->screen = screen;
 
    _DBG("%s <-- %p\n", __FUNCTION__, region);
    return region;
@@ -225,9 +224,6 @@ intel_region_flink(struct intel_region *region, uint32_t *name)
    if (region->name == 0) {
       if (drm_intel_bo_flink(region->bo, &region->name))
         return false;
-      
-      _mesa_HashInsert(region->screen->named_regions,
-                      region->name, region);
    }
 
    *name = region->name;
@@ -241,25 +237,11 @@ intel_region_alloc_for_handle(struct intel_screen *screen,
                              GLuint width, GLuint height, GLuint pitch,
                              GLuint handle, const char *name)
 {
-   struct intel_region *region, *dummy;
+   struct intel_region *region;
    drm_intel_bo *buffer;
    int ret;
    uint32_t bit_6_swizzle, tiling;
 
-   region = _mesa_HashLookup(screen->named_regions, handle);
-   if (region != NULL) {
-      dummy = NULL;
-      if (region->width != width || region->height != height ||
-         region->cpp != cpp || region->pitch != pitch) {
-        fprintf(stderr,
-                "Region for name %d already exists but is not compatible\n",
-                handle);
-        return NULL;
-      }
-      intel_region_reference(&dummy, region);
-      return dummy;
-   }
-
    buffer = intel_bo_gem_create_from_name(screen->bufmgr, name, handle);
    if (buffer == NULL)
       return NULL;
@@ -279,7 +261,6 @@ intel_region_alloc_for_handle(struct intel_screen *screen,
    }
 
    region->name = handle;
-   _mesa_HashInsert(screen->named_regions, handle, region);
 
    return region;
 }
@@ -320,9 +301,6 @@ 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);
-
       free(region);
    }
    *region_handle = NULL;
index 93181414c913387169c5186817f80d6a39963575..750b89ba62970b802175c6c1e6f20a7156b6c7d1 100644 (file)
@@ -46,6 +46,7 @@ extern "C" {
 #endif
 
 struct intel_context;
+struct intel_screen;
 struct intel_buffer_object;
 
 /**
@@ -70,7 +71,6 @@ struct intel_region
    uint32_t tiling; /**< Which tiling mode the region is in */
 
    uint32_t name; /**< Global name for the bo */
-   struct intel_screen *screen;
 };
 
 
index 109cba8b71957322968c954c309c8b30d1c7e3ff..0d39b9d3b302ec16d314b57e7bee7fec2e8f5194 100644 (file)
@@ -680,7 +680,6 @@ intel_from_planar(__DRIimage *parent, int plane, void *loaderPrivate)
     image->region->bo = parent->region->bo;
     drm_intel_bo_reference(image->region->bo);
     image->region->tiling = parent->region->tiling;
-    image->region->screen = parent->region->screen;
     image->offset = offset;
     intel_setup_image_from_dimensions(image);
 
@@ -742,11 +741,6 @@ intel_get_boolean(__DRIscreen *psp, int param)
    return intel_get_param(psp, param, &value) && value;
 }
 
-static void
-nop_callback(GLuint key, void *data, void *userData)
-{
-}
-
 static void
 intelDestroyScreen(__DRIscreen * sPriv)
 {
@@ -755,12 +749,6 @@ 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);
-
    free(intelScreen);
    sPriv->driverPrivate = NULL;
 }
@@ -968,8 +956,6 @@ intel_init_bufmgr(struct intel_screen *intelScreen)
 
    drm_intel_bufmgr_gem_enable_fenced_relocs(intelScreen->bufmgr);
 
-   intelScreen->named_regions = _mesa_NewHashTable();
-
    intelScreen->relaxed_relocations = 0;
    intelScreen->relaxed_relocations |=
       intel_get_boolean(spriv, I915_PARAM_HAS_RELAXED_DELTA) << 0;
index b9c96be5b3938791745c2019007436253e0a4b92..7da98950aca6fbf1815a1ddd56345b0873964985 100644 (file)
@@ -67,7 +67,6 @@ struct intel_screen
 
    bool no_vbo;
    dri_bufmgr *bufmgr;
-   struct _mesa_HashTable *named_regions;
 
    /**
     * A unique ID for shader programs.