intel: Refactor use of intel_miptree_map

Move the opencoded construction and destruction of intel_miptree_map into
new functions, intel_miptree_attach_map and intel_miptree_release_map.
This patch prevents code duplication in a future commit that adds support
for mapping multisample miptrees.

Reviewed-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Chad Versace <chad.versace@linux.intel.com>
This commit is contained in:
Chad Versace 2012-07-27 19:39:10 -07:00
parent 81980958d0
commit 4c0ccc13bd

View file

@ -1448,6 +1448,52 @@ intel_miptree_unmap_depthstencil(struct intel_context *intel,
free(map->buffer);
}
/**
* Create and attach a map to the miptree at (level, slice). Return the
* attached map.
*/
static struct intel_miptree_map*
intel_miptree_attach_map(struct intel_mipmap_tree *mt,
unsigned int level,
unsigned int slice,
unsigned int x,
unsigned int y,
unsigned int w,
unsigned int h,
GLbitfield mode)
{
struct intel_miptree_map *map = calloc(1, sizeof(*map));
if (!map)
return NULL;
assert(mt->level[level].slice[slice].map == NULL);
mt->level[level].slice[slice].map = map;
map->mode = mode;
map->x = x;
map->y = y;
map->w = w;
map->h = h;
return map;
}
/**
* Release the map at (level, slice).
*/
static void
intel_miptree_release_map(struct intel_mipmap_tree *mt,
unsigned int level,
unsigned int slice)
{
struct intel_miptree_map **map;
map = &mt->level[level].slice[slice].map;
free(*map);
*map = NULL;
}
static void
intel_miptree_map_singlesample(struct intel_context *intel,
struct intel_mipmap_tree *mt,
@ -1465,21 +1511,13 @@ intel_miptree_map_singlesample(struct intel_context *intel,
assert(mt->num_samples <= 1);
map = calloc(1, sizeof(struct intel_miptree_map));
map = intel_miptree_attach_map(mt, level, slice, x, y, w, h, mode);
if (!map){
*out_ptr = NULL;
*out_stride = 0;
return;
}
assert(!mt->level[level].slice[slice].map);
mt->level[level].slice[slice].map = map;
map->mode = mode;
map->x = x;
map->y = y;
map->w = w;
map->h = h;
intel_miptree_slice_resolve_depth(intel, mt, level, slice);
if (map->mode & GL_MAP_WRITE_BIT) {
intel_miptree_slice_set_needs_hiz_resolve(mt, level, slice);
@ -1503,10 +1541,8 @@ intel_miptree_map_singlesample(struct intel_context *intel,
*out_ptr = map->ptr;
*out_stride = map->stride;
if (map->ptr == NULL) {
mt->level[level].slice[slice].map = NULL;
free(map);
}
if (map->ptr == NULL)
intel_miptree_release_map(mt, level, slice);
}
static void
@ -1537,8 +1573,7 @@ intel_miptree_unmap_singlesample(struct intel_context *intel,
intel_miptree_unmap_gtt(intel, mt, map, level, slice);
}
mt->level[level].slice[slice].map = NULL;
free(map);
intel_miptree_release_map(mt, level, slice);
}
void