intel: Track named regions and make sure we only have one region per named bo
This commit is contained in:
@@ -42,6 +42,7 @@
|
|||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <main/hash.h>
|
||||||
#include "intel_context.h"
|
#include "intel_context.h"
|
||||||
#include "intel_regions.h"
|
#include "intel_regions.h"
|
||||||
#include "intel_blit.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 width, GLuint height, GLuint pitch,
|
||||||
GLuint handle, const char *name)
|
GLuint handle, const char *name)
|
||||||
{
|
{
|
||||||
struct intel_region *region;
|
struct intel_region *region, *dummy;
|
||||||
dri_bo *buffer;
|
dri_bo *buffer;
|
||||||
int ret;
|
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);
|
buffer = intel_bo_gem_create_from_name(intel->bufmgr, name, handle);
|
||||||
|
|
||||||
region = intel_region_alloc_internal(intel, cpp,
|
region = intel_region_alloc_internal(intel, cpp,
|
||||||
@@ -248,6 +263,10 @@ intel_region_alloc_for_handle(struct intel_context *intel,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
region->name = handle;
|
||||||
|
region->screen = intel->intelScreen;
|
||||||
|
_mesa_HashInsert(intel->intelScreen->named_regions, handle, region);
|
||||||
|
|
||||||
return region;
|
return region;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -287,6 +306,9 @@ intel_region_release(struct intel_region **region_handle)
|
|||||||
region->pbo = NULL;
|
region->pbo = NULL;
|
||||||
dri_bo_unreference(region->buffer);
|
dri_bo_unreference(region->buffer);
|
||||||
|
|
||||||
|
if (region->name > 0)
|
||||||
|
_mesa_HashRemove(region->screen->named_regions, region->name);
|
||||||
|
|
||||||
free(region);
|
free(region);
|
||||||
}
|
}
|
||||||
*region_handle = NULL;
|
*region_handle = NULL;
|
||||||
|
@@ -67,6 +67,9 @@ struct intel_region
|
|||||||
uint32_t tiling; /**< Which tiling mode the region is in */
|
uint32_t tiling; /**< Which tiling mode the region is in */
|
||||||
uint32_t bit_6_swizzle; /**< GEM flag for address swizzling requirement */
|
uint32_t bit_6_swizzle; /**< GEM flag for address swizzling requirement */
|
||||||
struct intel_buffer_object *pbo; /* zero-copy uploads */
|
struct intel_buffer_object *pbo; /* zero-copy uploads */
|
||||||
|
|
||||||
|
uint32_t name; /**< Global name for the bo */
|
||||||
|
struct intel_screen *screen;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@@ -29,6 +29,7 @@
|
|||||||
#include "main/context.h"
|
#include "main/context.h"
|
||||||
#include "main/framebuffer.h"
|
#include "main/framebuffer.h"
|
||||||
#include "main/renderbuffer.h"
|
#include "main/renderbuffer.h"
|
||||||
|
#include "main/hash.h"
|
||||||
|
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "xmlpool.h"
|
#include "xmlpool.h"
|
||||||
@@ -166,6 +167,11 @@ intel_get_param(__DRIscreen *psp, int param, int *value)
|
|||||||
return GL_TRUE;
|
return GL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
nop_callback(GLuint key, void *data, void *userData)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
intelDestroyScreen(__DRIscreen * sPriv)
|
intelDestroyScreen(__DRIscreen * sPriv)
|
||||||
{
|
{
|
||||||
@@ -174,6 +180,12 @@ intelDestroyScreen(__DRIscreen * sPriv)
|
|||||||
dri_bufmgr_destroy(intelScreen->bufmgr);
|
dri_bufmgr_destroy(intelScreen->bufmgr);
|
||||||
driDestroyOptionInfo(&intelScreen->optionCache);
|
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);
|
FREE(intelScreen);
|
||||||
sPriv->private = NULL;
|
sPriv->private = NULL;
|
||||||
}
|
}
|
||||||
@@ -324,6 +336,8 @@ intel_init_bufmgr(struct intel_screen *intelScreen)
|
|||||||
else
|
else
|
||||||
intelScreen->kernel_exec_fencing = GL_FALSE;
|
intelScreen->kernel_exec_fencing = GL_FALSE;
|
||||||
|
|
||||||
|
intelScreen->named_regions = _mesa_NewHashTable();
|
||||||
|
|
||||||
return GL_TRUE;
|
return GL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -47,6 +47,7 @@ struct intel_screen
|
|||||||
GLboolean no_vbo;
|
GLboolean no_vbo;
|
||||||
dri_bufmgr *bufmgr;
|
dri_bufmgr *bufmgr;
|
||||||
GLboolean kernel_exec_fencing;
|
GLboolean kernel_exec_fencing;
|
||||||
|
struct _mesa_HashTable *named_regions;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configuration cache with default values for all contexts
|
* Configuration cache with default values for all contexts
|
||||||
|
Reference in New Issue
Block a user