Eric, I was hoping you could have a look at this one in particular. thanks, Kristian
2010/2/11 Kristian Høgsberg <k...@bitplanet.net>: > > Signed-off-by: Kristian Høgsberg <k...@bitplanet.net> > --- > src/mesa/drivers/dri/intel/intel_regions.c | 24 +++++++++++++++++++++++- > src/mesa/drivers/dri/intel/intel_regions.h | 3 +++ > src/mesa/drivers/dri/intel/intel_screen.c | 14 ++++++++++++++ > src/mesa/drivers/dri/intel/intel_screen.h | 1 + > 4 files changed, 41 insertions(+), 1 deletions(-) > > diff --git a/src/mesa/drivers/dri/intel/intel_regions.c > b/src/mesa/drivers/dri/intel/intel_regions.c > index e2859e4..881653f 100644 > --- a/src/mesa/drivers/dri/intel/intel_regions.c > +++ b/src/mesa/drivers/dri/intel/intel_regions.c > @@ -42,6 +42,7 @@ > #include <sys/ioctl.h> > #include <errno.h> > > +#include <main/hash.h> > #include "intel_context.h" > #include "intel_regions.h" > #include "intel_blit.h" > @@ -228,10 +229,24 @@ intel_region_alloc_for_handle(struct intel_context > *intel, > GLuint width, GLuint height, GLuint pitch, > GLuint handle, const char *name) > { > - struct intel_region *region; > + struct intel_region *region, *dummy; > dri_bo *buffer; > int ret; > > + region = _mesa_HashLookup(intel->intelScreen->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(intel->bufmgr, name, handle); > > region = intel_region_alloc_internal(intel, cpp, > @@ -248,6 +263,10 @@ intel_region_alloc_for_handle(struct intel_context > *intel, > return NULL; > } > > + region->name = handle; > + region->screen = intel->intelScreen; > + _mesa_HashInsert(intel->intelScreen->named_regions, handle, region); > + > return region; > } > > @@ -287,6 +306,9 @@ intel_region_release(struct intel_region **region_handle) > region->pbo = NULL; > dri_bo_unreference(region->buffer); > > + if (region->name > 0) > + _mesa_HashRemove(region->screen->named_regions, region->name); > + > free(region); > } > *region_handle = NULL; > diff --git a/src/mesa/drivers/dri/intel/intel_regions.h > b/src/mesa/drivers/dri/intel/intel_regions.h > index 860ae11..6d36f3d 100644 > --- a/src/mesa/drivers/dri/intel/intel_regions.h > +++ b/src/mesa/drivers/dri/intel/intel_regions.h > @@ -67,6 +67,9 @@ struct intel_region > uint32_t tiling; /**< Which tiling mode the region is in */ > uint32_t bit_6_swizzle; /**< GEM flag for address swizzling requirement */ > struct intel_buffer_object *pbo; /* zero-copy uploads */ > + > + uint32_t name; /**< Global name for the bo */ > + struct intel_screen *screen; > }; > > > diff --git a/src/mesa/drivers/dri/intel/intel_screen.c > b/src/mesa/drivers/dri/intel/intel_screen.c > index 6dc20d0..f7ce87e 100644 > --- a/src/mesa/drivers/dri/intel/intel_screen.c > +++ b/src/mesa/drivers/dri/intel/intel_screen.c > @@ -29,6 +29,7 @@ > #include "main/context.h" > #include "main/framebuffer.h" > #include "main/renderbuffer.h" > +#include "main/hash.h" > > #include "utils.h" > #include "xmlpool.h" > @@ -167,6 +168,11 @@ intel_get_param(__DRIscreen *psp, int param, int *value) > } > > static void > +nop_callback(GLuint key, void *data, void *userData) > +{ > +} > + > +static void > intelDestroyScreen(__DRIscreen * sPriv) > { > struct intel_screen *intelScreen = sPriv->private; > @@ -174,6 +180,12 @@ 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->private = NULL; > } > @@ -324,6 +336,8 @@ intel_init_bufmgr(struct intel_screen *intelScreen) > else > intelScreen->kernel_exec_fencing = GL_FALSE; > > + intelScreen->named_regions = _mesa_NewHashTable(); > + > return GL_TRUE; > } > > diff --git a/src/mesa/drivers/dri/intel/intel_screen.h > b/src/mesa/drivers/dri/intel/intel_screen.h > index c31b836..1ce476d 100644 > --- a/src/mesa/drivers/dri/intel/intel_screen.h > +++ b/src/mesa/drivers/dri/intel/intel_screen.h > @@ -47,6 +47,7 @@ struct intel_screen > GLboolean no_vbo; > dri_bufmgr *bufmgr; > GLboolean kernel_exec_fencing; > + struct _mesa_HashTable *named_regions; > > /** > * Configuration cache with default values for all contexts > -- > 1.6.5.rc2 > > > ------------------------------------------------------------------------------ > SOLARIS 10 is the OS for Data Centers - provides features such as DTrace, > Predictive Self Healing and Award Winning ZFS. Get Solaris 10 NOW > http://p.sf.net/sfu/solaris-dev2dev > _______________________________________________ > Mesa3d-dev mailing list > Mesa3d-dev@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/mesa3d-dev > ------------------------------------------------------------------------------ SOLARIS 10 is the OS for Data Centers - provides features such as DTrace, Predictive Self Healing and Award Winning ZFS. Get Solaris 10 NOW http://p.sf.net/sfu/solaris-dev2dev _______________________________________________ Mesa3d-dev mailing list Mesa3d-dev@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mesa3d-dev